From 18b41f47f397300b1782a5ee29a0591f177dd0c4 Mon Sep 17 00:00:00 2001 From: Li Ry Date: Sun, 25 May 2014 00:34:10 +0200 Subject: [PATCH 0001/1191] md package tunning --- pom.xml | 11 ++ src/main/java/com/gooddata/md/Attribute.java | 32 ++++- .../com/gooddata/md/AttributeDisplayForm.java | 7 +- .../java/com/gooddata/md/DisplayForm.java | 49 +++++-- src/main/java/com/gooddata/md/Entry.java | 47 +++--- src/main/java/com/gooddata/md/Expression.java | 34 +++++ src/main/java/com/gooddata/md/Fact.java | 33 +++-- src/main/java/com/gooddata/md/Key.java | 1 + src/main/java/com/gooddata/md/Meta.java | 51 ++++--- .../java/com/gooddata/md/MetadataService.java | 117 +++++++++++++-- src/main/java/com/gooddata/md/Metric.java | 16 ++- .../gooddata/md/NonUniqueObjException.java | 7 + src/main/java/com/gooddata/md/Obj.java | 77 +++++++++- .../com/gooddata/md/ObjCreateException.java | 19 +++ .../com/gooddata/md/ObjNotFoundException.java | 16 ++- src/main/java/com/gooddata/md/Query.java | 18 ++- src/main/java/com/gooddata/md/Queryable.java | 2 +- .../java/com/gooddata/md/Restriction.java | 20 ++- ...ttributeItem.java => AttributeInGrid.java} | 35 +++-- .../java/com/gooddata/md/report/Grid.java | 32 +++-- .../md/report/{Item.java => GridElement.java} | 13 +- ....java => GridReportDefinitionContent.java} | 20 ++- .../md/report/OneNumberReportDefinition.java | 32 ----- .../OneNumberReportDefinitionContent.java | 74 ++++++++++ .../java/com/gooddata/md/report/Report.java | 32 ++++- .../gooddata/md/report/ReportDefinition.java | 30 ++-- .../md/report/ReportDefinitionContent.java | 27 ++-- .../com/gooddata/report/ReportService.java | 3 +- src/test/java/com/gooddata/Example.java | 2 +- src/test/java/com/gooddata/JsonMatchers.java | 98 +++++++++++++ src/test/java/com/gooddata/ModelExample.java | 8 +- .../gooddata/md/AttributeDisplayFormTest.java | 31 ++-- .../java/com/gooddata/md/AttributeTest.java | 41 ++++-- .../java/com/gooddata/md/DisplayFormTest.java | 43 ++++++ src/test/java/com/gooddata/md/EntryTest.java | 58 ++++++++ .../java/com/gooddata/md/ExpressionTest.java | 33 +++++ src/test/java/com/gooddata/md/FactTest.java | 32 +++++ src/test/java/com/gooddata/md/KeyTest.java | 34 +++++ src/test/java/com/gooddata/md/MetaTest.java | 59 ++++++++ .../com/gooddata/md/MetadataServiceTest.java | 136 ++++++++++++++++++ src/test/java/com/gooddata/md/MetricTest.java | 30 ++++ src/test/java/com/gooddata/md/ObjTest.java | 72 ++++++++++ src/test/java/com/gooddata/md/QueryTest.java | 23 +++ .../java/com/gooddata/md/RestrictionTest.java | 37 +++++ .../md/report/AttributeInGridTest.java | 55 +++++++ .../gooddata/md/report/GridElementTest.java | 36 +++++ .../GridReportDefinitionContentTest.java | 36 +++++ .../java/com/gooddata/md/report/GridTest.java | 60 ++++++++ .../OneNumberReportDefinitionContentTest.java | 38 +++++ .../report/ReportDefinitionContentTest.java | 36 +++++ .../md/report/ReportDefinitionTest.java | 40 ++++++ .../com/gooddata/md/report/ReportTest.java | 39 +++++ src/test/resources/md/attribute-input.json | 22 +++ src/test/resources/md/attribute.json | 30 ++-- .../md/attributeDisplayForm-input.json | 13 ++ .../resources/md/attributeDisplayForm.json | 12 +- src/test/resources/md/displayForm-input.json | 11 ++ src/test/resources/md/displayForm.json | 24 ++++ src/test/resources/md/entry.json | 15 ++ src/test/resources/md/fact-input.json | 15 ++ src/test/resources/md/fact.json | 12 +- src/test/resources/md/meta.json | 16 +++ src/test/resources/md/metric-input.json | 11 ++ src/test/resources/md/metric.json | 21 +++ src/test/resources/md/objCommon.json | 18 +++ src/test/resources/md/query.json | 35 +++++ .../resources/md/report/attributeInGrid.json | 7 + src/test/resources/md/report/grid-input.json | 21 +++ src/test/resources/md/report/grid.json | 38 +++++ src/test/resources/md/report/gridElement.json | 4 + .../md/report/gridReportDefinition.json | 51 +++++++ .../gridReportDefinitionContent-input.json | 14 ++ .../report/gridReportDefinitionContent.json | 31 ++++ .../oneNumberReportDefinition-input.json | 26 ++++ .../md/report/oneNumberReportDefinition.json | 44 ++++++ ...neNumberReportDefinitionContent-input.json | 19 +++ .../oneNumberReportDefinitionContent.json | 53 +++++++ .../resources/md/report/report-input.json | 15 ++ src/test/resources/md/report/report.json | 25 ++++ 79 files changed, 2275 insertions(+), 260 deletions(-) create mode 100644 src/main/java/com/gooddata/md/Expression.java rename src/main/java/com/gooddata/md/report/{AttributeItem.java => AttributeInGrid.java} (51%) rename src/main/java/com/gooddata/md/report/{Item.java => GridElement.java} (67%) rename src/main/java/com/gooddata/md/report/{GridReportDefinition.java => GridReportDefinitionContent.java} (61%) delete mode 100644 src/main/java/com/gooddata/md/report/OneNumberReportDefinition.java create mode 100644 src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java create mode 100644 src/test/java/com/gooddata/JsonMatchers.java create mode 100644 src/test/java/com/gooddata/md/DisplayFormTest.java create mode 100644 src/test/java/com/gooddata/md/EntryTest.java create mode 100644 src/test/java/com/gooddata/md/ExpressionTest.java create mode 100644 src/test/java/com/gooddata/md/FactTest.java create mode 100644 src/test/java/com/gooddata/md/KeyTest.java create mode 100644 src/test/java/com/gooddata/md/MetaTest.java create mode 100644 src/test/java/com/gooddata/md/MetadataServiceTest.java create mode 100644 src/test/java/com/gooddata/md/MetricTest.java create mode 100644 src/test/java/com/gooddata/md/ObjTest.java create mode 100644 src/test/java/com/gooddata/md/QueryTest.java create mode 100644 src/test/java/com/gooddata/md/RestrictionTest.java create mode 100644 src/test/java/com/gooddata/md/report/AttributeInGridTest.java create mode 100644 src/test/java/com/gooddata/md/report/GridElementTest.java create mode 100644 src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java create mode 100644 src/test/java/com/gooddata/md/report/GridTest.java create mode 100644 src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java create mode 100644 src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java create mode 100644 src/test/java/com/gooddata/md/report/ReportDefinitionTest.java create mode 100644 src/test/java/com/gooddata/md/report/ReportTest.java create mode 100644 src/test/resources/md/attribute-input.json create mode 100644 src/test/resources/md/attributeDisplayForm-input.json create mode 100644 src/test/resources/md/displayForm-input.json create mode 100644 src/test/resources/md/displayForm.json create mode 100644 src/test/resources/md/entry.json create mode 100644 src/test/resources/md/fact-input.json create mode 100644 src/test/resources/md/meta.json create mode 100644 src/test/resources/md/metric-input.json create mode 100644 src/test/resources/md/metric.json create mode 100644 src/test/resources/md/objCommon.json create mode 100644 src/test/resources/md/query.json create mode 100644 src/test/resources/md/report/attributeInGrid.json create mode 100644 src/test/resources/md/report/grid-input.json create mode 100644 src/test/resources/md/report/grid.json create mode 100644 src/test/resources/md/report/gridElement.json create mode 100644 src/test/resources/md/report/gridReportDefinition.json create mode 100644 src/test/resources/md/report/gridReportDefinitionContent-input.json create mode 100644 src/test/resources/md/report/gridReportDefinitionContent.json create mode 100644 src/test/resources/md/report/oneNumberReportDefinition-input.json create mode 100644 src/test/resources/md/report/oneNumberReportDefinition.json create mode 100644 src/test/resources/md/report/oneNumberReportDefinitionContent-input.json create mode 100644 src/test/resources/md/report/oneNumberReportDefinitionContent.json create mode 100644 src/test/resources/md/report/report-input.json create mode 100644 src/test/resources/md/report/report.json diff --git a/pom.xml b/pom.xml index c2902d475..630335b7a 100644 --- a/pom.xml +++ b/pom.xml @@ -119,12 +119,23 @@ 4.8.1 test + + org.mockito + mockito-all + 1.9.5 + org.hamcrest hamcrest-library 1.3 test + + net.javacrumbs.json-unit + json-unit + 0.1.6 + test + log4j log4j diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index fa2749b8e..21a83415a 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -4,6 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -11,9 +12,12 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.Collection; +import java.util.Collections; + +import static java.util.Arrays.asList; /** - * Attribute + * Attribute of GoodData project dataset */ @JsonTypeName("attribute") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -21,21 +25,39 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Attribute extends Obj implements Queryable { + @JsonProperty("content") private final Content content; @JsonCreator - public Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta); this.content = content; } - public Content getContent() { - return content; + /* Just for serialization test */ + Attribute(String title, Key primaryKey, Key foreignKey) { + super(new Meta(title)); + content = new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList()); + } + + @JsonIgnore + public Collection getDisplayForms() { + return content.getDisplayForms(); + } + + @JsonIgnore + public Collection getPrimaryKeys() { + return content.getPk(); + } + + @JsonIgnore + public Collection getForeignKeys() { + return content.getFk(); } @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Content { + private static class Content { private final Collection pk; private final Collection fk; private final Collection displayForms; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 627e61f5b..4f5f827f6 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -17,7 +17,12 @@ public class AttributeDisplayForm extends DisplayForm { @JsonCreator - public AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta, content); } + + /* Just for serialization test */ + AttributeDisplayForm(String title, String formOf, String expression, Integer isDefault, String ldmExpression) { + super(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression)); + } } diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index d36438648..1fc05ffad 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -4,45 +4,65 @@ package com.gooddata.md; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Display form of attribute + * Display form */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class DisplayForm extends Obj { + @JsonProperty("content") private final Content content; @JsonCreator - public DisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + protected DisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta); this.content = content; } - public Content getContent() { - return content; + @JsonIgnore + public String getFormOf() { + return content.getFormOf(); + } + + @JsonIgnore + public String getExpression() { + return content.getExpression(); + } + + @JsonIgnore + public Integer getDefault() { + return content.getDefault(); + } //TODO boolean + + @JsonIgnore + public String getLdmExpression() { + return content.getLdmExpression(); } @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Content { + protected static class Content { private final String formOf; private final String expression; - private final String defaultValue; - private final String ldmexpression; + @JsonProperty("default") + private final Integer isDefault; + @JsonProperty("ldmexpression") + private final String ldmExpression; @JsonCreator public Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") String defaultValue, @JsonProperty("ldmexpression") String ldmexpression) { + @JsonProperty("default") Integer isDefault, @JsonProperty("ldmexpression") String ldmExpression) { this.formOf = formOf; this.expression = expression; - this.defaultValue = defaultValue; - this.ldmexpression = ldmexpression; + this.isDefault = isDefault; + this.ldmExpression = ldmExpression; } public String getFormOf() { @@ -53,13 +73,12 @@ public String getExpression() { return expression; } - @JsonProperty("default") - public String getDefaultValue() { - return defaultValue; + public Integer getDefault() { + return isDefault; } - public String getLdmexpression() { - return ldmexpression; + public String getLdmExpression() { + return ldmExpression; } } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 8b3289e3d..7f7d92930 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -6,7 +6,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Metadata query result + * Metadata entry (can be named "LINK" in some API docs) */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @@ -18,20 +18,28 @@ public class Entry { private final String category; private final String author; private final String contributor; - private final String deprecated; + private final String deprecated; //TODO boolean private final String identifier; - private final String locked; - private final String tags; - private final String created; // todo date time - private final String updated; // todo date time + private final String tags; //TODO collection + private final String created; //TODO date time + private final String updated; //TODO date time + private final Integer locked; //TODO boolean + private final Integer unlisted; //TODO boolean @JsonCreator - public Entry(@JsonProperty("link") String link, @JsonProperty("title") String title, - @JsonProperty("summary") String summary, @JsonProperty("category") String category, - @JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("deprecated") String deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("locked") String locked, @JsonProperty("tags") String tags, - @JsonProperty("created") String created, @JsonProperty("updated") String updated) { + public Entry(@JsonProperty("link") String link, + @JsonProperty("title") String title, + @JsonProperty("summary") String summary, + @JsonProperty("category") String category, + @JsonProperty("author") String author, + @JsonProperty("contributor") String contributor, + @JsonProperty("deprecated") String deprecated, + @JsonProperty("identifier") String identifier, + @JsonProperty("tags") String tags, + @JsonProperty("created") String created, + @JsonProperty("updated") String updated, + @JsonProperty("locked") Integer locked, + @JsonProperty("unlisted") Integer unlisted) { this.link = link; this.title = title; this.summary = summary; @@ -40,10 +48,11 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("title") String ti this.contributor = contributor; this.deprecated = deprecated; this.identifier = identifier; - this.locked = locked; this.tags = tags; this.created = created; this.updated = updated; + this.locked = locked; + this.unlisted = unlisted; } public String getLink() { @@ -78,10 +87,6 @@ public String getIdentifier() { return identifier; } - public String getLocked() { - return locked; - } - public String getTags() { return tags; } @@ -93,4 +98,12 @@ public String getCreated() { public String getUpdated() { return updated; } + + public Integer getLocked() { + return locked; + } + + public Integer getUnlisted() { + return unlisted; + } } diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java new file mode 100644 index 000000000..917b7fe42 --- /dev/null +++ b/src/main/java/com/gooddata/md/Expression.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Expression of fact + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Expression { + + private final String data; + private final String type; + + @JsonCreator + public Expression(@JsonProperty("data") String data, @JsonProperty("type") String type) { + this.data = data; + this.type = type; + } + + public String getData() { + return data; + } + + public String getType() { + return type; + } +} diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 373a851d4..3696238c9 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -4,6 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -12,8 +13,10 @@ import java.util.Collection; +import static java.util.Arrays.asList; + /** - * Fact + * Fact of GoodData project dataset */ @JsonTypeName("fact") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -21,29 +24,39 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Fact extends Obj implements Queryable { + @JsonProperty("content") private final Content content; @JsonCreator - public Fact(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + private Fact(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta); this.content = content; } - public Content getContent() { - return content; + /* Just for serialization test */ + Fact(String title, String data, String type) { + super(new Meta(title)); + content = new Content(asList(new Expression(data, type))); + } + + @JsonIgnore + public Collection getExpressions() { + return content.getExpression(); } @JsonIgnoreProperties(ignoreUnknown = true) - public static class Content { - private final Collection expr; + private static class Content { + + @JsonProperty("expr") + private final Collection expression; @JsonCreator - public Content(@JsonProperty("expr") Collection expr) { - this.expr = expr; + public Content(@JsonProperty("expr") Collection expression) { + this.expression = expression; } - public Collection getExpr() { - return expr; + public Collection getExpression() { + return expression; } } } diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index ab5d159b8..efbc3cd6d 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -6,6 +6,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** + * Key (primary/foreign) of attribute */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index cd83e09a8..74e7ca115 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -12,41 +12,42 @@ import java.io.Serializable; /** - * Metadata meta information + * Metadata meta information (meant just for internal SDK usage) */ -@JsonIgnoreProperties(ignoreUnknown=true) -@JsonSerialize(include=Inclusion.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = Inclusion.NON_NULL) public class Meta implements Serializable { private String author; private String contributor; - private String created; + private String created; //TODO date time + private String updated; //TODO date time private String summary; - private String updated; private String category; - private String tags; + private String tags; //TODO collection private String uri; - private String deprecated; + private String deprecated; //TODO boolean private String title; private String identifier; private String projectTemplate; - private Integer locked; + private Integer locked; //TODO boolean + private Integer unlisted; //TODO boolean @JsonCreator - public Meta(@JsonProperty("author") String author, - @JsonProperty("contributor") String contributor, - @JsonProperty("created") String created, - @JsonProperty("updated") String updated, - @JsonProperty("summary") String summary, - @JsonProperty("title") String title, - @JsonProperty("category") String category, - @JsonProperty("tags")String tags, - @JsonProperty("uri") String uri, - @JsonProperty("deprecated") String deprecated, - @JsonProperty("identifier") String identifier, - @JsonProperty("link") String link, - @JsonProperty("projectTemplate") String projectTemplate, - @JsonProperty("locked") Integer locked) { + protected Meta(@JsonProperty("author") String author, + @JsonProperty("contributor") String contributor, + @JsonProperty("created") String created, + @JsonProperty("updated") String updated, + @JsonProperty("summary") String summary, + @JsonProperty("title") String title, + @JsonProperty("category") String category, + @JsonProperty("tags") String tags, + @JsonProperty("uri") String uri, + @JsonProperty("deprecated") String deprecated, + @JsonProperty("identifier") String identifier, + @JsonProperty("projectTemplate") String projectTemplate, + @JsonProperty("locked") Integer locked, + @JsonProperty("unlisted") Integer unlisted) { super(); this.author = author; this.uri = uri; @@ -59,8 +60,9 @@ public Meta(@JsonProperty("author") String author, this.deprecated = deprecated; this.identifier = identifier; this.projectTemplate = projectTemplate; - this.locked = locked; this.contributor = contributor; + this.locked = locked; + this.unlisted = unlisted; } public Meta(String title) { @@ -119,4 +121,7 @@ public Integer getLocked() { return locked; } + public Integer getUnlisted() { + return unlisted; + } } diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 9134a0bec..c60f1ceb5 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -27,24 +27,59 @@ public MetadataService(RestTemplate restTemplate) { super(restTemplate); } + /** + * Create metadata object in given project + * + * @param project project + * @param obj metadata object to be created + * @param type of the object to be created + * @return new metadata object + * @throws com.gooddata.md.ObjCreateException if creation failed + * @throws com.gooddata.md.ObjNotFoundException if new metadata object not found after creation + * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code when getting + * the new object + * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors when getting the new object + */ @SuppressWarnings("unchecked") public T createObj(Project project, T obj) { notNull(project, "project"); notNull(obj, "obj"); + final UriResponse response; try { response = restTemplate.postForObject(Obj.URI, obj, UriResponse.class, project.getId()); } catch (GoodDataRestException | RestClientException e) { throw new ObjCreateException(obj, e); } + + if (response == null) { + throw new ObjCreateException("empty response from API call", obj); + } return getObjByUri(response.getUri(), (Class) obj.getClass()); } + /** + * Get metadata object by URI (format is /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID}) + * + * @param uri URI in format /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID} + * @param cls class of the resulting object + * @param type of the object to be returned + * @return the metadata object + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code + * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors + */ public T getObjByUri(String uri, Class cls) { notNull(uri, "uri"); notNull(cls, "cls"); try { - return restTemplate.getForObject(uri, cls); + final T result = restTemplate.getForObject(uri, cls); + + if (result != null) { + return result; + } else { + throw new GoodDataException("empty response from API call"); + } } catch (GoodDataRestException e) { if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { throw new ObjNotFoundException(uri, cls, e); @@ -56,6 +91,18 @@ public T getObjByUri(String uri, Class cls) { } } + /** + * Get metadata object by id. + * + * @param project project where to search for the object + * @param id id of the object + * @param cls class of the resulting object + * @param type of the object to be returned + * @return the metadata object + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code + * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors + */ public T getObjById(Project project, String id, Class cls) { notNull(project, "project"); notNull(id, "id"); @@ -63,7 +110,18 @@ public T getObjById(Project project, String id, Class cls) { return getObjByUri(Obj.OBJ_TEMPLATE.expand(project.getId(), id).toString(), cls); } - public String getObjUri(Project project, Class cls, Restriction... restrictions) { + /** + * Get metadata object URI by restrictions like identifier, title or summary. + * + * @param project project where to search for the object + * @param cls class of the resulting object + * @param restrictions query restrictions + * @param type of the object to be returned + * @return the URI of metadata object + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.md.NonUniqueObjException if more than one object corresponds to search restrictions + */ + public String findObjUri(Project project, Class cls, Restriction... restrictions) { final Collection results = findUris(project, cls, restrictions); if (results == null || results.isEmpty()) { throw new ObjNotFoundException(cls); @@ -73,13 +131,30 @@ public String getObjUri(Project project, Class cls, Res return results.iterator().next(); } + /** + * Find metadata by restrictions like identifier, title or summary. + * + * @param project project where to search for the metadata + * @param cls class of searched metadata + * @param restrictions query restrictions + * @param type of the metadata referenced in returned entries + * @return the collection of metadata entries + * @throws com.gooddata.GoodDataException if unable to query metadata + */ public Collection find(Project project, Class cls, Restriction... restrictions) { notNull(project, "project"); notNull(cls, "cls"); - final String type = cls.getSimpleName().toLowerCase() + (cls.isAssignableFrom(ReportDefinition.class) ? "" : "s"); + + final String type = cls.getSimpleName().toLowerCase() + + (cls.isAssignableFrom(ReportDefinition.class) ? "" : "s"); try { - final Collection entries = restTemplate.getForObject(Query.URI, Query.class, project.getId(), type).getEntries(); - return filterEntries(entries, restrictions); + final Query queryResult = restTemplate.getForObject(Query.URI, Query.class, project.getId(), type); + + if (queryResult != null && queryResult.getEntries() != null) { + return filterEntries(queryResult.getEntries(), restrictions); + } else { + throw new GoodDataException("empty response from API call"); + } } catch (RestClientException e) { throw new GoodDataException("Unable to query metadata: " + type, e); } @@ -90,22 +165,40 @@ private Collection filterEntries(Collection entries, Restriction.. return entries; } final Collection result = new ArrayList<>(entries.size()); - for (Entry entry: entries) { - for (Restriction restriction: restrictions) { + 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; + 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; } - public Collection findUris(Project project, Class cls, Restriction... restrictions) { + /** + * Find metadata URIs by restrictions like identifier, title or summary. + * + * @param project project where to search for the metadata + * @param cls class of searched metadata + * @param restrictions query restrictions + * @param type of the metadata referenced by returned URIs + * @return the collection of metadata URIs + * @throws com.gooddata.GoodDataException if unable to query metadata + */ + public Collection findUris(Project project, + Class cls, + Restriction... restrictions) { final Collection entries = find(project, cls, restrictions); final Collection result = new ArrayList<>(entries.size()); - for (Entry entry: entries) { + for (Entry entry : entries) { result.add(entry.getLink()); } return result; diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index 0f09a6d65..2a1c89895 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -4,6 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -19,10 +20,11 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Metric extends Obj implements Queryable { + @JsonProperty("content") private final Content content; @JsonCreator - public Metric(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + private Metric(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta); this.content = content; } @@ -31,12 +33,18 @@ public Metric(String title, String expression, String format) { this(new Meta(title), new Metric.Content(expression, format)); } - public Content getContent() { - return content; + @JsonIgnore + public String getExpression() { + return content.getExpression(); + } + + @JsonIgnore + public String getFormat() { + return content.getFormat(); } @JsonIgnoreProperties(ignoreUnknown = true) - public static class Content { + private static class Content { private final String expression; private final String format; diff --git a/src/main/java/com/gooddata/md/NonUniqueObjException.java b/src/main/java/com/gooddata/md/NonUniqueObjException.java index 1e0f8c506..7b0702f7f 100644 --- a/src/main/java/com/gooddata/md/NonUniqueObjException.java +++ b/src/main/java/com/gooddata/md/NonUniqueObjException.java @@ -9,6 +9,13 @@ */ public class NonUniqueObjException extends GoodDataException { + /** + * Construct a new instance of NonUniqueObjException. + * + * @param cls class of metadata object you're searching for + * @param results collection of URIs you have found + * @param the type of results you're searching for + */ public NonUniqueObjException(Class cls, Collection results) { super("Expected a single instance of " + cls.getSimpleName().toLowerCase() + " but found " + results); } diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 9280f7364..23611a6bf 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -3,24 +3,93 @@ */ package com.gooddata.md; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; import org.springframework.web.util.UriTemplate; /** - * Metadata object + * Metadata object (common part) */ public abstract class Obj { public static final String URI = "/gdc/md/{projectId}/obj"; public static final String OBJ_URI = URI + "/{objId}"; public static final UriTemplate OBJ_TEMPLATE = new UriTemplate(OBJ_URI); + @JsonProperty("meta") protected final Meta meta; - public Obj(@JsonProperty("meta") Meta meta) { + protected Obj(@JsonProperty("meta") Meta meta) { this.meta = meta; } - public Meta getMeta() { - return meta; + @JsonIgnore + public String getAuthor() { + return meta.getAuthor(); } + + @JsonIgnore + public String getContributor() { + return meta.getContributor(); + } + + @JsonIgnore + public String getCreated() { + return meta.getCreated(); + } + + @JsonIgnore + public String getSummary() { + return meta.getSummary(); + } + + @JsonIgnore + public String getTitle() { + return meta.getTitle(); + } + + @JsonIgnore + public String getUpdated() { + return meta.getUpdated(); + } + + @JsonIgnore + public String getCategory() { + return meta.getCategory(); + } + + @JsonIgnore + public String getTags() { + return meta.getTags(); + } + + @JsonIgnore + public String getUri() { + return meta.getUri(); + } + + @JsonIgnore + public String getDeprecated() { + return meta.getDeprecated(); + } + + @JsonIgnore + public String getIdentifier() { + return meta.getIdentifier(); + } + + @JsonIgnore + public String getProjectTemplate() { + return meta.getProjectTemplate(); + } + + @JsonIgnore + public Integer getLocked() { + return meta.getLocked(); + } + + @JsonIgnore + public Integer getUnlisted() { + return meta.getUnlisted(); + } + } diff --git a/src/main/java/com/gooddata/md/ObjCreateException.java b/src/main/java/com/gooddata/md/ObjCreateException.java index 97d855e61..a0c83afcb 100644 --- a/src/main/java/com/gooddata/md/ObjCreateException.java +++ b/src/main/java/com/gooddata/md/ObjCreateException.java @@ -6,7 +6,26 @@ * Metadata object couldn't be created */ public class ObjCreateException extends GoodDataException { + + /** + * Construct a new instance of ObjCreateException. + * + * @param obj the metadata object you're trying to create + * @param cause the cause of error + * @param the type of metadata object you're trying to create + */ public ObjCreateException(T obj, Throwable cause) { super("Can't create metadata object: " + obj.getClass().getSimpleName(), cause); } + + /** + * Construct a new instance of ObjCreateException. + * + * @param message the detail message + * @param obj the metadata object you're trying to create + * @param the type of metadata object you're trying to create + */ + public ObjCreateException(String message, T obj) { + super("Can't create metadata object: " + obj.getClass().getSimpleName() + "; Cause: " + message); + } } diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index d53ba781e..1f00143a3 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -7,11 +7,25 @@ */ public class ObjNotFoundException extends GoodDataException { + /** + * Construct a new instance of ObjNotFoundException. + * + * @param uri the URI of metadata object you're searching for + * @param cls class of metadata object you're searching for + * @param e caused by this exception + * @param the type of results you're searching for + */ public ObjNotFoundException(String uri, Class cls, Exception e) { super(cls.getSimpleName() + " not found " + uri, e); } - public ObjNotFoundException(Class cls) { + /** + * Construct a new instance of ObjNotFoundException. + * + * @param cls class of metadata object you're searching for + * @param the type of results you're searching for + */ + public ObjNotFoundException(Class cls) { super(cls.getSimpleName() + " not found"); } } diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index f62a752c7..899fcd826 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -10,7 +10,7 @@ import java.util.Collection; /** - * Metadata query + * Metadata query result */ @JsonTypeName("query") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -25,7 +25,7 @@ public class Query { private final Meta meta; @JsonCreator - public Query(@JsonProperty("entries") Collection entries, @JsonProperty("meta") Meta meta) { + private Query(@JsonProperty("entries") Collection entries, @JsonProperty("meta") Meta meta) { this.entries = entries; this.meta = meta; } @@ -34,13 +34,21 @@ public Collection getEntries() { return entries; } - public Meta getMeta() { - return meta; + public String getCategory() { + return meta.getCategory(); + } + + public String getSummary() { + return meta.getSummary(); + } + + public String getTitle() { + return meta.getTitle(); } @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Meta { + private static class Meta { private final String category; private final String summary; private final String title; diff --git a/src/main/java/com/gooddata/md/Queryable.java b/src/main/java/com/gooddata/md/Queryable.java index 66f024034..b6be292f6 100644 --- a/src/main/java/com/gooddata/md/Queryable.java +++ b/src/main/java/com/gooddata/md/Queryable.java @@ -1,7 +1,7 @@ package com.gooddata.md; /** - * Marker interface for metadata objects which can be found by queries. + * Marker interface for metadata objects which can be found using query resource (see MetadataService.find* methods). */ public interface Queryable { } diff --git a/src/main/java/com/gooddata/md/Restriction.java b/src/main/java/com/gooddata/md/Restriction.java index e53732872..097d3ea30 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/src/main/java/com/gooddata/md/Restriction.java @@ -1,7 +1,7 @@ package com.gooddata.md; /** - * Metadata query restriction + * Metadata query restriction. See static factory methods to get instance of desired restriction type. */ public class Restriction { @@ -22,14 +22,32 @@ public String getValue() { return value; } + /** + * Construct a new instance with restriction type identifier and given value. + * + * @param value identifier you want to search for + * @return new restriction for identifier restriction + */ public static Restriction identifier(String value) { return new Restriction(Type.IDENTIFIER, value); } + /** + * Construct a new instance with restriction type title and given value. + * + * @param value title you want to search for + * @return new restriction for title restriction + */ public static Restriction title(String value) { return new Restriction(Type.TITLE, value); } + /** + * Construct a new instance with restriction type summary and given value. + * + * @param value summary you want to search for + * @return new restriction for summary restriction + */ public static Restriction summary(String value) { return new Restriction(Type.SUMMARY, value); } diff --git a/src/main/java/com/gooddata/md/report/AttributeItem.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java similarity index 51% rename from src/main/java/com/gooddata/md/report/AttributeItem.java rename to src/main/java/com/gooddata/md/report/AttributeInGrid.java index 7a8da89ae..4b4213a26 100644 --- a/src/main/java/com/gooddata/md/report/AttributeItem.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -12,44 +12,41 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.LinkedList; /** + * Attribute in Grid */ @JsonTypeName("attribute") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class AttributeItem extends Item { +public class AttributeInGrid extends GridElement { - private Collection totals = new ArrayList<>(); + private Collection> totals; @JsonCreator - public AttributeItem(@JsonProperty("uri") String uri, @JsonProperty("totals") Collection totals, - @JsonProperty("alias") String alias) { + AttributeInGrid(@JsonProperty("uri") String uri, @JsonProperty("totals") Collection> totals, + @JsonProperty("alias") String alias) { super(uri, alias); this.totals = totals; } - public AttributeItem(String uri) { + public AttributeInGrid(String uri) { super(uri, ""); + totals = new ArrayList<>(); } - public Collection getTotals() { - return totals; + public AttributeInGrid(String uri, String alias) { + super(uri, alias); + totals = new ArrayList<>(); } - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Totals { - private Collection totals = new ArrayList<>(); - - @JsonCreator - public Totals(@JsonProperty Collection totals) { - this.totals = totals; - } - - public Collection getTotals() { - return totals; + public Collection> getTotals() { + final LinkedList> result = new LinkedList<>(); + for (final Collection t : totals) { + result.add(t); } + return result; } } diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 374e56c8b..85d170e99 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -15,41 +15,55 @@ import java.util.Map; /** + * Grid content (in report definition) */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Grid { private final Collection columns; - private final Collection rows; - private final Collection metrics; - private final Map> sort; - private final Collection columnWidths = Collections.emptyList(); + private final Collection rows; + private final Collection metrics; + private final Map> sort; + private final Collection> columnWidths; @JsonCreator - public Grid(@JsonProperty("columns") Collection columns, @JsonProperty("rows") Collection rows, - @JsonProperty("metrics") Collection metrics) { + public Grid(@JsonProperty("columns") Collection columns, + @JsonProperty("rows") Collection rows, + @JsonProperty("metrics") Collection metrics, + @JsonProperty("sort") Map> sort, + @JsonProperty("columnWidths") Collection> columnWidths) { + this.columns = columns; + this.rows = rows; + this.metrics = metrics; + this.sort = sort; + this.columnWidths = columnWidths; + } + + public Grid(final Collection columns, final Collection rows, + final Collection metrics) { this.columns = columns; this.rows = rows; this.metrics = metrics; sort = new LinkedHashMap<>(); sort.put("columns", Collections.emptyList()); sort.put("rows", Collections.emptyList()); + columnWidths = Collections.emptyList(); } public Collection getColumns() { return columns; } - public Collection getRows() { + public Collection getRows() { return rows; } - public Collection getMetrics() { + public Collection getMetrics() { return metrics; } - public Collection getColumnWidths() { + public Collection> getColumnWidths() { return columnWidths; } diff --git a/src/main/java/com/gooddata/md/report/Item.java b/src/main/java/com/gooddata/md/report/GridElement.java similarity index 67% rename from src/main/java/com/gooddata/md/report/Item.java rename to src/main/java/com/gooddata/md/report/GridElement.java index bab79886b..9824d83a4 100644 --- a/src/main/java/com/gooddata/md/report/Item.java +++ b/src/main/java/com/gooddata/md/report/GridElement.java @@ -9,24 +9,23 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** + * Grid element + * (metricGroup | URI | AttributeInGrid ... URI is allowed for backward compatibility, metricGroup can be maximally + * one time in rows or columns) */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Item { +public class GridElement { private final String uri; - protected String alias = ""; + private final String alias; @JsonCreator - public Item(@JsonProperty("uri") String uri, @JsonProperty("alias") String alias) { + public GridElement(@JsonProperty("uri") String uri, @JsonProperty("alias") String alias) { this.uri = uri; this.alias = alias; } - public Item(String uri) { - this(uri, ""); - } - public String getUri() { return uri; } diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinition.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java similarity index 61% rename from src/main/java/com/gooddata/md/report/GridReportDefinition.java rename to src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index e6532fbe3..085808698 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -12,30 +12,28 @@ import java.util.List; /** + * Grid report definition */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class GridReportDefinition extends ReportDefinitionContent { +public class GridReportDefinitionContent extends ReportDefinitionContent { public static final String FORMAT = "grid"; - private final Grid grid; - @JsonCreator - public GridReportDefinition(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid) { - super(format); - this.grid = grid; + private GridReportDefinitionContent(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid) { + super(format, grid); } - public GridReportDefinition(Grid grid) { + GridReportDefinitionContent(Grid grid) { this(FORMAT, grid); } - public Grid getGrid() { - return grid; + public String getFormat() { + return FORMAT; } - public static ReportDefinition create(String title, List columns, List rows, List metrics) { - return new ReportDefinition(new Meta(title), new GridReportDefinition(new Grid(columns, rows, metrics))); + public static ReportDefinition create(String title, List columns, List rows, List metrics) { + return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics))); } } diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinition.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinition.java deleted file mode 100644 index 596aa9172..000000000 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinition.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.md.report; - -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -import java.util.Map; - -/** - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class OneNumberReportDefinition extends ReportDefinitionContent { - - public static final String FORMAT = "oneNumber"; - - private final Grid grid; - private final Map> oneNumber; - - @JsonCreator - public OneNumberReportDefinition(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid, - @JsonProperty("oneNumber") Map> oneNumber) { - super(format); - this.grid = grid; - this.oneNumber = oneNumber; - } - -} diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java new file mode 100644 index 000000000..7c5f8eb40 --- /dev/null +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * One number report definition + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class OneNumberReportDefinitionContent extends ReportDefinitionContent { + + public static final String FORMAT = "oneNumber"; + + private final OneNumberVisualization oneNumber; + + @JsonCreator + private OneNumberReportDefinitionContent(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid, + @JsonProperty("oneNumber") OneNumberVisualization oneNumber) { + super(format, grid); + this.oneNumber = oneNumber; + } + + /* Just for serialization test */ + OneNumberReportDefinitionContent(Grid grid, String description) { + super(FORMAT, grid); + oneNumber = new OneNumberVisualization(new OneNumberLabels(description)); + } + + public String getFormat() { + return FORMAT; + } + + public OneNumberVisualization getOneNumber() { + return oneNumber; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + private static class OneNumberVisualization { + + private final OneNumberLabels labels; + + @JsonCreator + private OneNumberVisualization(final OneNumberLabels labels) { + this.labels = labels; + } + + public OneNumberLabels getLabels() { + return labels; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + private static class OneNumberLabels { + + private final String description; + + @JsonCreator + private OneNumberLabels(@JsonProperty("description") String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + } +} diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 69019a0a9..b767df97c 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -7,6 +7,7 @@ import com.gooddata.md.Obj; import com.gooddata.md.Queryable; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -18,6 +19,7 @@ import static java.util.Arrays.asList; /** + * Report */ @JsonTypeName("report") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -25,34 +27,50 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Report extends Obj implements Queryable { + @JsonProperty("content") private final Content content; @JsonCreator - public Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + private Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta); this.content = content; } - public Report(String title, ReportDefinition definition) { - this(new Meta(title), new Content(asList(definition.getMeta().getUri()))); + /* Just for serialization test */ + Report(String title, String definition, String domain) { + super(new Meta(title)); + content = new Content(asList(definition), asList(domain)); } - public Content getContent() { - return content; + @JsonIgnore + public Collection getDefinitions() { + return content.getDefinitions(); + } + + @JsonIgnore + public Collection getDomains() { + return content.getDomains(); } @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Content { + private static class Content { private final Collection definitions; + private final Collection domains; @JsonCreator - public Content(@JsonProperty("definitions") Collection definitions) { + public Content(@JsonProperty("definitions") Collection definitions, + @JsonProperty("domains") Collection domains) { this.definitions = definitions; + this.domains = domains; } public Collection getDefinitions() { return definitions; } + + public Collection getDomains() { + return domains; + } } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 872555d90..e1bf200b6 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -7,15 +7,15 @@ import com.gooddata.md.Obj; import com.gooddata.md.Queryable; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import java.util.Collection; - /** + * Report definition */ @JsonTypeName("reportDefinition") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -23,29 +23,29 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ReportDefinition extends Obj implements Queryable { + @JsonProperty("content") private final ReportDefinitionContent content; @JsonCreator - public ReportDefinition(@JsonProperty("meta") Meta meta, @JsonProperty("content") ReportDefinitionContent content) { + ReportDefinition(@JsonProperty("meta") Meta meta, @JsonProperty("content") ReportDefinitionContent content) { super(meta); this.content = content; } - public ReportDefinitionContent getContent() { - return content; + /* Just for serialization test */ + ReportDefinition(String title, ReportDefinitionContent content) { + super(new Meta(title)); + this.content = content; } - public static class Content { - private final Collection definitions; - - @JsonCreator - public Content(@JsonProperty("definitions") Collection definitions) { - this.definitions = definitions; - } + @JsonIgnore + public String getFormat() { + return content.getFormat(); + } - public Collection getDefinitions() { - return definitions; - } + @JsonIgnore + public Grid getGrid() { + return content.getGrid(); } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index 91b30e16e..bcffb8ee6 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -10,32 +10,41 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.Collection; -import java.util.Collections; + +import static java.util.Collections.emptyList; /** + * Report definition content */ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "format") @JsonSubTypes({ - @JsonSubTypes.Type(name = GridReportDefinition.FORMAT, value = GridReportDefinition.class), - @JsonSubTypes.Type(name = OneNumberReportDefinition.FORMAT, value = OneNumberReportDefinition.class) + @JsonSubTypes.Type(name = GridReportDefinitionContent.FORMAT, value = GridReportDefinitionContent.class), + @JsonSubTypes.Type(name = OneNumberReportDefinitionContent.FORMAT, value = OneNumberReportDefinitionContent.class) }) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public abstract class ReportDefinitionContent { private final String format; - private final Collection filters = Collections.emptyList(); + private final Grid grid; + private final Collection filters; //TODO proper type - public ReportDefinitionContent(String format) { + public ReportDefinitionContent(String format, Grid grid) { this.format = format; - } - - public Collection getFilters() { - return filters; + this.grid = grid; + this.filters = emptyList(); } @JsonIgnore // handled by type info public String getFormat() { return format; } + + public Grid getGrid() { + return grid; + } + + public Collection getFilters() { + return filters; + } } diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 1c72c25b0..dfa0c2648 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -7,7 +7,6 @@ import com.gooddata.GoodDataException; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; -import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ObjectNode; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; @@ -33,7 +32,7 @@ public ReportService(final RestTemplate restTemplate) { public String exportReport(final ReportDefinition reportDefinition, final String format) { notNull(reportDefinition, "reportDefinition"); notEmpty(format, "format"); - final ExecResult execResult = executeReport(reportDefinition.getMeta().getUri()); + final ExecResult execResult = executeReport(reportDefinition.getUri()); return exportReport(execResult, format); } diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 55e8fb3e2..80f5bb20a 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -36,7 +36,7 @@ public static void main(String... args) { final MetadataService md = gd.getMetadataService(); - final String factUri = md.getObjUri(project, Fact.class, Restriction.title("myfact")); + final String factUri = md.findObjUri(project, Fact.class, Restriction.title("myfact")); final Metric m = md.createObj(project, new Metric("my sum", "SELECT SUM([" + factUri + "])", "#,##0")); diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java new file mode 100644 index 000000000..0065268e6 --- /dev/null +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -0,0 +1,98 @@ +package com.gooddata; + +import net.javacrumbs.jsonunit.JsonAssert; +import net.javacrumbs.jsonunit.core.internal.Diff; +import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Factory; +import org.hamcrest.Matcher; + +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static java.lang.String.format; +import static net.javacrumbs.jsonunit.core.internal.Diff.create; + +/** + * Contains Hamcrest matchers to be used with Hamcrest assertThat and other tools. + */ +public class JsonMatchers { + + /** + * Just hide constructor of this utility class. + */ + private JsonMatchers() { + } + + /** + * Creates a matcher that matches if examined object serialized to JSON matches JSON in given resource file. + * + * @param expectedResourceName name of resource (relative patch in resource folder) + * @return matcher that matches if examined object serialized to JSON matches JSON in given resource file + */ + @Factory + public static Matcher serializesToJson(final String expectedResourceName) { + return new JsonFileMatcher<>(expectedResourceName); + } + + private static class JsonFileMatcher extends BaseMatcher { + + private String expectedResourceName; + private String expectedJsonString; + private String actualJsonString; + private String errorString; + private String differences; + + private JsonFileMatcher(final String expectedResourceName) { + super(); + this.expectedResourceName = expectedResourceName; + } + + @Override + public boolean matches(final Object actual) { + String expectedJsonString; + try { + actualJsonString = new ObjectMapper().writeValueAsString(actual); + + final URL resourceUrl = getClass().getResource(expectedResourceName); + if (resourceUrl == null) { + errorString = "Resource not found. Check resource name and path: " + expectedResourceName; + return false; + } + expectedJsonString = new String(Files.readAllBytes(Paths.get(resourceUrl.toURI()))); + } catch (Exception e) { + errorString = format("Exception thrown during matching. Class: %s Message: %s", e.getClass(), + e.getMessage()); + return false; + } + + this.expectedJsonString = expectedJsonString; + final Diff diff = create(expectedJsonString, actual, "fullJson", "", JsonAssert.getIgnorePlaceholder(), + JsonAssert.getTolerance(), JsonAssert.getTreatNullAsAbsent()); + if (!diff.similar()) { + differences = diff.differences(); + } + return diff.similar(); + } + + @Override + public void describeTo(final Description description) { + if (errorString != null) { + description.appendText("\nError: " + errorString); + } else { + description.appendText( + format("%s in %s", safeToString(expectedJsonString), safeToString(expectedResourceName))); + description.appendText("\n got: "); + description.appendText(safeToString(actualJsonString)); + description.appendText("\n diff: "); + description.appendText(safeToString(differences)); + } + } + + private String safeToString(final String str) { + return str != null ? str : "null"; + } + } +} diff --git a/src/test/java/com/gooddata/ModelExample.java b/src/test/java/com/gooddata/ModelExample.java index 0c3e10aea..a62f759de 100644 --- a/src/test/java/com/gooddata/ModelExample.java +++ b/src/test/java/com/gooddata/ModelExample.java @@ -7,16 +7,11 @@ import com.gooddata.model.ModelDiff; import com.gooddata.model.ModelService; import com.gooddata.project.Project; -import org.codehaus.jackson.map.ObjectMapper; -import java.io.IOException; -/** - * TODO - */ public class ModelExample { public static void main(String... args) { - final GoodData gd = new GoodData("staging.getgooddata.com", "jiri.mikulasek@gooddata.com", "jindrisska"); + final GoodData gd = new GoodData("roman@gooddata.com", "roman1"); final ModelService modelService = gd.getModelService(); final Project project = gd.getProjectService().getProjectById("amxhoeyj7oskijld63tajq0o9f4nhxy7"); @@ -24,7 +19,6 @@ public static void main(String... args) { modelService.updateProjectModel(project, projectModelDiff); - gd.logout(); } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index cccdb68de..8f9fab9a6 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -5,21 +5,36 @@ import java.io.InputStream; +import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; 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 Integer DEFAULT = 0; + public static final String LDM_EXPRESSION = ""; + @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/attributeDisplayForm.json"); - final AttributeDisplayForm value = new ObjectMapper().readValue(stream, AttributeDisplayForm.class); - assertThat(value, is(notNullValue())); - final DisplayForm.Content content = value.getContent(); - assertThat(content, is(notNullValue())); - assertThat(content.getFormOf(), is("/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/28")); - assertThat(content.getExpression(), is("[/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/17]")); - assertThat(content.getDefaultValue(), is("0")); - assertThat(content.getLdmexpression(), is("")); + final AttributeDisplayForm attrDF = new ObjectMapper().readValue(stream, AttributeDisplayForm.class); + assertThat(attrDF, is(notNullValue())); + + assertThat(attrDF.getFormOf(), is(FORM_OF)); + assertThat(attrDF.getExpression(), is(EXPRESSION)); + assertThat(attrDF.getDefault(), is(DEFAULT)); + assertThat(attrDF.getLdmExpression(), is(LDM_EXPRESSION)); + } + + @Test + public void testSerialization() throws Exception { + final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + LDM_EXPRESSION); + + assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-input.json")); } + } diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 1fdd52869..c52e781c9 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -1,35 +1,56 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.Matchers; import org.junit.Test; import java.io.InputStream; import java.util.Collection; +import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertThat; public class AttributeTest { + + public static final String TITLE = "Person ID"; + @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/attribute.json"); - final Attribute value = new ObjectMapper().readValue(stream, Attribute.class); - assertThat(value, is(notNullValue())); - final Attribute.Content content = value.getContent(); - assertThat(content, is(notNullValue())); + final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + assertThat(attribute, is(notNullValue())); - final Collection displayForms = content.getDisplayForms(); + final Collection displayForms = attribute.getDisplayForms(); assertThat(displayForms, is(notNullValue())); assertThat(displayForms, hasSize(1)); final DisplayForm displayForm = displayForms.iterator().next(); - final DisplayForm.Content displayFormContent = displayForm.getContent(); - assertThat(displayFormContent, is(notNullValue())); + assertThat(displayForm, is(notNullValue())); + + assertThat(displayForm.getFormOf(), is("/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID")); + assertThat(displayForm.getExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]")); + assertThat(displayForm.getLdmExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]")); - assertThat(displayFormContent.getFormOf(), is("/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/28")); - assertThat(displayFormContent.getExpression(), is("[/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/17]")); - assertThat(displayFormContent.getLdmexpression(), is("")); + final Collection primaryKeys = attribute.getPrimaryKeys(); + assertThat(primaryKeys, is(Matchers.notNullValue())); + assertThat(primaryKeys, hasSize(1)); + assertThat(primaryKeys.iterator().next(), is(Matchers.notNullValue())); + + final Collection foreignKeys = attribute.getForeignKeys(); + assertThat(foreignKeys, is(Matchers.notNullValue())); + assertThat(foreignKeys, hasSize(1)); + assertThat(foreignKeys.iterator().next(), is(Matchers.notNullValue())); } + + @Test + public void testSerialization() throws Exception { + final Attribute attribute = new Attribute(TITLE, new Key("/gdc/md/PROJECT_ID/obj/PK_ID", "col"), + new Key("/gdc/md/PROJECT_ID/obj/FK_ID", "col")); + + assertThat(attribute, serializesToJson("/md/attribute-input.json")); + } + } diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java new file mode 100644 index 000000000..9c1319a1e --- /dev/null +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class DisplayFormTest { + + 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 Integer DEFAULT = 0; + public static final String LDM_EXPRESSION = ""; + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/displayForm.json"); + final DisplayForm displayForm = new ObjectMapper().readValue(stream, DisplayForm.class); + assertThat(displayForm, is(notNullValue())); + + assertThat(displayForm.getFormOf(), is(FORM_OF)); + assertThat(displayForm.getExpression(), is(EXPRESSION)); + assertThat(displayForm.getDefault(), is(DEFAULT)); + assertThat(displayForm.getLdmExpression(), is(LDM_EXPRESSION)); + } + + @Test + public void testSerialization() throws Exception { + final DisplayForm displayForm = new DisplayForm(new Meta("Person Name"), + new DisplayForm.Content(FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION)); + + assertThat(displayForm, serializesToJson("/md/displayForm-input.json")); + } + +} diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java new file mode 100644 index 000000000..71dec8bf8 --- /dev/null +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Assert; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class EntryTest { + + public static final String LINK = "/gdc/md/PROJECT_ID/obj/ENTRY_ID"; + public static final String AUTHOR = "/gdc/account/profile/AUTHOR_USER_ID"; + public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; + public static final String CREATED = "2014-04-11 13:45:54"; + public static final String SUMMARY = "Entry summary"; + public static final String TITLE = "Entry title"; + public static final String UPDATED = "2014-04-11 13:45:55"; + public static final String CATEGORY = "ENTRY_CATEGORY"; + public static final String TAGS = "TAG"; + public static final String DEPRECATED = "1"; + public static final String IDENTIFIER = "ID"; + public static final Integer LOCKED = 1; + public static final Integer UNLISTED = 0; + + @Test + public void testDeserialize() throws Exception { + final Entry entry = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/entry.json"), Entry.class); + assertThat(entry, is(notNullValue())); + assertThat(entry.getLink(), is(LINK)); + assertThat(entry.getTitle(), is(TITLE)); + assertThat(entry.getSummary(), is(SUMMARY)); + assertThat(entry.getCategory(), is(CATEGORY)); + assertThat(entry.getAuthor(), is(AUTHOR)); + assertThat(entry.getContributor(), is(CONTRIBUTOR)); + assertThat(entry.getDeprecated(), is(DEPRECATED)); + assertThat(entry.getIdentifier(), is(IDENTIFIER)); + assertThat(entry.getTags(), is(TAGS)); + assertThat(entry.getCreated(), is(CREATED)); + assertThat(entry.getUpdated(), is(UPDATED)); + assertThat(entry.getLocked(), is(LOCKED)); + assertThat(entry.getUnlisted(), is(UNLISTED)); + } + + @Test + public void testSerialization() throws Exception { + final Entry entry = new Entry(LINK, TITLE, SUMMARY, CATEGORY, AUTHOR, CONTRIBUTOR, DEPRECATED, IDENTIFIER, TAGS, + CREATED, UPDATED, LOCKED, UNLISTED); + + Assert.assertThat(entry, serializesToJson("/md/entry.json")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java new file mode 100644 index 000000000..f8bcaab6b --- /dev/null +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ExpressionTest { + + public static final String DATA = "/gdc/md/PROJECT_ID/obj/EXPR_ID"; + public static final String TYPE = "expr"; + public static final String JSON = "{\"data\":\"/gdc/md/PROJECT_ID/obj/EXPR_ID\",\"type\":\"expr\"}"; + public static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeserialize() throws Exception { + final Expression expression = MAPPER.readValue(JSON, Expression.class); + assertThat(expression, is(notNullValue())); + assertThat(expression.getData(), is(DATA)); + assertThat(expression.getType(), is(TYPE)); + } + + @Test + public void testSerialize() throws Exception { + final Expression expression = new Expression(DATA, TYPE); + assertThat(MAPPER.writeValueAsString(expression), is(JSON)); + } +} \ 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 new file mode 100644 index 000000000..b8a99fb60 --- /dev/null +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Assert; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + +public class FactTest { + + @Test + public void testDeserialization() throws Exception { + final Fact fact = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/fact.json"), Fact.class); + assertThat(fact, is(notNullValue())); + assertThat(fact.getExpressions(), is(notNullValue())); + assertThat(fact.getExpressions(), hasSize(1)); + } + + @Test + public void testSerialization() throws Exception { + final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col"); + Assert.assertThat(fact, serializesToJson("/md/fact-input.json")); + } + +} \ 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 new file mode 100644 index 000000000..ebe2a68b4 --- /dev/null +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class KeyTest { + + public static final ObjectMapper MAPPER = new ObjectMapper(); + public static final String DATA = "/gdc/md/PROJECT_ID/obj/PK_ID"; + public static final String TYPE = "col"; + public static final String JSON = "{\"data\":\"/gdc/md/PROJECT_ID/obj/PK_ID\",\"type\":\"col\"}"; + + @Test + public void testDeserialize() throws Exception { + final Key key = MAPPER.readValue(JSON, Key.class); + assertThat(key, is(notNullValue())); + assertThat(key.getData(), is(DATA)); + assertThat(key.getType(), is(TYPE)); + } + + @Test + public void testSerialize() throws Exception { + final Key key = new Key(DATA, TYPE); + final String json = MAPPER.writeValueAsString(key); + assertThat(json, is(JSON)); + } +} \ 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 new file mode 100644 index 000000000..31c40e776 --- /dev/null +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class MetaTest { + + public static final String AUTHOR = "/gdc/account/profile/USER_ID"; + public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; + public static final String CREATED = "2014-04-11 13:45:56"; + public static final String SUMMARY = "Obj summary"; + public static final String TITLE = "Obj title"; + public static final String UPDATED = "2014-04-11 13:45:57"; + public static final String CATEGORY = "attributeDisplayForm"; + public static final String TAGS = "TAG1 TAG2"; + public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; + public static final String DEPRECATED = "0"; + public static final String IDENTIFIER = "attr.person.id.name"; + public static final String PROJECT_TEMPLATE = "/projectTemplates/TYPE/VERSION"; + public static final Integer LOCKED = 0; + public static final Integer UNLISTED = 1; + + @Test + public void testDeserialization() throws Exception { + final Meta meta = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/meta.json"), Meta.class); + assertThat(meta, is(notNullValue())); + assertThat(meta.getAuthor(), is(AUTHOR)); + assertThat(meta.getContributor(), is(CONTRIBUTOR)); + assertThat(meta.getCreated(), is(CREATED)); + assertThat(meta.getSummary(), is(SUMMARY)); + assertThat(meta.getTitle(), is(TITLE)); + assertThat(meta.getUpdated(), is(UPDATED)); + assertThat(meta.getCategory(), is(CATEGORY)); + assertThat(meta.getTags(), is(TAGS)); + assertThat(meta.getUri(), is(URI)); + assertThat(meta.getDeprecated(), is(DEPRECATED)); + assertThat(meta.getIdentifier(), is(IDENTIFIER)); + assertThat(meta.getProjectTemplate(), is(PROJECT_TEMPLATE)); + assertThat(meta.getLocked(), is(LOCKED)); + assertThat(meta.getUnlisted(), is(UNLISTED)); + } + + @Test + public void testSerialization() throws Exception { + final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, + DEPRECATED, IDENTIFIER, PROJECT_TEMPLATE, LOCKED, UNLISTED); + + assertThat(meta, serializesToJson("/md/meta.json")); + } + +} diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java new file mode 100644 index 000000000..b92e04d19 --- /dev/null +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.UriResponse; +import com.gooddata.project.Project; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpStatus; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class MetadataServiceTest { + + private static final String URI = "TEST_URI"; + private static final String ID = "TEST_ID"; + private static final String PROJECT_ID = "TEST_PROJ_ID"; + + @Mock + private Project project; + @Mock + private RestTemplate restTemplate; + + private MetadataService service; + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new MetadataService(restTemplate); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test(expected = ObjCreateException.class) + public void testCreateObjNullResponse() throws Exception { + final Obj obj = mock(Obj.class); + service.createObj(project, obj); + } + + @Test(expected = ObjCreateException.class) + @SuppressWarnings("unchecked") + public void testCreateObjGDRestException() throws Exception { + final Obj obj = mock(Obj.class); + when(restTemplate.postForObject(Obj.URI, obj, UriResponse.class, PROJECT_ID)) + .thenThrow(GoodDataRestException.class); + service.createObj(project, obj); + } + + @Test(expected = ObjCreateException.class) + public void testCreateObjRestClientException() throws Exception { + final Obj obj = mock(Obj.class); + when(restTemplate.postForObject(Obj.URI, obj, UriResponse.class, PROJECT_ID)) + .thenThrow(new RestClientException("")); + service.createObj(project, obj); + } + + @Test + public void testCreateObj() throws Exception { + final Obj obj = mock(Obj.class); + final Obj resultObj = mock(Obj.class); + final UriResponse uriResp = mock(UriResponse.class); + + when(restTemplate.postForObject(Obj.URI, obj, UriResponse.class, PROJECT_ID)).thenReturn(uriResp); + when(uriResp.getUri()).thenReturn(URI); + when(restTemplate.getForObject(URI, obj.getClass())).thenReturn(resultObj); + + final Obj result = service.createObj(project, obj); + assertThat(result, is(notNullValue())); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetObjByUriNullUri() throws Exception { + service.getObjByUri(null, Obj.class); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetObjByUriNullCls() throws Exception { + service.getObjByUri(URI, null); + } + + @Test(expected = ObjNotFoundException.class) + public void testGetObjByUriNotFound() throws Exception { + final GoodDataRestException restException = mock(GoodDataRestException.class); + when(restException.getStatusCode()).thenReturn(HttpStatus.NOT_FOUND.value()); + when(restTemplate.getForObject(URI, Obj.class)).thenThrow(restException); + + service.getObjByUri(URI, Obj.class); + } + + @Test + public void testGetObjByUri() throws Exception { + final Obj resultObj = mock(Obj.class); + when(restTemplate.getForObject(URI, resultObj.getClass())).thenReturn(resultObj); + + final Obj result = service.getObjByUri(URI, resultObj.getClass()); + assertThat(result, is(resultObj)); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetObjByIdNullProject() throws Exception { + service.getObjById(null, ID, Obj.class); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetObjByIdNullId() throws Exception { + service.getObjById(project, null, Obj.class); + } + + @Test(expected = IllegalArgumentException.class) + public void testGetObjByIdNullCls() throws Exception { + service.getObjById(project, ID, null); + } + + @Test + public void testGetObjById() throws Exception { + final Obj resultObj = mock(Obj.class); + final String uri = format("/gdc/md/%s/obj/%s", PROJECT_ID, ID); + when(restTemplate.getForObject(uri, resultObj.getClass())).thenReturn(resultObj); + + final Obj result = service.getObjById(project, ID, resultObj.getClass()); + assertThat(result, is(resultObj)); + } + +//TODO the other methods + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java new file mode 100644 index 000000000..05261cdbe --- /dev/null +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class MetricTest { + + @Test + public void testDeserialization() throws Exception { + final Metric metric = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/metric.json"), Metric.class); + assertThat(metric, is(notNullValue())); + assertThat(metric.getExpression(), is("[/gdc/md/PROJECT_ID/obj/EXPR_ID]")); + assertThat(metric.getFormat(), is("FORMAT")); + } + + @Test + public void testSerialization() throws Exception { + final Metric metric = new Metric("Person Name", "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", "FORMAT"); + + assertThat(metric, serializesToJson("/md/metric-input.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java new file mode 100644 index 000000000..825ca5778 --- /dev/null +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ObjTest { + + public static final String AUTHOR = "/gdc/account/profile/USER_ID"; + public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; + public static final String CREATED = "2014-04-11 13:45:56"; + public static final String SUMMARY = "Obj summary"; + public static final String TITLE = "Obj title"; + public static final String UPDATED = "2014-04-11 13:45:57"; + public static final String CATEGORY = "attributeDisplayForm"; + public static final String TAGS = "TAG1 TAG2"; + public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; + public static final String DEPRECATED = "0"; + public static final String IDENTIFIER = "attr.person.id.name"; + public static final String PROJECT_TEMPLATE = "/projectTemplates/TYPE/VERSION"; + public static final Integer LOCKED = 0; + public static final Integer UNLISTED = 1; + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/objCommon.json"); + final Obj obj = new ObjectMapper().readValue(stream, ConcreteObj.class); + + assertThat(obj, is(notNullValue())); + assertThat(obj.getAuthor(), is(AUTHOR)); + assertThat(obj.getContributor(), is(CONTRIBUTOR)); + assertThat(obj.getCreated(), is(CREATED)); + assertThat(obj.getSummary(), is(SUMMARY)); + assertThat(obj.getTitle(), is(TITLE)); + assertThat(obj.getUpdated(), is(UPDATED)); + assertThat(obj.getCategory(), is(CATEGORY)); + assertThat(obj.getTags(), is(TAGS)); + assertThat(obj.getUri(), is(URI)); + assertThat(obj.getDeprecated(), is(DEPRECATED)); + assertThat(obj.getIdentifier(), is(IDENTIFIER)); + assertThat(obj.getProjectTemplate(), is(PROJECT_TEMPLATE)); + assertThat(obj.getLocked(), is(LOCKED)); + assertThat(obj.getUnlisted(), is(UNLISTED)); + } + + @Test + public void testSerialization() throws Exception { + final ConcreteObj obj = new ConcreteObj( + new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, DEPRECATED, + IDENTIFIER, PROJECT_TEMPLATE, LOCKED, UNLISTED) + ); + + assertThat(obj, serializesToJson("/md/objCommon.json")); + } + + public static class ConcreteObj extends Obj { + public ConcreteObj(@JsonProperty("meta") Meta meta) { + super(meta); + } + } + +} diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java new file mode 100644 index 000000000..78815f264 --- /dev/null +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class QueryTest { + + @Test + public void testDeserialization() throws Exception { + final Query query = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/query.json"), Query.class); + assertThat(query, is(notNullValue())); + assertThat(query.getCategory(), is("MD::Query::Object")); + assertThat(query.getTitle(), is("List of allTypes")); + assertThat(query.getSummary(), is("Metadata Query Resources for project 'PROJ_ID'")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/RestrictionTest.java b/src/test/java/com/gooddata/md/RestrictionTest.java new file mode 100644 index 000000000..dc3a0eb96 --- /dev/null +++ b/src/test/java/com/gooddata/md/RestrictionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class RestrictionTest { + + @Test + public void testIdentifier() throws Exception { + final Restriction id = Restriction.identifier("my id"); + assertThat(id, is(notNullValue())); + assertThat(id.getType(), is(Restriction.Type.IDENTIFIER)); + assertThat(id.getValue(), is("my id")); + } + + @Test + public void testTitle() throws Exception { + final Restriction id = Restriction.title("my title"); + assertThat(id, is(notNullValue())); + assertThat(id.getType(), is(Restriction.Type.TITLE)); + assertThat(id.getValue(), is("my title")); + } + + @Test + public void testSummary() throws Exception { + final Restriction id = Restriction.summary("my summary"); + assertThat(id, is(notNullValue())); + assertThat(id.getType(), is(Restriction.Type.SUMMARY)); + assertThat(id.getValue(), is("my summary")); + } +} \ 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 new file mode 100644 index 000000000..4af78055a --- /dev/null +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collection; +import java.util.Iterator; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.isOneOf; +import static org.junit.Assert.assertThat; + +public class AttributeInGridTest { + + public static final String URI = "/URI"; + public static final String ALIAS = "ALIAS"; + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/attributeInGrid.json"); + final AttributeInGrid attr = new ObjectMapper().readValue(is, AttributeInGrid.class); + + assertThat(attr, is(notNullValue())); + assertThat(attr.getUri(), is(URI)); + assertThat(attr.getAlias(), is(ALIAS)); + + assertThat(attr.getTotals(), is(notNullValue())); + assertThat(attr.getTotals(), hasSize(2)); + final Iterator> i = attr.getTotals().iterator(); + final Collection subTotal1 = i.next(); + assertThat(subTotal1, hasSize(1)); + assertThat(subTotal1.iterator().next(), is("TOTAL1")); + final Collection subTotal2 = i.next(); + assertThat(subTotal2, hasSize(2)); + assertThat(subTotal2.iterator().next(), isOneOf("TOTAL2", "TOTAL3")); + assertThat(subTotal2.iterator().next(), isOneOf("TOTAL2", "TOTAL3")); + } + + @Test + public void testSerialization() throws Exception { + final Collection> totals = asList((Collection) asList("TOTAL1"), + asList("TOTAL2", "TOTAL3")); + final AttributeInGrid attr = new AttributeInGrid(URI, totals, ALIAS); + assertThat(attr, serializesToJson("/md/report/attributeInGrid.json")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/GridElementTest.java b/src/test/java/com/gooddata/md/report/GridElementTest.java new file mode 100644 index 000000000..5c6f348fd --- /dev/null +++ b/src/test/java/com/gooddata/md/report/GridElementTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class GridElementTest { + + public static final String URI = "/ELEM_URI"; + public static final String ALIAS = "ELEM_ALIAS"; + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/gridElement.json"); + final GridElement element = new ObjectMapper().readValue(is, GridElement.class); + assertThat(element, is(notNullValue())); + assertThat(element.getUri(), is(URI)); + assertThat(element.getAlias(), is(ALIAS)); + } + + @Test + public void testSerialization() throws Exception { + final GridElement element = new GridElement(URI, ALIAS); + assertThat(element, serializesToJson("/md/report/gridElement.json")); + } + +} \ 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 new file mode 100644 index 000000000..f09068133 --- /dev/null +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class GridReportDefinitionContentTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/gridReportDefinitionContent.json"); + final GridReportDefinitionContent def = (GridReportDefinitionContent) new ObjectMapper().readValue(is, ReportDefinitionContent.class); + assertThat(def, is(notNullValue())); + assertThat(def.getFormat(), is("grid")); + assertThat(def.getGrid(), is(notNullValue())); + } + + @Test + public void testSerialization() throws Exception { + final GridReportDefinitionContent def = new GridReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); + assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); + } + +} \ 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 new file mode 100644 index 000000000..43462a64c --- /dev/null +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; + +public class GridTest { + + @Test + public void testDeserialization() throws Exception { + final Grid grid = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/report/grid.json"), Grid.class); + assertThat(grid, is(notNullValue())); + + assertThat(grid.getColumns(), is(notNullValue())); + assertThat(grid.getColumns(), hasSize(1)); + assertThat(grid.getColumns().iterator().next(), is("metricGroup")); + + assertThat(grid.getRows(), is(notNullValue())); + assertThat(grid.getRows(), hasSize(1)); + + assertThat(grid.getMetrics(), is(notNullValue())); + assertThat(grid.getMetrics(), hasSize(1)); + + assertThat(grid.getColumnWidths(), is(notNullValue())); + assertThat(grid.getColumnWidths(), hasSize(1)); + + final Map colWidth = grid.getColumnWidths().iterator().next(); + assertThat((Integer) colWidth.get("width"), is(343)); + } + + + @Test + public void testSerialization() throws Exception { + final Map colWidths = new HashMap<>(); + final Map> sort = new HashMap<>(); + colWidths.put("width", 343); + sort.put("columns", Collections.emptyList()); + sort.put("rows", Collections.emptyList()); + final Grid grid = new Grid(asList("metricGroup"), Collections.emptyList(), + asList(new GridElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); + + assertThat(grid, serializesToJson("/md/report/grid-input.json")); + } + +} \ 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 new file mode 100644 index 000000000..751dd13fc --- /dev/null +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class OneNumberReportDefinitionContentTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinitionContent.json"); + final OneNumberReportDefinitionContent def = (OneNumberReportDefinitionContent) new ObjectMapper() + .readValue(is, ReportDefinitionContent.class); + assertThat(def, is(notNullValue())); + assertThat(def.getFormat(), is("oneNumber")); + assertThat(def.getGrid(), is(notNullValue())); + } + + @Test + public void testSerialization() throws Exception { + final OneNumberReportDefinitionContent def = new OneNumberReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc" + ); + assertThat(def, serializesToJson("/md/report/oneNumberReportDefinitionContent-input.json")); + } + +} \ 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 new file mode 100644 index 000000000..b08d8cf44 --- /dev/null +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ReportDefinitionContentTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/gridReportDefinitionContent.json"); + final ReportDefinitionContent def = new ObjectMapper().readValue(is, ReportDefinitionContent.class); + assertThat(def, is(notNullValue())); + assertThat(def.getFormat(), is("grid")); + assertThat(def.getGrid(), is(notNullValue())); + } + + @Test + public void testSerialization() throws Exception { + final ReportDefinitionContent def = new GridReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); + assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java new file mode 100644 index 000000000..6c7046e7f --- /dev/null +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ReportDefinitionTest { + + public static final String FORMAT = "oneNumber"; + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinition.json"); + final ReportDefinition def = new ObjectMapper().readValue(is, ReportDefinition.class); + assertThat(def, is(notNullValue())); + assertThat(def.getFormat(), is(FORMAT)); + assertThat(def.getGrid(), is(notNullValue())); + } + + @Test + public void testSerialization() throws Exception { + final ReportDefinition def = new ReportDefinition("Untitled", + new OneNumberReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc") + ); + assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); + } + +} \ 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 new file mode 100644 index 000000000..dd5573517 --- /dev/null +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md.report; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; + +public class ReportTest { + + public static final String DEFINITION = "/gdc/md/PROJECT_ID/obj/DEF_ID"; + public static final String DOMAIN = "/gdc/md/PROJECT_ID/obj/DOM_ID"; + + @Test + public void testDeserialization() throws Exception { + final Report report = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/report/report.json"), Report.class); + assertThat(report, is(notNullValue())); + assertThat(report.getDefinitions(), is(notNullValue())); + assertThat(report.getDefinitions(), hasSize(1)); + assertThat(report.getDefinitions().iterator().next(), is(DEFINITION)); + + assertThat(report.getDomains(), is(notNullValue())); + assertThat(report.getDomains(), hasSize(1)); + assertThat(report.getDomains().iterator().next(), is(DOMAIN)); + } + + @Test + public void testSerialization() throws Exception { + final Report report = new Report("Beers Consumed This Week", DEFINITION, DOMAIN); + assertThat(report, serializesToJson("/md/report/report-input.json")); + } + +} \ No newline at end of file diff --git a/src/test/resources/md/attribute-input.json b/src/test/resources/md/attribute-input.json new file mode 100644 index 000000000..bbafb463d --- /dev/null +++ b/src/test/resources/md/attribute-input.json @@ -0,0 +1,22 @@ +{ + "attribute" : { + "content" : { + "pk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/PK_ID", + "type" : "col" + } + ], + "displayForms" : [ ], + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/FK_ID", + "type" : "col" + } + ] + }, + "meta" : { + "title" : "Person ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/attribute.json b/src/test/resources/md/attribute.json index f8f85fcca..b7ce28041 100644 --- a/src/test/resources/md/attribute.json +++ b/src/test/resources/md/attribute.json @@ -3,23 +3,23 @@ "content" : { "pk" : [ { - "data" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/15", + "data" : "/gdc/md/PROJECT_ID/obj/PK_ID", "type" : "col" } ], "displayForms" : [ { "content" : { - "formOf" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/28", - "expression" : "[/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/17]", - "ldmexpression" : "" + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "ldmexpression" : "[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]" }, "links" : { - "elements" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/29/elements" + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" }, "meta" : { - "author" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f", - "uri" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/29", + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", "tags" : "", "created" : "2014-04-11 13:45:56", "identifier" : "attr.person.id.name", @@ -28,14 +28,20 @@ "title" : "Person Name", "category" : "attributeDisplayForm", "updated" : "2014-04-11 13:45:56", - "contributor" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f" + "contributor" : "/gdc/account/profile/USER_ID" } } - ] + ], + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/FK_ID", + "type" : "col" + } + ] }, "meta" : { - "author" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f", - "uri" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/28", + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/28", "tags" : "", "created" : "2014-04-11 13:45:56", "identifier" : "attr.person.id", @@ -44,7 +50,7 @@ "title" : "Person ID", "category" : "attribute", "updated" : "2014-04-11 13:45:56", - "contributor" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f" + "contributor" : "/gdc/account/profile/USER_ID" } } } \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json new file mode 100644 index 000000000..436233ad3 --- /dev/null +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -0,0 +1,13 @@ +{ + "attributeDisplayForm" : { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "default" : 0, + "ldmexpression" : "" + }, + "meta" : { + "title" : "Person Name" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm.json b/src/test/resources/md/attributeDisplayForm.json index 21028831c..171b94f20 100644 --- a/src/test/resources/md/attributeDisplayForm.json +++ b/src/test/resources/md/attributeDisplayForm.json @@ -1,17 +1,17 @@ { "attributeDisplayForm" : { "content" : { - "formOf" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/28", - "expression" : "[/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/17]", + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", "default" : 0, "ldmexpression" : "" }, "links" : { - "elements" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/29/elements" + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" }, "meta" : { - "author" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f", - "uri" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/29", + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", "tags" : "", "created" : "2014-04-11 13:45:56", "identifier" : "attr.person.id.name", @@ -20,7 +20,7 @@ "title" : "Person Name", "category" : "attributeDisplayForm", "updated" : "2014-04-11 13:45:56", - "contributor" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f" + "contributor" : "/gdc/account/profile/USER_ID" } } } \ No newline at end of file diff --git a/src/test/resources/md/displayForm-input.json b/src/test/resources/md/displayForm-input.json new file mode 100644 index 000000000..1bb516670 --- /dev/null +++ b/src/test/resources/md/displayForm-input.json @@ -0,0 +1,11 @@ +{ + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "default" : 0, + "ldmexpression" : "" + }, + "meta" : { + "title" : "Person Name" + } +} \ No newline at end of file diff --git a/src/test/resources/md/displayForm.json b/src/test/resources/md/displayForm.json new file mode 100644 index 000000000..e54d4eedd --- /dev/null +++ b/src/test/resources/md/displayForm.json @@ -0,0 +1,24 @@ +{ + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "default" : 0, + "ldmexpression" : "" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id.name", + "deprecated" : "0", + "summary" : "", + "title" : "Person Name", + "category" : "attributeDisplayForm", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID" + } +} \ No newline at end of file diff --git a/src/test/resources/md/entry.json b/src/test/resources/md/entry.json new file mode 100644 index 000000000..84d5f41e0 --- /dev/null +++ b/src/test/resources/md/entry.json @@ -0,0 +1,15 @@ +{ + "link": "/gdc/md/PROJECT_ID/obj/ENTRY_ID", + "title": "Entry title", + "summary": "Entry summary", + "category": "ENTRY_CATEGORY", + "author": "/gdc/account/profile/AUTHOR_USER_ID", + "contributor": "/gdc/account/profile/CONTRIBUTOR_USER_ID", + "deprecated": "1", + "identifier": "ID", + "locked": 1, + "unlisted": 0, + "tags": "TAG", + "created": "2014-04-11 13:45:54", + "updated": "2014-04-11 13:45:55" +} diff --git a/src/test/resources/md/fact-input.json b/src/test/resources/md/fact-input.json new file mode 100644 index 000000000..022d842e4 --- /dev/null +++ b/src/test/resources/md/fact-input.json @@ -0,0 +1,15 @@ +{ + "fact" : { + "content" : { + "expr" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/COL_ID", + "type" : "col" + } + ] + }, + "meta" : { + "title" : "Person Shoe Size" + } + } +} diff --git a/src/test/resources/md/fact.json b/src/test/resources/md/fact.json index 09d59dc41..2a548a13e 100644 --- a/src/test/resources/md/fact.json +++ b/src/test/resources/md/fact.json @@ -3,23 +3,23 @@ "content" : { "expr" : [ { - "data" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/13", + "data" : "/gdc/md/PROJECT_ID/obj/COL_ID", "type" : "col" } ] }, "meta" : { - "author" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f", - "uri" : "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/obj/35", + "author" : "/gdc/account/profile/AUTHOR_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/FACT_ID", "tags" : "", - "created" : "2014-04-11 13:45:56", + "created" : "2014-04-11 13:45:53", "identifier" : "fact.person.shoesize", "deprecated" : "0", "summary" : "", "title" : "Person Shoe Size", "category" : "fact", - "updated" : "2014-04-11 13:45:56", - "contributor" : "/gdc/account/profile/33410a1a28be3ef934bdee5f6c78d17f" + "updated" : "2014-04-11 13:46:52", + "contributor" : "/gdc/account/profile/CONTRIBUTOR_ID" } } } diff --git a/src/test/resources/md/meta.json b/src/test/resources/md/meta.json new file mode 100644 index 000000000..f248bd567 --- /dev/null +++ b/src/test/resources/md/meta.json @@ -0,0 +1,16 @@ +{ + "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", + "projectTemplate": "/projectTemplates/TYPE/VERSION", + "locked": 0, + "unlisted": 1 +} diff --git a/src/test/resources/md/metric-input.json b/src/test/resources/md/metric-input.json new file mode 100644 index 000000000..2bdf876e8 --- /dev/null +++ b/src/test/resources/md/metric-input.json @@ -0,0 +1,11 @@ +{ + "metric" : { + "content" : { + "expression" : "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", + "format" : "FORMAT" + }, + "meta" : { + "title" : "Person Name" + } + } +} diff --git a/src/test/resources/md/metric.json b/src/test/resources/md/metric.json new file mode 100644 index 000000000..4305b2079 --- /dev/null +++ b/src/test/resources/md/metric.json @@ -0,0 +1,21 @@ +{ + "metric" : { + "content" : { + "expression" : "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", + "format" : "FORMAT" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id.name", + "deprecated" : "0", + "summary" : "", + "title" : "Person Name", + "category" : "attributeDisplayForm", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} diff --git a/src/test/resources/md/objCommon.json b/src/test/resources/md/objCommon.json new file mode 100644 index 000000000..1a57c9cec --- /dev/null +++ b/src/test/resources/md/objCommon.json @@ -0,0 +1,18 @@ +{ + "meta": { + "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", + "projectTemplate": "/projectTemplates/TYPE/VERSION", + "locked": 0, + "unlisted": 1 + } +} \ No newline at end of file diff --git a/src/test/resources/md/query.json b/src/test/resources/md/query.json new file mode 100644 index 000000000..c8ba991d6 --- /dev/null +++ b/src/test/resources/md/query.json @@ -0,0 +1,35 @@ +{ + "query": { + "entries": [ + { + "link": "/gdc/md/PROJ_ID/obj/127", + "author": "/gdc/account/profile/AUTHOR_ID", + "tags": "", + "created": "2009-10-07 19:27:39", + "deprecated": "0", + "summary": "", + "title": "Resource", + "category": "attribute", + "updated": "2009-10-07 19:27:40", + "contributor": "/gdc/account/profile/CONTRIB_ID" + }, + { + "link": "/gdc/md/PROJ_ID/obj/118", + "author": "/gdc/account/profile/AUTHOR_ID", + "tags": "", + "created": "2009-10-07 19:27:45", + "deprecated": "0", + "summary": "", + "category": "attribute", + "title": "Name", + "updated": "2009-11-01 13:09:11", + "contributor": "/gdc/account/profile/CONTRIB_ID" + } + ], + "meta": { + "summary": "Metadata Query Resources for project 'PROJ_ID'", + "title": "List of allTypes", + "category": "MD::Query::Object" + } + } +} diff --git a/src/test/resources/md/report/attributeInGrid.json b/src/test/resources/md/report/attributeInGrid.json new file mode 100644 index 000000000..e6872fefa --- /dev/null +++ b/src/test/resources/md/report/attributeInGrid.json @@ -0,0 +1,7 @@ +{ + "attribute": { + "uri": "/URI", + "totals": [ ["TOTAL1"], ["TOTAL2", "TOTAL3"] ], + "alias": "ALIAS" + } +} diff --git a/src/test/resources/md/report/grid-input.json b/src/test/resources/md/report/grid-input.json new file mode 100644 index 000000000..ff0b3eced --- /dev/null +++ b/src/test/resources/md/report/grid-input.json @@ -0,0 +1,21 @@ +{ + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [ + { + "width": 343 + } + ], + "columns": [ + "metricGroup" + ], + "metrics": [ + { + "alias": "metr", + "uri": "/gdc/md/PROJECT_ID/obj/METR_ID" + } + ], + "rows": [] +} diff --git a/src/test/resources/md/report/grid.json b/src/test/resources/md/report/grid.json new file mode 100644 index 000000000..091da04f3 --- /dev/null +++ b/src/test/resources/md/report/grid.json @@ -0,0 +1,38 @@ +{ + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [ + { + "width": 343, + "locator": [ + { + "metricLocator": { + "uri": "/gdc/md/PROJECT_ID/obj/1493" + } + } + ] + } + ], + "columns": [ + "metricGroup" + ], + "metrics": [ + { + "alias": "metr", + "uri": "/gdc/md/PROJECT_ID/obj/METR_ID" + } + ], + "rows": [ + { + "attribute": { + "alias": "attr", + "totals": [ + [] + ], + "uri": "/gdc/md/PROJECT_ID/obj/ATTR_ID" + } + } + ] +} diff --git a/src/test/resources/md/report/gridElement.json b/src/test/resources/md/report/gridElement.json new file mode 100644 index 000000000..5366a7769 --- /dev/null +++ b/src/test/resources/md/report/gridElement.json @@ -0,0 +1,4 @@ +{ + "uri": "/ELEM_URI", + "alias": "ELEM_ALIAS" +} diff --git a/src/test/resources/md/report/gridReportDefinition.json b/src/test/resources/md/report/gridReportDefinition.json new file mode 100644 index 000000000..7a5a90ec2 --- /dev/null +++ b/src/test/resources/md/report/gridReportDefinition.json @@ -0,0 +1,51 @@ +{ + "reportDefinition" : { + "content" : { + "grid" : { + "sort" : { + "columns" : [], + "rows" : [] + }, + "columnWidths" : [], + "columns" : [ + "metricGroup" + ], + "metrics" : [ + { + "alias" : "", + "uri" : "/gdc/md/PROJECT_ID/obj/1493" + } + ], + "rows" : [ + { + "attribute" : { + "alias" : "", + "totals" : [ + [] + ], + "uri" : "/gdc/md/PROJECT_ID/obj/11786" + } + } + ] + }, + "format" : "grid", + "filters" : [] + }, + "links" : { + "explain2" : "/gdc/md/PROJECT_ID/obj/12132/explain2" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/12132", + "tags" : "", + "created" : "2014-05-23 00:42:10", + "identifier" : "arWchBP3ioa0", + "deprecated" : "0", + "summary" : "", + "title" : "Untitled report definition", + "category" : "reportDefinition", + "updated" : "2014-05-23 00:42:10", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} diff --git a/src/test/resources/md/report/gridReportDefinitionContent-input.json b/src/test/resources/md/report/gridReportDefinitionContent-input.json new file mode 100644 index 000000000..14c44588b --- /dev/null +++ b/src/test/resources/md/report/gridReportDefinitionContent-input.json @@ -0,0 +1,14 @@ +{ + "grid": { + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [], + "columns": [], + "metrics": [], + "rows": [] + }, + "format": "grid", + "filters": [] +} diff --git a/src/test/resources/md/report/gridReportDefinitionContent.json b/src/test/resources/md/report/gridReportDefinitionContent.json new file mode 100644 index 000000000..47cda3202 --- /dev/null +++ b/src/test/resources/md/report/gridReportDefinitionContent.json @@ -0,0 +1,31 @@ +{ + "grid": { + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [], + "columns": [ + "metricGroup" + ], + "metrics": [ + { + "alias": "", + "uri": "/gdc/md/PROJECT_ID/obj/1493" + } + ], + "rows": [ + { + "attribute": { + "alias": "", + "totals": [ + [] + ], + "uri": "/gdc/md/PROJECT_ID/obj/11786" + } + } + ] + }, + "format": "grid", + "filters": [] +} diff --git a/src/test/resources/md/report/oneNumberReportDefinition-input.json b/src/test/resources/md/report/oneNumberReportDefinition-input.json new file mode 100644 index 000000000..c17b83948 --- /dev/null +++ b/src/test/resources/md/report/oneNumberReportDefinition-input.json @@ -0,0 +1,26 @@ +{ + "reportDefinition" : { + "content" : { + "grid" : { + "sort" : { + "columns" : [], + "rows" : [] + }, + "columnWidths" : [], + "columns" : [], + "metrics" : [], + "rows" : [] + }, + "oneNumber" : { + "labels" : { + "description" : "desc" + } + }, + "format" : "oneNumber", + "filters" : [] + }, + "meta" : { + "title" : "Untitled" + } + } +} diff --git a/src/test/resources/md/report/oneNumberReportDefinition.json b/src/test/resources/md/report/oneNumberReportDefinition.json new file mode 100644 index 000000000..b70308ab5 --- /dev/null +++ b/src/test/resources/md/report/oneNumberReportDefinition.json @@ -0,0 +1,44 @@ +{ + "reportDefinition" : { + "content" : { + "grid" : { + "sort" : { + "columns" : [], + "rows" : [] + }, + "columnWidths" : [], + "columns" : [ + "metricGroup" + ], + "metrics" : [ + { + "alias" : "Beers Bought", + "uri" : "/gdc/md/PROJECT_ID/obj/1504" + } + ], + "rows" : [] + }, + "oneNumber" : { + "labels" : {} + }, + "format" : "oneNumber", + "filters" : [] + }, + "links" : { + "explain2" : "/gdc/md/PROJECT_ID/obj/2274/explain2" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/2274", + "tags" : "", + "created" : "2012-08-07 17:56:33", + "identifier" : "meh", + "deprecated" : "0", + "summary" : "", + "title" : "Untitled", + "category" : "reportDefinition", + "updated" : "2012-08-07 17:56:33", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} diff --git a/src/test/resources/md/report/oneNumberReportDefinitionContent-input.json b/src/test/resources/md/report/oneNumberReportDefinitionContent-input.json new file mode 100644 index 000000000..18c99f1ec --- /dev/null +++ b/src/test/resources/md/report/oneNumberReportDefinitionContent-input.json @@ -0,0 +1,19 @@ +{ + "grid": { + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [], + "columns": [], + "metrics": [], + "rows": [] + }, + "oneNumber": { + "labels": { + "description" : "desc" + } + }, + "format": "oneNumber", + "filters": [] +} diff --git a/src/test/resources/md/report/oneNumberReportDefinitionContent.json b/src/test/resources/md/report/oneNumberReportDefinitionContent.json new file mode 100644 index 000000000..50dcb715d --- /dev/null +++ b/src/test/resources/md/report/oneNumberReportDefinitionContent.json @@ -0,0 +1,53 @@ +{ + "grid": { + "sort": { + "columns": [], + "rows": [] + }, + "columnWidths": [], + "columns": [ + "metricGroup" + ], + "metrics": [ + { + "alias": "Beers Bought", + "uri": "/gdc/md/PROJECT_ID/obj/1504" + } + ], + "rows": [] + }, + "oneNumber": { + "labels": {} + }, + "format": "oneNumber", + "filters": [ + { + "tree": { + "content": [ + { + "value": "/gdc/md/PROJECT_ID/obj/980", + "position": { + "column": 1, + "line": 2 + }, + "type": "attribute object" + }, + { + "value": "ThisWeek", + "position": { + "column": 30, + "line": 2 + }, + "type": "identifier" + } + ], + "position": { + "column": 28, + "line": 2 + }, + "type": "=" + }, + "expression": "[/gdc/md/PROJECT_ID/obj/980] = {ThisWeek}" + } + ] +} diff --git a/src/test/resources/md/report/report-input.json b/src/test/resources/md/report/report-input.json new file mode 100644 index 000000000..51963d408 --- /dev/null +++ b/src/test/resources/md/report/report-input.json @@ -0,0 +1,15 @@ +{ + "report" : { + "content" : { + "domains" : [ + "/gdc/md/PROJECT_ID/obj/DOM_ID" + ], + "definitions" : [ + "/gdc/md/PROJECT_ID/obj/DEF_ID" + ] + }, + "meta" : { + "title" : "Beers Consumed This Week" + } + } +} diff --git a/src/test/resources/md/report/report.json b/src/test/resources/md/report/report.json new file mode 100644 index 000000000..f0a948db6 --- /dev/null +++ b/src/test/resources/md/report/report.json @@ -0,0 +1,25 @@ +{ + "report" : { + "content" : { + "domains" : [ + "/gdc/md/PROJECT_ID/obj/DOM_ID" + ], + "definitions" : [ + "/gdc/md/PROJECT_ID/obj/DEF_ID" + ] + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/2276", + "tags" : "", + "created" : "2012-08-07 17:56:33", + "identifier" : "muhehe", + "deprecated" : "0", + "summary" : "This number shows the beers consumed.", + "title" : "Beers Consumed This Week", + "category" : "report", + "updated" : "2012-08-07 17:56:33", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} From 2a7dad5fba6a12b37e6344cd7ee2525af676a572 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 3 Jun 2014 17:33:49 +0200 Subject: [PATCH 0002/1191] Remove useless TODO comments --- src/main/java/com/gooddata/dataset/DatasetManifest.java | 2 +- src/main/java/com/gooddata/dataset/Pull.java | 2 +- src/main/java/com/gooddata/dataset/PullTask.java | 2 +- src/main/java/com/gooddata/dataset/PullTaskStatus.java | 2 +- src/main/java/com/gooddata/model/MaqlDdl.java | 2 +- src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java | 2 +- src/main/java/com/gooddata/model/ModelDiff.java | 2 +- src/main/java/com/gooddata/model/ModelService.java | 2 +- src/main/java/com/gooddata/report/ReportService.java | 2 +- src/test/java/com/gooddata/dataset/DatasetManifestTest.java | 3 --- src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java | 3 --- 11 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 1a6fda550..fd0c00422 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -14,7 +14,7 @@ import java.util.Map; /** - * TODO + * Dataset manifest */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("dataSetSLIManifest") diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index fe8b8ebde..008924a7f 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -8,7 +8,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * TODO + * ETL Pull DTO (for internal use) */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index dacc89389..70aa63f87 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -11,7 +11,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * TODO + * ETL Pull task (for internal use) */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("pullTask") diff --git a/src/main/java/com/gooddata/dataset/PullTaskStatus.java b/src/main/java/com/gooddata/dataset/PullTaskStatus.java index 6a44b0540..c2d1885dd 100644 --- a/src/main/java/com/gooddata/dataset/PullTaskStatus.java +++ b/src/main/java/com/gooddata/dataset/PullTaskStatus.java @@ -7,7 +7,7 @@ import org.codehaus.jackson.annotate.JsonProperty; /** - * TODO + * ETL Pull task status (for internal use) */ public class PullTaskStatus { diff --git a/src/main/java/com/gooddata/model/MaqlDdl.java b/src/main/java/com/gooddata/model/MaqlDdl.java index c4a0e631a..f4b724450 100644 --- a/src/main/java/com/gooddata/model/MaqlDdl.java +++ b/src/main/java/com/gooddata/model/MaqlDdl.java @@ -11,7 +11,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * TODO + * MAQL DDL statement */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("manage") diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java index 131c67cc2..776b39a4a 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java @@ -11,7 +11,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * TODO + * MAQL DDL task status */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("wTaskStatus") diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index c433b55a1..4383590c7 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -14,7 +14,7 @@ import java.util.List; /** - * TODO + * Model diff */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("projectModelDiff") diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index ff2401496..dac28c345 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -16,7 +16,7 @@ import static com.gooddata.Validate.notNull; /** - * TODO + * Service for manipulating with project model */ public class ModelService extends AbstractService { diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index dfa0c2648..8435c4c2c 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -19,7 +19,7 @@ import static org.springframework.http.HttpMethod.POST; /** - * TODO + * Service for report execution and export */ public class ReportService extends AbstractService { diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 1237647f3..89c2a7c27 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -8,9 +8,6 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; -/** - * TODO - */ public class DatasetManifestTest { private static final String SERIALIZED = "{\n" diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index c3ab956f1..63690d3cb 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -8,9 +8,6 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; -/** - * TODO - */ public class MaqlDdlTaskStatusTest { @Test From b0960873dc1ebe889a8cda54ab6720b04b8ea9ce Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 3 Jun 2014 18:20:08 +0200 Subject: [PATCH 0003/1191] tweak gdc and add gdc test --- .../com/gooddata/gdc/DataStoreService.java | 2 +- src/main/java/com/gooddata/gdc/Gdc.java | 232 ++++++++++++++++-- src/test/java/com/gooddata/gdc/GdcTest.java | 34 +++ src/test/resources/gdc/gdc.json | 86 +++++++ 4 files changed, 334 insertions(+), 20 deletions(-) create mode 100644 src/test/java/com/gooddata/gdc/GdcTest.java create mode 100644 src/test/resources/gdc/gdc.json diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 7d2a41a81..6d6184235 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -30,7 +30,7 @@ public DataStoreService(HttpClientBuilder httClientBuilder, GdcService gdcServic private UriPrefixer getPrefixer() { if (prefixer == null) { - final String webDAVUri = gdcService.getGdc().getLink("uploads").getLink(); + final String webDAVUri = gdcService.getGdc().getUserStagingLink(); prefixer = new UriPrefixer(webDAVUri); sardine.enablePreemptiveAuthentication(prefixer.getDefaultUri().getHost()); } diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index d8ebdd06f..2ee143010 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -4,16 +4,17 @@ package com.gooddata.gdc; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import java.util.Collection; import java.util.List; /** + * GoodData API root response (aka "about" or "home") */ @JsonTypeName("about") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -21,43 +22,155 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Gdc { + /** + * URI of GoodData API root + */ public static final String URI = "/gdc"; - private final String category; - private final String summary; private final List links; @JsonCreator - public Gdc(@JsonProperty("category") String category, @JsonProperty("summary") String summary, - @JsonProperty("links") List links) { - this.category = category; - this.summary = summary; + public Gdc(@JsonProperty("links") List links) { this.links = links; } - public String getCategory() { - return category; + /** + * Get GoodData API root link + * @return GoodData API root link + */ + @JsonIgnore + public String getHomeLink() { + return getLink(LinkCategory.HOME).getUri(); } - public String getSummary() { - return summary; + /** + * Get temporary token generator link + * @return temporary token generator link + */ + @JsonIgnore + public String getTokenLink() { + return getLink(LinkCategory.TOKEN).getUri(); } - public Collection getLinks() { - return links; + /** + * Get authentication service link + * @return authentication service link + */ + @JsonIgnore + public String getLoginLink() { + return getLink(LinkCategory.LOGIN).getUri(); } - public Link getLink(String category) { - for (Link link: links) { - if (category.equals(link.getCategory())) { + /** + * Get metadata resources link + * @return metadata resources link + */ + @JsonIgnore + public String getMetadataLink() { + return getLink(LinkCategory.METADATA).getUri(); + } + + /** + * Get report execution resource link + * @return report execution resource link + */ + @JsonIgnore + public String getXTabLink() { + return getLink(LinkCategory.XTAB).getUri(); + } + + /** + * Get link of resource used to determine valid attribute values in the context of a report + * @return link of resource used to determine valid attribute values in the context of a report + */ + @JsonIgnore + public String getAvailableElementsLink() { + return getLink(LinkCategory.AVAILABLE_ELEMENTS).getUri(); + } + + /** + * Get report exporting resource link + * @return report exporting resource link + */ + @JsonIgnore + public String getReportExporterLink() { + return getLink(LinkCategory.REPORT_EXPORTER).getUri(); + } + + /** + * Get account manipulation resource link + * @return account manipulation resource link + */ + @JsonIgnore + public String getAccountLink() { + return getLink(LinkCategory.ACCOUNT).getUri(); + } + + /** + * Get user and project management resource link + * @return user and project management resource link + */ + @JsonIgnore + public String getProjectsLink() { + return getLink(LinkCategory.PROJECTS).getUri(); + } + + /** + * Get miscellaneous tool resource link + * @return miscellaneous tool resource link + */ + @JsonIgnore + public String getToolLink() { + return getLink(LinkCategory.TOOL).getUri(); + } + + /** + * Get template resource link + * @return template resource link + */ + @JsonIgnore + public String getTemplatesLink() { + return getLink(LinkCategory.TEMPLATES).getUri(); + } + + /** + * Get release information link + * @return release information link + */ + @JsonIgnore + public String getReleaseInfoLink() { + return getLink(LinkCategory.RELEASE_INFO).getUri(); + } + + /** + * Get user data staging area link + * @return user data staging area link + */ + @JsonIgnore + public String getUserStagingLink() { + return getLink(LinkCategory.USER_STAGING).getUri(); + } + + /** + * Get link by category + * @param category requested link category + * @return link by given category + */ + @JsonIgnore + private Link getLink(LinkCategory category) { + for (Link link : links) { + if (category.value.equals(link.getCategory())) { return link; } } return null; } + /** + * GoodData API root link + */ @JsonIgnoreProperties(ignoreUnknown = true) - public static class Link { + private static class Link { private final String category; private final String link; private final String summary; @@ -72,20 +185,101 @@ public Link(@JsonProperty("category") String category, @JsonProperty("link") Str this.title = title; } + /** + * Get link category + * @return link category + */ public String getCategory() { return category; } - public String getLink() { + /** + * Get link URI + * @return link URI + */ + public String getUri() { return link; } + /** + * Get link summary + * @return link summary + */ public String getSummary() { return summary; } + /** + * Get link title + * @return link title + */ public String getTitle() { return title; } } -} + + /** + * GoodData API root link category enum + */ + private static enum LinkCategory { + /** + * GoodData API root + */ + HOME("home"), + /** + * Temporary token generator + */ + TOKEN("token"), + /** + * Authentication service + */ + LOGIN("login"), + /** + * Metadata resources + */ + METADATA("md"), + /** + * Report execution resource + */ + XTAB("xtab"), + /** + * Resource used to determine valid attribute values in the context of a report + */ + AVAILABLE_ELEMENTS("availablelements"), + /** + * Report exporting resource + */ + REPORT_EXPORTER("report-exporter"), + /** + * Resource for logged in account manipulation + */ + ACCOUNT("account"), + /** + * Resource for user and project management + */ + PROJECTS("projects"), + /** + * Miscellaneous resources + */ + TOOL("tool"), + /** + * Template resource - for internal use only + */ + TEMPLATES("templates"), + /** + * Release information + */ + RELEASE_INFO("releaseInfo"), + /** + * User data staging area + */ + USER_STAGING("uploads"); + + private final String value; + + private LinkCategory(final String value) { + this.value = value; + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java new file mode 100644 index 000000000..8596e3604 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -0,0 +1,34 @@ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class GdcTest { + + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); + final Gdc gdc = new ObjectMapper().readValue(stream, Gdc.class); + assertThat(gdc, is(notNullValue())); + + assertThat(gdc.getHomeLink(), is("/gdc/")); + assertThat(gdc.getTokenLink(), is("/gdc/account/token")); + assertThat(gdc.getLoginLink(), is("/gdc/account/login")); + assertThat(gdc.getMetadataLink(), is("/gdc/md")); + assertThat(gdc.getXTabLink(), is("/gdc/xtab2")); + assertThat(gdc.getAvailableElementsLink(), is("/gdc/availableelements")); + assertThat(gdc.getReportExporterLink(), is("/gdc/exporter")); + assertThat(gdc.getAccountLink(), is("/gdc/account")); + assertThat(gdc.getProjectsLink(), is("/gdc/projects")); + assertThat(gdc.getToolLink(), is("/gdc/tool")); + assertThat(gdc.getTemplatesLink(), is("/gdc/templates")); + assertThat(gdc.getReleaseInfoLink(), is("/gdc/releaseInfo")); + assertThat(gdc.getUserStagingLink(), is("https://STAGING")); + } +} \ No newline at end of file diff --git a/src/test/resources/gdc/gdc.json b/src/test/resources/gdc/gdc.json new file mode 100644 index 000000000..289953e5c --- /dev/null +++ b/src/test/resources/gdc/gdc.json @@ -0,0 +1,86 @@ +{ + "about" : { + "summary" : "Use links to navigate the services.", + "category" : "GoodData API root", + "links" : [ + { + "link" : "/gdc/", + "summary" : "", + "title" : "home", + "category" : "home" + }, + { + "link" : "/gdc/account/token", + "summary" : "Temporary token generator.", + "title" : "token", + "category" : "token" + }, + { + "link" : "/gdc/account/login", + "summary" : "Authentication service.", + "title" : "login", + "category" : "login" + }, + { + "link" : "/gdc/md", + "summary" : "Metadata resources.", + "title" : "metadata", + "category" : "md" + }, + { + "link" : "/gdc/xtab2", + "summary" : "Report execution resource.", + "title" : "xtab", + "category" : "xtab" + }, + { + "link" : "/gdc/availableelements", + "summary" : "Resource used to determine valid attribute values in the context of a report.", + "title" : "AvailableElements", + "category" : "availablelements" + }, + { + "link" : "/gdc/exporter", + "summary" : "Report exporting resource.", + "title" : "exporter", + "category" : "report-exporter" + }, + { + "link" : "/gdc/account", + "summary" : "Resource for logged in account manipulation.", + "title" : "account", + "category" : "account" + }, + { + "link" : "/gdc/projects", + "summary" : "Resource for user and project management.", + "title" : "projects", + "category" : "projects" + }, + { + "link" : "/gdc/tool", + "summary" : "Miscellaneous resources.", + "title" : "tool", + "category" : "tool" + }, + { + "link" : "/gdc/templates", + "summary" : "Template resource - for internal use only.", + "title" : "templates", + "category" : "templates" + }, + { + "link" : "/gdc/releaseInfo", + "summary" : "Release information.", + "title" : "releaseInfo", + "category" : "releaseInfo" + }, + { + "link" : "https://STAGING", + "summary" : "User data staging area.", + "title" : "user-uploads", + "category" : "uploads" + } + ] + } +} From d278bd9e3411e986cb7b4c46e995eea688e13f13 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 3 Jun 2014 18:39:33 +0200 Subject: [PATCH 0004/1191] add jadler integration test for gdc --- pom.xml | 19 ++++++++++ src/main/java/com/gooddata/GoodData.java | 27 +++++++++----- .../java/com/gooddata/AbstractGoodDataIT.java | 35 +++++++++++++++++++ .../java/com/gooddata/gdc/GdcServiceIT.java | 26 ++++++++++++++ 4 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 src/test/java/com/gooddata/AbstractGoodDataIT.java create mode 100644 src/test/java/com/gooddata/gdc/GdcServiceIT.java diff --git a/pom.xml b/pom.xml index 630335b7a..87e023b93 100644 --- a/pom.xml +++ b/pom.xml @@ -73,6 +73,19 @@ + + org.apache.maven.plugins + maven-failsafe-plugin + 2.17 + + + + integration-test + verify + + + + @@ -142,6 +155,12 @@ 1.2.17 test + + net.jadler + jadler-all + 1.1.0 + test + diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 23c7212f7..096077fa7 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -16,7 +16,6 @@ import com.gooddata.report.ReportService; import org.apache.http.HttpHost; import org.apache.http.client.HttpClient; -import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.VersionInfo; import org.springframework.http.MediaType; @@ -54,12 +53,17 @@ public GoodData(String login, String password) { } public GoodData(String hostname, String login, String password) { + this(hostname, login, password, PORT, PROTOCOL); + } + + public GoodData(String hostname, String login, String password, int port, String protocol) { notEmpty(hostname, "hostname"); notEmpty(login, "login"); notEmpty(password, "password"); + notEmpty(protocol, "protocol"); final HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() .setUserAgent(getUserAgent()); - final RestTemplate restTemplate = createRestTemplate(hostname, login, password, httpClientBuilder); + final RestTemplate restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, protocol); accountService = new AccountService(restTemplate); projectService = new ProjectService(restTemplate, accountService); @@ -71,15 +75,12 @@ public GoodData(String hostname, String login, String password) { reportService = new ReportService(restTemplate); } - private RestTemplate createRestTemplate(String hostname, String login, String password, HttpClientBuilder httpClientBuilder) { - final HttpHost host = new HttpHost(hostname, PORT, PROTOCOL); - final CloseableHttpClient httpClient = httpClientBuilder.build(); - final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(httpClient, host, login, password); - - final HttpClient client = new GoodDataHttpClient(httpClient, strategy); + private RestTemplate createRestTemplate(String login, String password, String hostname, HttpClientBuilder builder, + int port, String protocol) { + final HttpClient client = createHttpClient(login, password, hostname, port, protocol, builder); final UriPrefixingClientHttpRequestFactory factory = new UriPrefixingClientHttpRequestFactory( - new HttpComponentsClientHttpRequestFactory(client), hostname, PORT, PROTOCOL); + new HttpComponentsClientHttpRequestFactory(client), hostname, port, protocol); final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); @@ -87,6 +88,14 @@ private RestTemplate createRestTemplate(String hostname, String login, String pa return restTemplate; } + protected HttpClient createHttpClient(final String login, final String password, final String hostname, + final int port, final String protocol, final HttpClientBuilder builder) { + final HttpHost host = new HttpHost(hostname, port, protocol); + final HttpClient httpClient = builder.build(); + final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(httpClient, host, login, password); + return new GoodDataHttpClient(httpClient, strategy); + } + 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/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java new file mode 100644 index 000000000..a979b2942 --- /dev/null +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.junit.After; +import org.junit.Before; + +import static net.jadler.Jadler.closeJadler; +import static net.jadler.Jadler.initJadler; +import static net.jadler.Jadler.port; + +public abstract class AbstractGoodDataIT { + + protected GoodData gd; + + @Before + public void setUp() { + initJadler().that().respondsWithDefaultContentType("application/json"); + gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http") { + @Override + protected HttpClient createHttpClient(final String login, final String password, final String hostname, + final int port, final String protocol, final HttpClientBuilder builder) { + return builder.build(); + } + }; + } + + @After + public void tearDown() { + closeJadler(); + } +} diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java new file mode 100644 index 000000000..e6b91cd06 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -0,0 +1,26 @@ +package com.gooddata.gdc; + +import com.gooddata.AbstractGoodDataIT; +import org.junit.Test; + +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class GdcServiceIT extends AbstractGoodDataIT { + + @Test + public void shouldReturnGdc() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .respond() + .withBody(getClass().getResourceAsStream("/gdc/gdc.json")) + .withStatus(200); + + final Gdc gdc = gd.getGdcService().getGdc(); + assertThat(gdc, is(notNullValue())); + assertThat(gdc.getUserStagingLink(), is("https://STAGING")); + } +} From 8d1f520071839f2a706e42003bb190849e43598d Mon Sep 17 00:00:00 2001 From: Li Ry Date: Tue, 3 Jun 2014 18:45:18 +0200 Subject: [PATCH 0005/1191] tweak project and add project test --- src/main/java/com/gooddata/md/Meta.java | 5 + .../java/com/gooddata/project/Project.java | 343 ++++++++++++++++-- .../com/gooddata/project/ProjectService.java | 2 +- src/test/java/com/gooddata/Example.java | 2 +- .../com/gooddata/project/ProjectTest.java | 78 ++++ src/test/resources/project/project.json | 39 ++ 6 files changed, 442 insertions(+), 27 deletions(-) create mode 100644 src/test/java/com/gooddata/project/ProjectTest.java create mode 100644 src/test/resources/project/project.json diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 74e7ca115..c79bbc021 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -69,6 +69,11 @@ public Meta(String title) { this.title = title; } + public Meta(String title, String summary) { + this.title = title; + this.summary = summary; + } + public String getAuthor() { return author; } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 780d4f937..784a04e5d 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -3,6 +3,7 @@ */ package com.gooddata.project; +import com.gooddata.md.Meta; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -13,6 +14,7 @@ import org.springframework.web.util.UriTemplate; /** + * Project in GoodData platform */ @JsonTypeName("project") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -24,75 +26,306 @@ public class Project { public static final String PROJECT_URI = Projects.URI + "/{id}"; public static final UriTemplate PROJECT_TEMPLATE = new UriTemplate(PROJECT_URI); - private Content content; + @JsonProperty("content") + private ProjectContent content; + + @JsonProperty("meta") private Meta meta; + + @JsonIgnore private Links links; public Project(String title, String authorizationToken) { - content = new Content(authorizationToken); + content = new ProjectContent(authorizationToken); meta = new Meta(title); } + public Project(String title, String summary, String authorizationToken) { + content = new ProjectContent(authorizationToken); + meta = new Meta(title, summary); + } + @JsonCreator - public Project(@JsonProperty("content") Content content, @JsonProperty("meta") Meta meta, @JsonProperty("links") Links links) { + private Project(@JsonProperty("content") ProjectContent content, @JsonProperty("meta") Meta meta, + @JsonProperty("links") Links links) { this.content = content; this.meta = meta; this.links = links; } - public Content getContent() { - return content; + @JsonIgnore + public String getId() { + return PROJECT_TEMPLATE.match(getSelfLink()).get("id"); } @JsonIgnore - public String getId() { - return PROJECT_TEMPLATE.match(getLinks().getSelf()).get("id"); + public String getState() { + return content.getState(); + } + + @JsonIgnore + public String getAuthorizationToken() { + return content.getAuthorizationToken(); + } + + @JsonIgnore + public String getDriver() { + return content.getDriver(); + } + + @JsonIgnore + public String getGuidedNavigation() { + return content.getGuidedNavigation(); + } + + @JsonIgnore + public String getCluster() { + return content.getCluster(); + } + + @JsonIgnore + public Boolean isPublic() { + return "1".equals(content.getIsPublic()); + } + + @JsonIgnore + public String getTitle() { + return meta.getTitle(); + } + + @JsonIgnore + public String getSummary() { + return meta.getSummary(); + } + + @JsonIgnore + public String getAuthor() { + return meta.getAuthor(); + } + + @JsonIgnore + public String getContributor() { + return meta.getContributor(); } - public Meta getMeta() { - return meta; + @JsonIgnore + public String getCreated() { + return meta.getCreated(); + } + + @JsonIgnore + public String getUpdated() { + return meta.getUpdated(); + } + + @JsonIgnore + public String getSelfLink() { + return links.getSelf(); + } + + @JsonIgnore + public String getUsersLink() { + return links.getUsers(); } - public Links getLinks() { - return links; + @JsonIgnore + public String getRolesLink() { + return links.getRoles(); + } + + @JsonIgnore + public String getGroupsLink() { + return links.getGroups(); + } + + @JsonIgnore + public String getInvitationsLink() { + return links.getInvitations(); + } + + @JsonIgnore + public String getLdmLink() { + return links.getLdm(); + } + + @JsonIgnore + public String getLdmThumbnailLink() { + return links.getLdmThumbnail(); + } + + @JsonIgnore + public String getMetadataLink() { + return links.getMetadata(); + } + + @JsonIgnore + public String getPublicArtifactsLink() { + return links.getPublicArtifacts(); + } + + @JsonIgnore + public String getTemplatesLink() { + return links.getTemplates(); + } + + @JsonIgnore + public String getConnectorsLink() { + return links.getConnectors(); } + @JsonIgnore + public String getDataLoadLink() { + return links.getDataLoad(); + } + + @JsonIgnore + public String getSchedulesLink() { + return links.getSchedules(); + } + + @JsonIgnore + public String getExecuteLink() { + return links.getExecute(); + } + + @JsonIgnore + public String getEventStoresLink() { + return links.getEventStores(); + } + + @JsonIgnore + public String getClearCachesLink() { + return links.getClearCaches(); + } + + @JsonIgnore + public String getUploadsLink() { + return links.getUploads(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Content { - private @JsonProperty String authorizationToken; - private @JsonProperty Integer guidedNavigation = 1; + private static class ProjectContent { + + @JsonProperty("authorizationToken") + private String authorizationToken; + + @JsonProperty("driver") + private String driver; + + @JsonProperty("guidedNavigation") + private String guidedNavigation; + + @JsonIgnore + private String cluster; + + @JsonIgnore + private String isPublic; + + @JsonIgnore private String state; @JsonCreator - public Content(@JsonProperty("authorizationToken") String authorizationToken) { + public ProjectContent(@JsonProperty("authorizationToken") String authorizationToken, + @JsonProperty("driver") String driver, + @JsonProperty("cluster") String cluster, + @JsonProperty("guidedNavigation") String guidedNavigation, + @JsonProperty("isPublic") String isPublic, + @JsonProperty("state") String state) { this.authorizationToken = authorizationToken; + this.guidedNavigation = guidedNavigation; + this.driver = driver; + this.cluster = cluster; + this.isPublic = isPublic; + this.state = state; + } + + public ProjectContent(final String authorizationToken) { + this.authorizationToken = authorizationToken; + guidedNavigation = "1"; + driver = "Pg"; } public String getState() { return state; } - } - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - public static class Meta { - private @JsonProperty String title; + public String getAuthorizationToken() { + return authorizationToken; + } - @JsonCreator - public Meta(@JsonProperty("title") String title) { - this.title = title; + public String getDriver() { + return driver; + } + + public String getGuidedNavigation() { + return guidedNavigation; + } + + public String getCluster() { + return cluster; + } + + public String getIsPublic() { + return isPublic; } } @JsonIgnoreProperties(ignoreUnknown = true) - public static class Links { + private static class Links { private final String self; + private final String users; + private final String roles; + private final String groups; + private final String invitations; + private final String ldm; + private final String ldmThumbnail; + private final String metadata; + private final String publicArtifacts; + private final String templates; + private final String connectors; + private final String dataLoad; + private final String schedules; + private final String execute; + private final String eventStores; + private final String clearCaches; private final String uploads; @JsonCreator - public Links(@JsonProperty("self") String self, @JsonProperty("uploads") String uploads) { + public Links(@JsonProperty("self") String self, + @JsonProperty("users") String users, + @JsonProperty("roles") String roles, + @JsonProperty("groups") String groups, + @JsonProperty("invitations") String invitations, + @JsonProperty("ldm") String ldm, + @JsonProperty("ldm_thumbnail") String ldmThumbnail, + @JsonProperty("metadata") String metadata, + @JsonProperty("publicartifacts") String publicArtifacts, + @JsonProperty("templates") String templates, + @JsonProperty("connectors") String connectors, + @JsonProperty("dataload") String dataLoad, + @JsonProperty("schedules") String schedules, + @JsonProperty("execute") String execute, + @JsonProperty("eventstores") String eventStores, + @JsonProperty("clearCaches") String clearCaches, + @JsonProperty("uploads") String uploads) { this.self = self; + this.users = users; + this.roles = roles; + this.groups = groups; + this.invitations = invitations; + this.ldm = ldm; + this.ldmThumbnail = ldmThumbnail; + this.metadata = metadata; + this.publicArtifacts = publicArtifacts; + this.templates = templates; + this.connectors = connectors; + this.dataLoad = dataLoad; + this.schedules = schedules; + this.execute = execute; + this.eventStores = eventStores; + this.clearCaches = clearCaches; this.uploads = uploads; } @@ -100,6 +333,66 @@ public String getSelf() { return self; } + public String getUsers() { + return users; + } + + public String getRoles() { + return roles; + } + + public String getGroups() { + return groups; + } + + public String getInvitations() { + return invitations; + } + + public String getLdm() { + return ldm; + } + + public String getLdmThumbnail() { + return ldmThumbnail; + } + + public String getMetadata() { + return metadata; + } + + public String getPublicArtifacts() { + return publicArtifacts; + } + + public String getTemplates() { + return templates; + } + + public String getConnectors() { + return connectors; + } + + public String getDataLoad() { + return dataLoad; + } + + public String getSchedules() { + return schedules; + } + + public String getExecute() { + return execute; + } + + public String getEventStores() { + return eventStores; + } + + public String getClearCaches() { + return clearCaches; + } + public String getUploads() { return uploads; } diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index b834dad00..031cc1efc 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -70,7 +70,7 @@ public Project createProject(Project project) { @Override public boolean finished(ClientHttpResponse response) throws IOException { final Project project = extractData(response, Project.class); - return "ENABLED".equalsIgnoreCase(project.getContent().getState()); + return "ENABLED".equalsIgnoreCase(project.getState()); } }, Project.class diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 80f5bb20a..ae6c521cb 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -32,7 +32,7 @@ public static void main(String... args) { System.out.println(projects); final Project project = projectService.createProject(new Project("sparkling", "pgroup2")); - System.out.println(project.getLinks().getSelf()); + System.out.println(project.getSelfLink()); final MetadataService md = gd.getMetadataService(); diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java new file mode 100644 index 000000000..66a18cc9b --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -0,0 +1,78 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.junit.Assert.assertThat; + +public class ProjectTest { + + @Test + public void testDeserialize() throws Exception { + final Project project = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); + assertThat(project, is(notNullValue())); + + assertThat(project.getAuthorizationToken(), is("AUTH_TOKEN")); + assertThat(project.getDriver(), is("Pg")); + assertThat(project.getGuidedNavigation(), is("1")); + assertThat(project.getCluster(), is("CLUSTER")); + assertThat(project.isPublic(), is(false)); + assertThat(project.getState(), is("ENABLED")); + + assertThat(project.getTitle(), is("TITLE")); + assertThat(project.getSummary(), is("DESC")); + assertThat(project.getAuthor(), is("/gdc/account/profile/USER_ID")); + assertThat(project.getContributor(), is("/gdc/account/profile/CONTRIB_USER_ID")); + assertThat(project.getCreated(), is("2014-04-11 11:43:45")); + assertThat(project.getUpdated(), is("2014-04-11 11:43:47")); + + assertThat(project.getLdmThumbnailLink(), is("/gdc/projects/PROJECT_ID/ldm?thumbnail=1")); + assertThat(project.getSelfLink(), is("/gdc/projects/PROJECT_ID")); + assertThat(project.getClearCachesLink(), is("/gdc/projects/PROJECT_ID/clearCaches")); + assertThat(project.getInvitationsLink(), is("/gdc/projects/PROJECT_ID/invitations")); + assertThat(project.getUsersLink(), is("/gdc/projects/PROJECT_ID/users?link=1")); + assertThat(project.getGroupsLink(), is("/gdc/projects/PROJECT_ID/groups")); + assertThat(project.getUploadsLink(), is("https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/")); + assertThat(project.getLdmLink(), is("/gdc/projects/PROJECT_ID/ldm")); + assertThat(project.getMetadataLink(), is("/gdc/md/PROJECT_ID")); + assertThat(project.getPublicArtifactsLink(), is("/gdc/projects/PROJECT_ID/publicartifacts")); + assertThat(project.getRolesLink(), is("/gdc/projects/PROJECT_ID/roles")); + assertThat(project.getDataLoadLink(), is("/gdc/projects/PROJECT_ID/dataload")); + assertThat(project.getConnectorsLink(), is("/gdc/projects/PROJECT_ID/connectors")); + assertThat(project.getExecuteLink(), is("/gdc/projects/PROJECT_ID/execute")); + assertThat(project.getSchedulesLink(), is("/gdc/projects/PROJECT_ID/schedules")); + assertThat(project.getTemplatesLink(), is("/gdc/md/PROJECT_ID/templates")); + assertThat(project.getEventStoresLink(), is("/gdc/projects/PROJECT_ID/dataload/eventstore/stores")); + } + + @Test + public void testSerialize() throws Exception { + final String serializedProject = new ObjectMapper().writeValueAsString(new Project("TITLE", "SUMMARY", "TOKEN")); + + assertThat(serializedProject, startsWith("{\"project\"")); + + assertThat(serializedProject, containsString("\"content\"")); + assertThat(serializedProject, containsString("\"authorizationToken\":\"TOKEN\"")); + assertThat(serializedProject, containsString("\"driver\":\"Pg\"")); + assertThat(serializedProject, containsString("\"guidedNavigation\":\"1\"")); + assertThat(serializedProject, not(containsString("\"cluster\""))); + assertThat(serializedProject, not(containsString("\"isPublic\""))); + assertThat(serializedProject, not(containsString("\"state\""))); + + assertThat(serializedProject, containsString("\"meta\"")); + assertThat(serializedProject, containsString("\"title\":\"TITLE\"")); + assertThat(serializedProject, containsString("\"summary\":\"SUMMARY\"")); + assertThat(serializedProject, not(containsString("\"author\""))); + assertThat(serializedProject, not(containsString("\"contributor\""))); + assertThat(serializedProject, not(containsString("\"created\""))); + assertThat(serializedProject, not(containsString("\"updated\""))); + + assertThat(serializedProject, not(containsString("\"links\""))); + } +} \ No newline at end of file diff --git a/src/test/resources/project/project.json b/src/test/resources/project/project.json new file mode 100644 index 000000000..8f3223cbe --- /dev/null +++ b/src/test/resources/project/project.json @@ -0,0 +1,39 @@ +{ + "project" : { + "content" : { + "cluster" : "CLUSTER", + "authorizationToken" : "AUTH_TOKEN", + "guidedNavigation" : "1", + "isPublic" : "0", + "driver" : "Pg", + "state" : "ENABLED" + }, + "links" : { + "ldm_thumbnail" : "/gdc/projects/PROJECT_ID/ldm?thumbnail=1", + "self" : "/gdc/projects/PROJECT_ID", + "clearCaches" : "/gdc/projects/PROJECT_ID/clearCaches", + "invitations" : "/gdc/projects/PROJECT_ID/invitations", + "users" : "/gdc/projects/PROJECT_ID/users?link=1", + "groups" : "/gdc/projects/PROJECT_ID/groups", + "uploads" : "https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/", + "ldm" : "/gdc/projects/PROJECT_ID/ldm", + "metadata" : "/gdc/md/PROJECT_ID", + "publicartifacts" : "/gdc/projects/PROJECT_ID/publicartifacts", + "roles" : "/gdc/projects/PROJECT_ID/roles", + "dataload" : "/gdc/projects/PROJECT_ID/dataload", + "connectors" : "/gdc/projects/PROJECT_ID/connectors", + "execute" : "/gdc/projects/PROJECT_ID/execute", + "schedules" : "/gdc/projects/PROJECT_ID/schedules", + "templates" : "/gdc/md/PROJECT_ID/templates", + "eventstores" : "/gdc/projects/PROJECT_ID/dataload/eventstore/stores" + }, + "meta" : { + "created" : "2014-04-11 11:43:45", + "summary" : "DESC", + "updated" : "2014-04-11 11:43:47", + "author" : "/gdc/account/profile/USER_ID", + "title" : "TITLE", + "contributor" : "/gdc/account/profile/CONTRIB_USER_ID" + } + } +} \ No newline at end of file From b754711ce124d00372ec46184721a83d68cf56a3 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 5 May 2014 23:04:54 +0200 Subject: [PATCH 0006/1191] list datasets --- .../java/com/gooddata/dataset/Dataset.java | 35 +++++++++++++ .../com/gooddata/dataset/DatasetService.java | 16 ++++++ .../java/com/gooddata/dataset/Datasets.java | 52 +++++++++++++++++++ .../com/gooddata/dataset/DatasetsTest.java | 29 +++++++++++ src/test/resources/dataset/datasets.json | 16 ++++++ 5 files changed, 148 insertions(+) create mode 100644 src/main/java/com/gooddata/dataset/Dataset.java create mode 100644 src/main/java/com/gooddata/dataset/Datasets.java create mode 100644 src/test/java/com/gooddata/dataset/DatasetsTest.java create mode 100644 src/test/resources/dataset/datasets.json diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java new file mode 100644 index 000000000..939239d6c --- /dev/null +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -0,0 +1,35 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * Dataset + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Dataset { + private final String identifier; + private final String link; + private final String title; + + @JsonCreator + public Dataset(@JsonProperty("identifier") String identifier, @JsonProperty("link") String link, + @JsonProperty("title") String title) { + this.identifier = identifier; + this.link = link; + this.title = title; + } + + public String getIdentifier() { + return identifier; + } + + public String getLink() { + return link; + } + + public String getTitle() { + return title; + } +} diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 82c2e55c0..dfdfa8c84 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -4,6 +4,7 @@ package com.gooddata.dataset; import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; @@ -18,10 +19,12 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.Collection; import static java.nio.charset.StandardCharsets.UTF_8; import static com.gooddata.Validate.notEmpty; import static com.gooddata.Validate.notNull; +import static java.util.Collections.emptyList; /** */ @@ -105,4 +108,17 @@ public void loadDataset(Project project, String datasetId, InputStream dataset) notNull(dataset, "dataset"); loadDataset(project, getDatasetManifest(project, datasetId), dataset); } + + public Collection listDatasets(Project project) { + notNull(project, "project"); + try { + final Datasets result = restTemplate.getForObject(Datasets.URI, Datasets.class, project.getId()); + if (result == null || result.getLinks() == null) { + return emptyList(); + } + return result.getLinks(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list datasets for project " + project.getId(), e); + } + } } diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java new file mode 100644 index 000000000..ead3116be --- /dev/null +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; +import java.util.List; + +/** + * Datasets + */ +@JsonTypeName("about") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +// todo this is almost copy of Gdc +public class Datasets { + + public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; + + private final String category; + private final String summary; + private final List links; + + @JsonCreator + public Datasets(@JsonProperty("category") String category, @JsonProperty("summary") String summary, + @JsonProperty("links") List links) { + this.category = category; + this.summary = summary; + this.links = links; + } + + public String getCategory() { + return category; + } + + public String getSummary() { + return summary; + } + + public Collection getLinks() { + return links; + } + +} diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java new file mode 100644 index 000000000..6db471e6d --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -0,0 +1,29 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collection; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; + +public class DatasetsTest { + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/datasets.json"); + final Datasets datasets = new ObjectMapper().readValue(stream, Datasets.class); + assertThat(datasets, is(notNullValue())); + + final Collection links = datasets.getLinks(); + assertThat(links, is(notNullValue())); + assertThat(links, hasSize(1)); + + final Dataset link = links.iterator().next(); + assertThat(link, is(notNullValue())); + assertThat(link.getIdentifier(), is("dataset.person")); + } +} diff --git a/src/test/resources/dataset/datasets.json b/src/test/resources/dataset/datasets.json new file mode 100644 index 000000000..aa368d6d1 --- /dev/null +++ b/src/test/resources/dataset/datasets.json @@ -0,0 +1,16 @@ +{ + "about": { + "summary": "single loading interfaces", + "category": "singleloadinterface", + "instance": "MD::LDM::SingleLoadInterface", + "links": [ + { + "link": "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/ldm/singleloadinterface/dataset.person", + "identifier": "dataset.person", + "summary": "dataset single data loading interface specifications", + "category": "dataset-singleloadinterface", + "title": "Person" + } + ] + } +} \ No newline at end of file From 6eab0abd2f53d99cf9ccfd22f479bfecbb38b29a Mon Sep 17 00:00:00 2001 From: Li Ry Date: Sat, 7 Jun 2014 11:18:41 +0200 Subject: [PATCH 0007/1191] tune account DTO and add test --- .../java/com/gooddata/account/Account.java | 50 ++++++++++++++++--- .../com/gooddata/account/AccountTest.java | 32 ++++++++++++ src/test/resources/account/account-input.json | 6 +++ src/test/resources/account/account.json | 21 ++++++++ 4 files changed, 103 insertions(+), 6 deletions(-) create mode 100644 src/test/java/com/gooddata/account/AccountTest.java create mode 100644 src/test/resources/account/account-input.json create mode 100644 src/test/resources/account/account.json diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 3b52ad183..120da932b 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -4,6 +4,7 @@ package com.gooddata.account; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -12,6 +13,7 @@ import org.springframework.web.util.UriTemplate; /** + * Account setting */ @JsonTypeName("accountSetting") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -27,32 +29,68 @@ public class Account { public static final String CURRENT_ID = "current"; + + private final String firstName; + private final String lastName; + @JsonIgnore private final Links links; @JsonCreator - public Account(@JsonProperty("links") Links links) { + public Account(@JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("links") Links links) { + this.firstName = firstName; + this.lastName = lastName; this.links = links; } - public Links getLinks() { - return links; + /* Just for serialization test */ + Account(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + links = null; + } + + public String getFirstName() { + return firstName; } + public String getLastName() { + return lastName; + } + + @JsonIgnore + public String getSelfLink() { + return links.getSelf(); + } + + @JsonIgnore + public String getProjectsLink() { + return links.getProjects(); + } + + @JsonIgnore public String getId() { - return TEMPLATE.match(getLinks().getSelf()).get("id"); + return TEMPLATE.match(getSelfLink()).get("id"); } @JsonIgnoreProperties(ignoreUnknown = true) - public static class Links { + private static class Links { private final String self; + private final String projects; @JsonCreator - public Links(@JsonProperty("self") String self) { + public Links(@JsonProperty("self") String self, @JsonProperty("projects") String projects) { this.self = self; + this.projects = projects; } public String getSelf() { return self; } + + public String getProjects() { + return projects; + } } } diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java new file mode 100644 index 000000000..0c9049559 --- /dev/null +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -0,0 +1,32 @@ +package com.gooddata.account; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class AccountTest { + + @Test + public void testDeserialize() throws Exception { + final Account account = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/account/account.json"), Account.class); + assertThat(account, is(notNullValue())); + + assertThat(account.getFirstName(), is("Blah")); + assertThat(account.getLastName(), is("Muhehe")); + assertThat(account.getId(), is("ID")); + assertThat(account.getSelfLink(), is("/gdc/account/profile/ID")); + assertThat(account.getProjectsLink(), is("/gdc/account/profile/ID/projects")); + } + + @Test + public void testSerialization() { + final Account account = new Account("Blah", "Muhehe"); + assertThat(account, serializesToJson("/account/account-input.json")); + } + +} \ No newline at end of file diff --git a/src/test/resources/account/account-input.json b/src/test/resources/account/account-input.json new file mode 100644 index 000000000..933d50567 --- /dev/null +++ b/src/test/resources/account/account-input.json @@ -0,0 +1,6 @@ +{ + "accountSetting" : { + "firstName" : "Blah", + "lastName" : "Muhehe" + } +} diff --git a/src/test/resources/account/account.json b/src/test/resources/account/account.json new file mode 100644 index 000000000..9fa205845 --- /dev/null +++ b/src/test/resources/account/account.json @@ -0,0 +1,21 @@ +{ + "accountSetting" : { + "country" : null, + "firstName" : "Blah", + "ssoProvider" : null, + "timezone" : null, + "position" : null, + "authenticationModes" : [], + "companyName" : "gdc", + "login" : "fake@gooddata.com", + "email" : "fake@gooddata.com", + "created" : "2013-12-17 19:08:20", + "updated" : "2013-12-17 19:16:09", + "lastName" : "Muhehe", + "phoneNumber" : "123", + "links" : { + "self" : "/gdc/account/profile/ID", + "projects" : "/gdc/account/profile/ID/projects" + } + } +} From 0c40b7a2365df6ac85abcfe9f6d8e45d48687827 Mon Sep 17 00:00:00 2001 From: Li Ry Date: Sat, 7 Jun 2014 11:28:50 +0200 Subject: [PATCH 0008/1191] tune dataset package --- .../com/gooddata/dataset/DatasetManifest.java | 22 ++++- .../dataset/DatasetNotFoundException.java | 2 +- .../java/com/gooddata/dataset/FailStatus.java | 9 +- src/main/java/com/gooddata/dataset/Pull.java | 5 +- .../java/com/gooddata/dataset/PullTask.java | 7 +- .../com/gooddata/dataset/PullTaskStatus.java | 7 +- .../gooddata/dataset/DatasetManifestTest.java | 93 +++++++------------ .../com/gooddata/dataset/FailStatusTest.java | 10 +- .../gooddata/dataset/PullTaskStatusTest.java | 20 ++++ .../com/gooddata/dataset/PullTaskTest.java | 20 ++++ .../java/com/gooddata/dataset/PullTest.java | 15 +++ .../dataset/datasetManifest-input.json | 19 ++++ .../resources/dataset/datasetManifest.json | 33 +++++++ ...pload_status_fail.json => failStatus.json} | 0 src/test/resources/dataset/pull.json | 3 + src/test/resources/dataset/pullTask.json | 5 + .../resources/dataset/pullTaskStatus.json | 3 + 17 files changed, 195 insertions(+), 78 deletions(-) create mode 100644 src/test/java/com/gooddata/dataset/PullTaskStatusTest.java create mode 100644 src/test/java/com/gooddata/dataset/PullTaskTest.java create mode 100644 src/test/java/com/gooddata/dataset/PullTest.java create mode 100644 src/test/resources/dataset/datasetManifest-input.json create mode 100644 src/test/resources/dataset/datasetManifest.json rename src/test/resources/dataset/{upload_status_fail.json => failStatus.json} (100%) create mode 100644 src/test/resources/dataset/pull.json create mode 100644 src/test/resources/dataset/pullTask.json create mode 100644 src/test/resources/dataset/pullTaskStatus.json diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index fd0c00422..b35803adc 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -14,7 +14,7 @@ import java.util.Map; /** - * Dataset manifest + * Dataset specific upload manifest */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("dataSetSLIManifest") @@ -33,7 +33,8 @@ public DatasetManifest(String dataSet) { } @JsonCreator - public DatasetManifest(@JsonProperty("dataSet") String dataSet, @JsonProperty("file") String file, @JsonProperty("parts") List parts) { + public DatasetManifest(@JsonProperty("dataSet") String dataSet, @JsonProperty("file") String file, + @JsonProperty("parts") List parts) { this.dataSet = dataSet; this.file = file; this.parts = parts; @@ -59,15 +60,30 @@ public void setFile(String file) { this.file = file; } + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public static class Part { @JsonProperty("mode") private String uploadMode; private String columnName; private List populates; - private Integer referenceKey; + private Integer referenceKey; //TODO boolean private Map constraints; + @JsonCreator + Part(@JsonProperty("mode") String uploadMode, + @JsonProperty("columnName") String columnName, + @JsonProperty("populates") List populates, + @JsonProperty("referenceKey") Integer referenceKey, + @JsonProperty("constraints") Map constraints) { + this.uploadMode = uploadMode; + this.columnName = columnName; + this.populates = populates; + this.referenceKey = referenceKey; + this.constraints = constraints; + } + public String getUploadMode() { return uploadMode; } diff --git a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java index d4d031472..df9dc5804 100644 --- a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java +++ b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java @@ -6,7 +6,7 @@ import com.gooddata.GoodDataException; /** - * Represents error in DatasetService + * Represents error when dataset of the given id was not found */ public class DatasetNotFoundException extends GoodDataException { diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java index 49307312d..9a9d95f2b 100644 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ b/src/main/java/com/gooddata/dataset/FailStatus.java @@ -2,19 +2,22 @@ import com.gooddata.gdc.ErrorStructure; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; /** - * Fail status of dataset load + * Fail status of dataset load. + * Deserialization only. */ +@JsonIgnoreProperties(ignoreUnknown = true) public class FailStatus { private final String status; - private final String date; // todo date + private final String date; //TODO date private final ErrorStructure error; @JsonCreator - public FailStatus(@JsonProperty("status") String status, @JsonProperty("date") String date, + private FailStatus(@JsonProperty("status") String status, @JsonProperty("date") String date, @JsonProperty("error") ErrorStructure error) { this.status = status; this.date = date; diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index 008924a7f..7e7a8206c 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -3,14 +3,13 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * ETL Pull DTO (for internal use) + * ETL Pull DTO (for internal use). + * Serialization only. */ -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Pull { diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index 70aa63f87..54ffb0806 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -8,15 +8,14 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * ETL Pull task (for internal use) + * ETL Pull task (for internal use). + * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("pullTask") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class PullTask { public static final String URI = "/gdc/md/{projectId}/etl/task/{taskId}"; @@ -24,7 +23,7 @@ public class PullTask { private final String uri; @JsonCreator - public PullTask(@JsonProperty("uri") String uri) { + private PullTask(@JsonProperty("uri") String uri) { this.uri = uri; } diff --git a/src/main/java/com/gooddata/dataset/PullTaskStatus.java b/src/main/java/com/gooddata/dataset/PullTaskStatus.java index c2d1885dd..f973dc3a3 100644 --- a/src/main/java/com/gooddata/dataset/PullTaskStatus.java +++ b/src/main/java/com/gooddata/dataset/PullTaskStatus.java @@ -4,11 +4,14 @@ package com.gooddata.dataset; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; /** - * ETL Pull task status (for internal use) + * ETL Pull task status (for internal use). + * Deserialization only. */ +@JsonIgnoreProperties(ignoreUnknown = true) public class PullTaskStatus { private static final String OK = "OK"; @@ -17,7 +20,7 @@ public class PullTaskStatus { private final String status; @JsonCreator - public PullTaskStatus(@JsonProperty("taskStatus") String status) { + private PullTaskStatus(@JsonProperty("taskStatus") String status) { this.status = status; } diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 89c2a7c27..526c80bec 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -3,72 +3,47 @@ */ package com.gooddata.dataset; -import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; -public class DatasetManifestTest { +import java.io.InputStream; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; - private static final String SERIALIZED = "{\n" - + " \"dataSetSLIManifest\" : {\n" - + " \"parts\" : [\n" - + " {\n" - + " \"columnName\" : \"f_person.f_shoesize\",\n" - + " \"populates\" : [\n" - + " \"fact.person.shoesize\"\n" - + " ],\n" - + " \"mode\" : \"FULL\"\n" - + " },\n" - + " {\n" - + " \"columnName\" : \"f_person.nm_name\",\n" - + " \"populates\" : [\n" - + " \"attr.person.id.name\"\n" - + " ],\n" - + " \"mode\" : \"FULL\",\n" - + " \"referenceKey\" : 1\n" - + " },\n" - + " {\n" - + " \"columnName\" : \"d_person_role.nm_xrole\",\n" - + " \"populates\" : [\n" - + " \"attr.person.xrole\"\n" - + " ],\n" - + " \"mode\" : \"FULL\",\n" - + " \"referenceKey\" : 1\n" - + " },\n" - + " {\n" - + " \"columnName\" : \"f_person.f_age\",\n" - + " \"populates\" : [\n" - + " \"fact.person.age\"\n" - + " ],\n" - + " \"mode\" : \"FULL\"\n" - + " },\n" - + " {\n" - + " \"columnName\" : \"d_person_department.nm_xdepartment\",\n" - + " \"populates\" : [\n" - + " \"attr.person.xdepartment\"\n" - + " ],\n" - + " \"mode\" : \"FULL\",\n" - + " \"referenceKey\" : 1\n" - + " }\n" - + " ],\n" - + " \"file\" : \"dataset.person.csv\",\n" - + " \"dataSet\" : \"dataset.person\"\n" - + " }\n" - + "}\n"; +public class DatasetManifestTest { @Test - public void testDeser() throws Exception { - final DatasetManifest manifest = new ObjectMapper().readValue(SERIALIZED, DatasetManifest.class); - assertEquals("dataset.person", manifest.getDataSet()); - assertEquals("dataset.person.csv", manifest.getFile()); - assertEquals(5, manifest.getParts().size()); + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/datasetManifest.json"); + final DatasetManifest manifest = new ObjectMapper().readValue(stream, DatasetManifest.class); + + assertThat(manifest.getDataSet(), is("dataset.person")); + assertThat(manifest.getFile(), is("dataset.person.csv")); + + assertThat(manifest.getParts(), hasSize(3)); - final DatasetManifest.Part part = manifest.getParts().get(4); - assertEquals("d_person_department.nm_xdepartment", part.getColumnName()); - assertArrayEquals(new String[]{"attr.person.xdepartment"}, part.getPopulates().toArray()); - assertEquals("FULL", part.getUploadMode()); - assertEquals(Integer.valueOf(1), part.getReferenceKey()); + final DatasetManifest.Part lastPart = manifest.getParts().get(2); + assertThat(lastPart.getColumnName(), is("d_person_department.nm_xdepartment")); + assertThat(lastPart.getUploadMode(), is("FULL")); + assertThat(lastPart.getReferenceKey(), is(1)); + assertThat(lastPart.getPopulates(), hasSize(1)); + assertThat(lastPart.getPopulates().get(0), is("attr.person.xdepartment")); + + final DatasetManifest.Part datePart = manifest.getParts().get(1); + assertThat(datePart.getConstraints().get("date"), is("yyyy-MM-dd'T'HH:mm:ssZ")); + } + + @Test + public void testSerialization() throws Exception { + final DatasetManifest.Part part = new DatasetManifest.Part("MODE", "COLUMN", singletonList("POPULATES"), 1, + singletonMap("date", "CONSTRAINT")); + final DatasetManifest manifest = new DatasetManifest("DATASET", "FILE", singletonList(part)); + assertThat(manifest, serializesToJson("/dataset/datasetManifest-input.json")); } } diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index 8034c7e63..f0589bb16 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -11,14 +11,18 @@ import static org.junit.Assert.assertThat; public class FailStatusTest { + @Test - public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/upload_status_fail.json"); + public void testDeserialize() throws Exception { + + final InputStream stream = getClass().getResourceAsStream("/dataset/failStatus.json"); final FailStatus value = new ObjectMapper().readValue(stream, FailStatus.class); + assertThat(value, is(notNullValue())); assertThat(value.getStatus(), is("ERROR")); + assertThat(value.getDate(), is("2014-04-21 00:11:34")); + final ErrorStructure error = value.getError(); assertThat(error, is(notNullValue())); - assertThat(error.getMessage(), is("Manifest consist of columns that aren't in a single CSV file: f_person.nm_name")); } } diff --git a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java new file mode 100644 index 000000000..f5a2f3e47 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java @@ -0,0 +1,20 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class PullTaskStatusTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/pullTaskStatus.json"); + final PullTaskStatus taskStatus = new ObjectMapper().readValue(stream, PullTaskStatus.class); + + assertThat(taskStatus.getStatus(), is("WARNING")); + } +} diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java new file mode 100644 index 000000000..ae4ec7c88 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -0,0 +1,20 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +public class PullTaskTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/pullTask.json"); + final PullTask task = new ObjectMapper().readValue(stream, PullTask.class); + + assertThat(task.getUri(), is("/gdc/md/PROJECT/etl/task/ID")); + } +} diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java new file mode 100644 index 000000000..eaa0d7bf5 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -0,0 +1,15 @@ +package com.gooddata.dataset; + +import org.junit.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.junit.Assert.assertThat; + +public class PullTest { + + @Test + public void testSerialization() throws Exception { + final Pull pull = new Pull("DIR"); + assertThat(pull, serializesToJson("/dataset/pull.json")); + } +} diff --git a/src/test/resources/dataset/datasetManifest-input.json b/src/test/resources/dataset/datasetManifest-input.json new file mode 100644 index 000000000..0e32f13d1 --- /dev/null +++ b/src/test/resources/dataset/datasetManifest-input.json @@ -0,0 +1,19 @@ +{ + "dataSetSLIManifest": { + "parts": [ + { + "columnName": "COLUMN", + "populates": [ + "POPULATES" + ], + "mode": "MODE", + "constraints": { + "date": "CONSTRAINT" + }, + "referenceKey": 1 + } + ], + "file": "FILE", + "dataSet": "DATASET" + } +} diff --git a/src/test/resources/dataset/datasetManifest.json b/src/test/resources/dataset/datasetManifest.json new file mode 100644 index 000000000..55bff5a8a --- /dev/null +++ b/src/test/resources/dataset/datasetManifest.json @@ -0,0 +1,33 @@ +{ + "dataSetSLIManifest": { + "parts": [ + { + "columnName": "f_person.f_shoesize", + "populates": [ + "fact.person.shoesize" + ], + "mode": "FULL" + }, + { + "columnName": "date", + "populates": [ + "date" + ], + "mode": "FULL", + "constraints": { + "date": "yyyy-MM-dd'T'HH:mm:ssZ" + } + }, + { + "columnName": "d_person_department.nm_xdepartment", + "populates": [ + "attr.person.xdepartment" + ], + "mode": "FULL", + "referenceKey": 1 + } + ], + "file": "dataset.person.csv", + "dataSet": "dataset.person" + } +} diff --git a/src/test/resources/dataset/upload_status_fail.json b/src/test/resources/dataset/failStatus.json similarity index 100% rename from src/test/resources/dataset/upload_status_fail.json rename to src/test/resources/dataset/failStatus.json diff --git a/src/test/resources/dataset/pull.json b/src/test/resources/dataset/pull.json new file mode 100644 index 000000000..e7e8503c5 --- /dev/null +++ b/src/test/resources/dataset/pull.json @@ -0,0 +1,3 @@ +{ + "pullIntegration": "DIR" +} diff --git a/src/test/resources/dataset/pullTask.json b/src/test/resources/dataset/pullTask.json new file mode 100644 index 000000000..da0f26196 --- /dev/null +++ b/src/test/resources/dataset/pullTask.json @@ -0,0 +1,5 @@ +{ + "pullTask" : { + "uri" : "/gdc/md/PROJECT/etl/task/ID" + } +} diff --git a/src/test/resources/dataset/pullTaskStatus.json b/src/test/resources/dataset/pullTaskStatus.json new file mode 100644 index 000000000..49ff8265b --- /dev/null +++ b/src/test/resources/dataset/pullTaskStatus.json @@ -0,0 +1,3 @@ +{ + "taskStatus" : "WARNING" +} From e8980ac7c1499211e8c786ef4cd2683385e92bae Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 7 Jun 2014 22:48:18 +0200 Subject: [PATCH 0009/1191] show error messages on failed model update --- .../java/com/gooddata/gdc/ErrorStructure.java | 5 ++++ .../com/gooddata/model/MaqlDdlTaskStatus.java | 14 +++++++++-- .../java/com/gooddata/model/ModelService.java | 2 +- .../gooddata/model/MaqlDdlTaskStatusTest.java | 24 +++++++++++++++---- .../model/maql-ddl-task-status-fail.json | 17 +++++++++++++ .../resources/model/maql-ddl-task-status.json | 6 +++++ 6 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 src/test/resources/model/maql-ddl-task-status-fail.json create mode 100644 src/test/resources/model/maql-ddl-task-status.json diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index da3c3541a..ea13d0c51 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -37,4 +37,9 @@ public String getErrorClass() { public String getFormattedMessage() { return message == null ? null : String.format(message, parameters); } + + @Override + public String toString() { + return getFormattedMessage(); + } } diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java index 776b39a4a..8735e57aa 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java @@ -3,6 +3,7 @@ */ package com.gooddata.model; +import com.gooddata.gdc.GdcError; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; @@ -10,6 +11,8 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.Collection; + /** * MAQL DDL task status */ @@ -22,14 +25,17 @@ public class MaqlDdlTaskStatus { private static final String OK = "OK"; private final String status; + private final String uri; - // TODO messages + private final Collection messages; @JsonCreator - public MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String uri) { + public MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String uri, + @JsonProperty("messages") Collection messages) { this.status = status; this.uri = uri; + this.messages = messages; } public String getStatus() { @@ -40,6 +46,10 @@ public String getUri() { return uri; } + public Collection getMessages() { + return messages; + } + public boolean isSuccess() { return OK.equals(status); } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index dac28c345..7ed4d69ad 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -68,7 +68,7 @@ public void updateProjectModel(Project project, String maqlDdl) { final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), MaqlDdlLinks.class, project.getId()); final MaqlDdlTaskStatus maqlDdlTaskStatus = poll(linkEntries.getStatusLink(), MaqlDdlTaskStatus.class); if (!maqlDdlTaskStatus.isSuccess()) { - throw new ModelException("Update project model finished with status " + maqlDdlTaskStatus.getStatus()); + throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); } } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to update project model", e); diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index 63690d3cb..ff3956bdd 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -3,19 +3,33 @@ */ package com.gooddata.model; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; -import com.gooddata.model.MaqlDdlTaskStatus; +import static org.junit.Assert.assertThat; + +import com.gooddata.gdc.GdcError; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; public class MaqlDdlTaskStatusTest { + private static final ObjectMapper MAPPER = new ObjectMapper(); + @Test public void testDeser() throws Exception { - final MaqlDdlTaskStatus maqlDdlTaskStatus = new ObjectMapper().readValue("{\"wTaskStatus\":{\"status\":\"OK\",\"poll\":\"someURI\"}}", MaqlDdlTaskStatus.class); - assertEquals("OK", maqlDdlTaskStatus.getStatus()); - assertEquals("someURI", maqlDdlTaskStatus.getUri()); - + final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), MaqlDdlTaskStatus.class); + assertEquals("OK", status.getStatus()); + assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getUri()); + } + @Test + public void testDeserMessages() throws Exception { + final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), MaqlDdlTaskStatus.class); + assertEquals("ERROR", status.getStatus()); + assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getUri()); + assertThat(status.getMessages(), hasSize(1)); + final GdcError error = status.getMessages().iterator().next(); + assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); } } diff --git a/src/test/resources/model/maql-ddl-task-status-fail.json b/src/test/resources/model/maql-ddl-task-status-fail.json new file mode 100644 index 000000000..bc2f421d7 --- /dev/null +++ b/src/test/resources/model/maql-ddl-task-status-fail.json @@ -0,0 +1,17 @@ +{ + "wTaskStatus": { + "messages": [ + { + "error": { + "parameters": ["attr.person.id"], + "requestId": "REQUEST_ID", + "component": "GDC::LDM::MAQLDDL", + "errorClass": "GDC::Exception::User", + "message": "The object (%s) doesn't exists." + } + } + ], + "poll": "/gdc/md/PROJECT_ID/tasks/TASK_ID/status", + "status": "ERROR" + } +} \ No newline at end of file diff --git a/src/test/resources/model/maql-ddl-task-status.json b/src/test/resources/model/maql-ddl-task-status.json new file mode 100644 index 000000000..456d5c6b9 --- /dev/null +++ b/src/test/resources/model/maql-ddl-task-status.json @@ -0,0 +1,6 @@ +{ + "wTaskStatus": { + "status": "OK", + "poll": "/gdc/md/PROJECT_ID/tasks/TASK_ID/status" + } +} \ No newline at end of file From e1f908d92304a5343df8a9d25c09e925140e02bb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 7 Jun 2014 22:51:36 +0200 Subject: [PATCH 0010/1191] updated model example --- src/test/java/com/gooddata/Example.java | 8 ++ src/test/java/com/gooddata/ModelExample.java | 92 -------------------- src/test/resources/person.csv | 2 +- src/test/resources/person.json | 71 +++++++++++++++ 4 files changed, 80 insertions(+), 93 deletions(-) delete mode 100644 src/test/java/com/gooddata/ModelExample.java create mode 100644 src/test/resources/person.json diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index ae6c521cb..8601b4fce 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -12,10 +12,13 @@ import com.gooddata.md.Metric; import com.gooddata.md.Restriction; import com.gooddata.md.report.ReportDefinition; +import com.gooddata.model.ModelDiff; +import com.gooddata.model.ModelService; import com.gooddata.project.Project; import com.gooddata.project.ProjectService; import com.gooddata.report.ReportService; +import java.io.InputStreamReader; import java.util.Collection; public class Example { @@ -34,6 +37,11 @@ public static void main(String... args) { final Project project = projectService.createProject(new Project("sparkling", "pgroup2")); System.out.println(project.getSelfLink()); + final ModelService modelService = gd.getModelService(); + final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, + new InputStreamReader(Example.class.getResourceAsStream("/person.json"))); + modelService.updateProjectModel(project, projectModelDiff); + final MetadataService md = gd.getMetadataService(); final String factUri = md.findObjUri(project, Fact.class, Restriction.title("myfact")); diff --git a/src/test/java/com/gooddata/ModelExample.java b/src/test/java/com/gooddata/ModelExample.java deleted file mode 100644 index a62f759de..000000000 --- a/src/test/java/com/gooddata/ModelExample.java +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata; - -import com.gooddata.model.DiffRequest; -import com.gooddata.model.ModelDiff; -import com.gooddata.model.ModelService; -import com.gooddata.project.Project; - -public class ModelExample { - - public static void main(String... args) { - final GoodData gd = new GoodData("roman@gooddata.com", "roman1"); - - final ModelService modelService = gd.getModelService(); - final Project project = gd.getProjectService().getProjectById("amxhoeyj7oskijld63tajq0o9f4nhxy7"); - final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, new DiffRequest(projectModelData)); - - modelService.updateProjectModel(project, projectModelDiff); - - gd.logout(); - } - - public static final String projectModelData = "{\"projectModel\": {\"datasets\": [\n" - + "{\n" - + " \"dataset\": {\n" - + " \"identifier\": \"dataset.person\",\n" - + " \"title\": \"Person\",\n" - + " \"description\": \"Dataset with Person-related data\",\n" - + " \"anchor\": {\n" - + " \"attribute\": {\n" - + " \"identifier\": \"attr.person.id\",\n" - + " \"title\": \"Person ID\",\n" - + " \"labels\": [\n" - + " {\n" - + " \"label\": {\n" - + " \"identifier\": \"attr.person.id.name\",\n" - + " \"title\": \"Person Name\"\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + " },\n" - + " \"attributes\": [\n" - + " {\n" - + " \"attribute\": {\n" - + " \"identifier\": \"attr.person.department\",\n" - + " \"title\": \"Department\",\n" - + " \"labels\": [\n" - + " {\n" - + " \"label\": {\n" - + " \"identifier\": \"attr.person.xdepartment\",\n" - + " \"title\": \"Department\"\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + " },\n" - + " {\n" - + " \"attribute\": {\n" - + " \"identifier\": \"attr.person.role\",\n" - + " \"title\": \"Person Role\",\n" - + " \"labels\": [\n" - + " {\n" - + " \"label\": {\n" - + " \"identifier\": \"attr.person.xrole\",\n" - + " \"title\": \"Person Role\"\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + " }\n" - + " ],\n" - + " \"facts\": [\n" - + " {\n" - + " \"fact\": {\n" - + " \"identifier\": \"fact.person.age\",\n" - + " \"title\": \"Person Age\"\n" - + " }\n" - + " },\n" - + " {\n" - + " \"fact\": {\n" - + " \"identifier\": \"fact.person.shoesize\",\n" - + " \"title\": \"Person Shoe Size\"\n" - + " }\n" - + " }\n" - + " ]\n" - + " }\n" - + "}" - + "]}}"; -} diff --git a/src/test/resources/person.csv b/src/test/resources/person.csv index c879a5e44..aaa3b51d4 100644 --- a/src/test/resources/person.csv +++ b/src/test/resources/person.csv @@ -1,4 +1,4 @@ -f_person.f_shoesize,f_person.nm_name,d_person_role.nm_xrole,f_person.f_age,d_person_department.nm_xdepartment +f_person.f_shoesize,f_person.nm_name,d_person_role.nm_role,f_person.f_age,d_person_department.nm_department 37,Jane,manager,35,HR 42,Jack,developer,25,DevOps 35,Sandy,recruiter,27,HR diff --git a/src/test/resources/person.json b/src/test/resources/person.json new file mode 100644 index 000000000..de783f621 --- /dev/null +++ b/src/test/resources/person.json @@ -0,0 +1,71 @@ +{ + "projectModel": { + "datasets": [ + { + "dataset": { + "identifier": "dataset.person", + "title": "Person", + "description": "Dataset with Person-related data", + "anchor": { + "attribute": { + "identifier": "attr.person.name", + "title": "Person Name", + "labels": [ + { + "label": { + "identifier": "label.person.name", + "title": "Person Name" + } + } + ] + } + }, + "attributes": [ + { + "attribute": { + "identifier": "attr.person.department", + "title": "Department", + "labels": [ + { + "label": { + "identifier": "label.person.department", + "title": "Department" + } + } + ] + } + }, + { + "attribute": { + "identifier": "attr.person.role", + "title": "Person Role", + "labels": [ + { + "label": { + "identifier": "label.person.role", + "title": "Person Role" + } + } + ] + } + } + ], + "facts": [ + { + "fact": { + "identifier": "fact.person.age", + "title": "Person Age" + } + }, + { + "fact": { + "identifier": "fact.person.shoesize", + "title": "Person Shoe Size" + } + } + ] + } + } + ] + } +} From 48d68d0c0b3eaf7d25a21bbadcb780c33e281bd5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 7 Jun 2014 00:34:26 +0200 Subject: [PATCH 0011/1191] add export format enum and allow export to output stream --- .../java/com/gooddata/AbstractService.java | 3 +- .../java/com/gooddata/report/ExecResult.java | 2 +- .../gooddata/report/ReportExportFormat.java | 14 ++++++ .../com/gooddata/report/ReportService.java | 49 +++++++++++++++---- src/test/java/com/gooddata/Example.java | 3 +- 5 files changed, 58 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/gooddata/report/ReportExportFormat.java diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 3847c472a..c6ba9a33c 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -34,11 +34,12 @@ public abstract class AbstractService { protected final ObjectMapper mapper = new ObjectMapper(); - private final RequestCallback noopRequestCallback = new RequestCallback() { + protected final RequestCallback noopRequestCallback = new RequestCallback() { @Override public void doWithRequest(final ClientHttpRequest request) throws IOException { } }; + private final ResponseExtractor reusableResponseExtractor = new ResponseExtractor() { @Override public ClientHttpResponse extractData(final ClientHttpResponse response) throws IOException { diff --git a/src/main/java/com/gooddata/report/ExecResult.java b/src/main/java/com/gooddata/report/ExecResult.java index 346fa5b55..37a858362 100644 --- a/src/main/java/com/gooddata/report/ExecResult.java +++ b/src/main/java/com/gooddata/report/ExecResult.java @@ -10,7 +10,7 @@ /** * Executed report */ -public class ExecResult { +class ExecResult { private final JsonNode jsonNode; diff --git a/src/main/java/com/gooddata/report/ReportExportFormat.java b/src/main/java/com/gooddata/report/ReportExportFormat.java new file mode 100644 index 000000000..269ed6884 --- /dev/null +++ b/src/main/java/com/gooddata/report/ReportExportFormat.java @@ -0,0 +1,14 @@ +package com.gooddata.report; + +/** + * Format of exported report + */ +public enum ReportExportFormat { + + PDF, XLS, PNG, CSV; + + public String getValue() { + return name().toLowerCase(); + } + +} diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 8435c4c2c..dbaccefb6 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -10,12 +10,18 @@ import org.codehaus.jackson.node.ObjectNode; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.IOException; +import java.io.OutputStream; import static com.gooddata.Validate.notEmpty; import static com.gooddata.Validate.notNull; +import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.POST; /** @@ -29,35 +35,58 @@ public ReportService(final RestTemplate restTemplate) { super(restTemplate); } - public String exportReport(final ReportDefinition reportDefinition, final String format) { + public String exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format) { notNull(reportDefinition, "reportDefinition"); - notEmpty(format, "format"); + notNull(format, "format"); final ExecResult execResult = executeReport(reportDefinition.getUri()); return exportReport(execResult, format); } - public ExecResult executeReport(final String reportDefinitionUri) { + public void exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format, + final OutputStream output) { + notNull(output, "output"); + final String uri = exportReport(reportDefinition, format); + try { + restTemplate.execute(uri, GET, noopRequestCallback, new ResponseExtractor() { + @Override + public Integer extractData(ClientHttpResponse response) throws IOException { + return FileCopyUtils.copy(response.getBody(), output); + } + }); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to export report", e); + } + } + + private ExecResult executeReport(final String reportDefinitionUri) { notEmpty(reportDefinitionUri, "reportDefinitionUri"); - final ResponseEntity entity = restTemplate - .exchange(ReportRequest.URI, POST, new HttpEntity<>(new ReportRequest(reportDefinitionUri)), - String.class); try { + final ResponseEntity entity = restTemplate + .exchange(ReportRequest.URI, POST, new HttpEntity<>(new ReportRequest(reportDefinitionUri)), + String.class); return new ExecResult(mapper.readTree(entity.getBody())); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to execute report", e); } catch (IOException e) { throw new GoodDataException("Unable to read execution result", e); } } - public String exportReport(final ExecResult execResult, final String format) { + private String exportReport(final ExecResult execResult, final ReportExportFormat format) { notNull(execResult, "execResult"); - notEmpty(format, "format"); + notNull(format, "format"); final ObjectNode root = mapper.createObjectNode(); final ObjectNode child = mapper.createObjectNode(); child.put("result", execResult.getJsonNode()); - child.put("format", format); + child.put("format", format.getValue()); root.put("result_req", child); - return restTemplate.postForObject(EXPORTING_URI, root, UriResponse.class).getUri(); + try { + return restTemplate.postForObject(EXPORTING_URI, root, UriResponse.class).getUri(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to export report", e); + } } + } diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index ae6c521cb..47a4e86f0 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -14,6 +14,7 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; import com.gooddata.project.ProjectService; +import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; import java.util.Collection; @@ -46,7 +47,7 @@ public static void main(String... args) { final ReportDefinition reportDef = md.getObjByUri("/gdc/md/GoodSalesDemoKokot1/obj/1962", ReportDefinition.class); final ReportService reportService = gd.getReportService(); - final String imgUri = reportService.exportReport(reportDef, "csv"); + final String imgUri = reportService.exportReport(reportDef, ReportExportFormat.PNG); System.out.println(imgUri); gd.logout(); From fc41114de0d5389e6c4c724e1bdd85ba7b6aed53 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 8 Jun 2014 09:52:46 +0200 Subject: [PATCH 0012/1191] fix travis build config Travis by is configured by default as ``` install: mvn install -DskipTests=true script: mvn test ``` which completely skips integration tests. The `install: true` runs `bin/true` which skips the Travis' install phase (not to be confused with `mvn install`). http://docs.travis-ci.com/user/build-configuration/ http://docs.travis-ci.com/user/languages/java/ --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index c16d2f86d..b4d18b51e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,5 @@ language: java +install: true +script: mvn verify jdk: - openjdk7 From 5e2c004e437e9ab42cc45201f19f1df420799bbe Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 8 Jun 2014 01:07:33 +0200 Subject: [PATCH 0013/1191] fix: project template is metadata specific for project only --- src/main/java/com/gooddata/md/Meta.java | 8 +--- src/main/java/com/gooddata/md/Obj.java | 5 --- .../java/com/gooddata/project/Project.java | 43 +++++++++++++++++-- src/test/java/com/gooddata/md/MetaTest.java | 4 +- src/test/java/com/gooddata/md/ObjTest.java | 4 +- .../com/gooddata/project/ProjectTest.java | 5 ++- src/test/resources/md/meta.json | 1 - src/test/resources/md/objCommon.json | 1 - 8 files changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index c79bbc021..fb7c1dad0 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -29,7 +29,6 @@ public class Meta implements Serializable { private String deprecated; //TODO boolean private String title; private String identifier; - private String projectTemplate; private Integer locked; //TODO boolean private Integer unlisted; //TODO boolean @@ -45,7 +44,6 @@ protected Meta(@JsonProperty("author") String author, @JsonProperty("uri") String uri, @JsonProperty("deprecated") String deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("projectTemplate") String projectTemplate, @JsonProperty("locked") Integer locked, @JsonProperty("unlisted") Integer unlisted) { super(); @@ -59,7 +57,6 @@ protected Meta(@JsonProperty("author") String author, this.category = category; this.deprecated = deprecated; this.identifier = identifier; - this.projectTemplate = projectTemplate; this.contributor = contributor; this.locked = locked; this.unlisted = unlisted; @@ -118,10 +115,6 @@ public String getIdentifier() { return identifier; } - public String getProjectTemplate() { - return projectTemplate; - } - public Integer getLocked() { return locked; } @@ -129,4 +122,5 @@ public Integer getLocked() { public Integer getUnlisted() { return unlisted; } + } diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 23611a6bf..f6423acda 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -77,11 +77,6 @@ public String getIdentifier() { return meta.getIdentifier(); } - @JsonIgnore - public String getProjectTemplate() { - return meta.getProjectTemplate(); - } - @JsonIgnore public Integer getLocked() { return meta.getLocked(); diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 784a04e5d..bf58c645a 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -30,29 +30,33 @@ public class Project { private ProjectContent content; @JsonProperty("meta") - private Meta meta; + private ProjectMeta meta; @JsonIgnore private Links links; public Project(String title, String authorizationToken) { content = new ProjectContent(authorizationToken); - meta = new Meta(title); + meta = new ProjectMeta(title); } public Project(String title, String summary, String authorizationToken) { content = new ProjectContent(authorizationToken); - meta = new Meta(title, summary); + meta = new ProjectMeta(title, summary); } @JsonCreator - private Project(@JsonProperty("content") ProjectContent content, @JsonProperty("meta") Meta meta, + private Project(@JsonProperty("content") ProjectContent content, @JsonProperty("meta") ProjectMeta meta, @JsonProperty("links") Links links) { this.content = content; this.meta = meta; this.links = links; } + public void setProjectTemplate(String uri) { + meta.setProjectTemplate(uri); + } + @JsonIgnore public String getId() { return PROJECT_TEMPLATE.match(getSelfLink()).get("id"); @@ -398,4 +402,35 @@ public String getUploads() { } } + private static class ProjectMeta extends Meta { + + private String projectTemplate; + + @JsonCreator + private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("contributor") String contributor, + @JsonProperty("created") String created, @JsonProperty("updated") String updated, + @JsonProperty("summary") String summary, @JsonProperty("title") String title, + @JsonProperty("category") String category, @JsonProperty("tags") String tags, + @JsonProperty("uri") String uri, @JsonProperty("deprecated") String deprecated, + @JsonProperty("identifier") String identifier, + @JsonProperty("locked") Integer locked, @JsonProperty("unlisted") Integer unlisted) { + super(author, contributor, created, updated, summary, title, category, tags, uri, deprecated, identifier, locked, unlisted); + } + + private ProjectMeta(String title) { + super(title); + } + + private ProjectMeta(String title, String summary) { + super(title, summary); + } + + public String getProjectTemplate() { + return projectTemplate; + } + + public void setProjectTemplate(String projectTemplate) { + this.projectTemplate = projectTemplate; + } + } } diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 31c40e776..a9d0f367e 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -24,7 +24,6 @@ public class MetaTest { public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; public static final String DEPRECATED = "0"; public static final String IDENTIFIER = "attr.person.id.name"; - public static final String PROJECT_TEMPLATE = "/projectTemplates/TYPE/VERSION"; public static final Integer LOCKED = 0; public static final Integer UNLISTED = 1; @@ -43,7 +42,6 @@ public void testDeserialization() throws Exception { assertThat(meta.getUri(), is(URI)); assertThat(meta.getDeprecated(), is(DEPRECATED)); assertThat(meta.getIdentifier(), is(IDENTIFIER)); - assertThat(meta.getProjectTemplate(), is(PROJECT_TEMPLATE)); assertThat(meta.getLocked(), is(LOCKED)); assertThat(meta.getUnlisted(), is(UNLISTED)); } @@ -51,7 +49,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, - DEPRECATED, IDENTIFIER, PROJECT_TEMPLATE, LOCKED, UNLISTED); + DEPRECATED, IDENTIFIER, LOCKED, UNLISTED); assertThat(meta, serializesToJson("/md/meta.json")); } diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 825ca5778..d3acbad1a 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -27,7 +27,6 @@ public class ObjTest { public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; public static final String DEPRECATED = "0"; public static final String IDENTIFIER = "attr.person.id.name"; - public static final String PROJECT_TEMPLATE = "/projectTemplates/TYPE/VERSION"; public static final Integer LOCKED = 0; public static final Integer UNLISTED = 1; @@ -48,7 +47,6 @@ public void testDeserialization() throws Exception { assertThat(obj.getUri(), is(URI)); assertThat(obj.getDeprecated(), is(DEPRECATED)); assertThat(obj.getIdentifier(), is(IDENTIFIER)); - assertThat(obj.getProjectTemplate(), is(PROJECT_TEMPLATE)); assertThat(obj.getLocked(), is(LOCKED)); assertThat(obj.getUnlisted(), is(UNLISTED)); } @@ -57,7 +55,7 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final ConcreteObj obj = new ConcreteObj( new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, DEPRECATED, - IDENTIFIER, PROJECT_TEMPLATE, LOCKED, UNLISTED) + IDENTIFIER, LOCKED, UNLISTED) ); assertThat(obj, serializesToJson("/md/objCommon.json")); diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 66a18cc9b..3658bd9ef 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -53,7 +53,9 @@ public void testDeserialize() throws Exception { @Test public void testSerialize() throws Exception { - final String serializedProject = new ObjectMapper().writeValueAsString(new Project("TITLE", "SUMMARY", "TOKEN")); + final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); + project.setProjectTemplate("/projectTemplates/TEMPLATE"); + final String serializedProject = new ObjectMapper().writeValueAsString(project); assertThat(serializedProject, startsWith("{\"project\"")); @@ -68,6 +70,7 @@ public void testSerialize() throws Exception { assertThat(serializedProject, containsString("\"meta\"")); assertThat(serializedProject, containsString("\"title\":\"TITLE\"")); assertThat(serializedProject, containsString("\"summary\":\"SUMMARY\"")); + assertThat(serializedProject, containsString("\"projectTemplate\":\"/projectTemplates/TEMPLATE\"")); assertThat(serializedProject, not(containsString("\"author\""))); assertThat(serializedProject, not(containsString("\"contributor\""))); assertThat(serializedProject, not(containsString("\"created\""))); diff --git a/src/test/resources/md/meta.json b/src/test/resources/md/meta.json index f248bd567..38753329f 100644 --- a/src/test/resources/md/meta.json +++ b/src/test/resources/md/meta.json @@ -10,7 +10,6 @@ "category": "attributeDisplayForm", "updated": "2014-04-11 13:45:57", "contributor": "/gdc/account/profile/CONTRIBUTOR_USER_ID", - "projectTemplate": "/projectTemplates/TYPE/VERSION", "locked": 0, "unlisted": 1 } diff --git a/src/test/resources/md/objCommon.json b/src/test/resources/md/objCommon.json index 1a57c9cec..0f174ea4f 100644 --- a/src/test/resources/md/objCommon.json +++ b/src/test/resources/md/objCommon.json @@ -11,7 +11,6 @@ "category": "attributeDisplayForm", "updated": "2014-04-11 13:45:57", "contributor": "/gdc/account/profile/CONTRIBUTOR_USER_ID", - "projectTemplate": "/projectTemplates/TYPE/VERSION", "locked": 0, "unlisted": 1 } From 658ca8b3d78f9f8842ba4fcc32a74fccbcca7f94 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 26 Apr 2014 09:57:50 +0200 Subject: [PATCH 0014/1191] add rest api polling support --- .../java/com/gooddata/AbstractService.java | 84 ++++++-------- src/main/java/com/gooddata/FutureResult.java | 65 +++++++++++ src/main/java/com/gooddata/PollHandler.java | 80 +++++++++++++ .../com/gooddata/dataset/DatasetService.java | 54 +++++---- .../java/com/gooddata/model/ModelService.java | 32 ++++-- .../java/com/gooddata/project/Project.java | 16 +++ .../com/gooddata/project/ProjectService.java | 36 +++--- .../java/com/gooddata/AbstractGoodDataIT.java | 2 +- src/test/java/com/gooddata/Example.java | 6 +- .../gooddata/project/ProjectServiceIT.java | 108 ++++++++++++++++++ .../resources/project/project-deleted.json | 37 ++++++ .../resources/project/project-loading.json | 37 ++++++ 12 files changed, 455 insertions(+), 102 deletions(-) create mode 100644 src/main/java/com/gooddata/FutureResult.java create mode 100644 src/main/java/com/gooddata/PollHandler.java create mode 100644 src/test/java/com/gooddata/project/ProjectServiceIT.java create mode 100644 src/test/resources/project/project-deleted.json create mode 100644 src/test/resources/project/project-loading.json diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index c6ba9a33c..6754eb8ef 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -8,6 +8,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.HttpMessageConverter; import org.springframework.util.FileCopyUtils; import org.springframework.web.client.HttpMessageConverterExtractor; import org.springframework.web.client.RequestCallback; @@ -17,7 +18,8 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.net.URI; +import java.util.List; +import java.util.concurrent.TimeUnit; import static com.gooddata.Validate.notNull; import static java.lang.String.format; @@ -28,7 +30,6 @@ public abstract class AbstractService { public static Integer WAIT_BEFORE_RETRY_IN_MILLIS = 5 * 1000; - public static Integer MAX_ATTEMPTS = 5; protected final RestTemplate restTemplate; @@ -52,69 +53,54 @@ public AbstractService(RestTemplate restTemplate) { this.restTemplate = notNull(restTemplate, "restTemplate"); } - public T poll(URI pollingUri, Class cls) { - return poll(pollingUri, new StatusOkConditionCallback(), cls); - } - - public T poll(String pollingUri, Class cls) { - return poll(URI.create(pollingUri), new StatusOkConditionCallback(), cls); - } - - public T poll(String pollingUri, ConditionCallback condition, Class returnClass) { - return poll(URI.create(pollingUri), condition, returnClass); - } - - public T poll(URI pollingUri, ConditionCallback condition, Class returnClass) { - int attempt = 0; - + final T poll(final PollHandler handler, long timeout, final TimeUnit unit) { + notNull(handler, "handler"); + final long start = System.currentTimeMillis(); while (true) { - - final ClientHttpResponse response = restTemplate.execute(pollingUri, GET, noopRequestCallback, - reusableResponseExtractor); - - try { - if (condition.finished(response)) { - return new HttpMessageConverterExtractor<>(returnClass, restTemplate.getMessageConverters()) - .extractData(response); - } else if (HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())) { - throw new GoodDataException( - format("Polling returned client error HTTP status %s", response.getStatusCode().value()) - ); - } - } catch (IOException e) { - throw new GoodDataException("I/O error occurred during HTTP response extraction", e); + if (pollOnce(handler)) { + return handler.getResult(); } - - if (attempt >= MAX_ATTEMPTS - 1) { - throw new GoodDataException(format("Max number of attempts (%s) exceeded", MAX_ATTEMPTS)); + if (unit != null && start + unit.toMillis(timeout) > System.currentTimeMillis()) { + throw new GoodDataException("timeout"); } try { Thread.sleep(WAIT_BEFORE_RETRY_IN_MILLIS); } catch (InterruptedException e) { - // do nothing + throw new GoodDataException("interrupted"); } - attempt++; } } - protected T extractData(ClientHttpResponse response, Class cls) throws IOException { - return new HttpMessageConverterExtractor<>(cls, restTemplate.getMessageConverters()).extractData(response); - } - - - public static interface ConditionCallback { - boolean finished(ClientHttpResponse response) throws IOException; + final boolean pollOnce(final PollHandler handler) { + notNull(handler, "handler"); + final ClientHttpResponse response = restTemplate.execute(handler.getPollingUri(), GET, noopRequestCallback, + reusableResponseExtractor); + + try { + if (handler.isFinished(response)) { + final T data = extractData(response, handler.getResultClass()); + handler.setResult(data); + } else if (HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())) { + throw new GoodDataException( + format("Polling returned client error HTTP status %s", response.getStatusCode().value()) + ); + } + } catch (IOException e) { + throw new GoodDataException("I/O error occurred during HTTP response extraction", e); + } + return handler.isDone(); } - public static class StatusOkConditionCallback implements ConditionCallback { - @Override - public boolean finished(ClientHttpResponse response) throws IOException { - return HttpStatus.OK.equals(response.getStatusCode()); + protected final T extractData(ClientHttpResponse response, Class cls) throws IOException { + notNull(response, "response"); + notNull(cls, "cls"); + if (Void.class.isAssignableFrom(cls)) { + return null; } + return new HttpMessageConverterExtractor<>(cls, restTemplate.getMessageConverters()).extractData(response); } - private class ReusableClientHttpResponse implements ClientHttpResponse { private final byte[] body; diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java new file mode 100644 index 000000000..64ea37443 --- /dev/null +++ b/src/main/java/com/gooddata/FutureResult.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import java.util.concurrent.TimeUnit; + +import static com.gooddata.Validate.notNull; + +/** + * Represents the result retrieved by polling on the REST API. + */ +public final class FutureResult { + + private final AbstractService service; + + private final PollHandler handler; + + /** + * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

+ * For internal usage by services employing polling. + * @param service this service + * @param handler poll handler + */ + public FutureResult(final AbstractService service, final PollHandler handler) { + this.service = notNull(service, "service"); + this.handler = notNull(handler, "handler"); + } + + /** + * Checks if the result is available + * @return true if so + * @throws GoodDataException when polling fails or the thread was interrupted + */ + public boolean isDone() { + return handler.isDone() || service.pollOnce(handler); + } + + /** + * Wait for the result to be available and return it's value + * @return result value + * @throws GoodDataException when polling fails or the thread was interrupted + */ + public T get() { + return get(0, null); + } + + /** + * Wait for the result to be available up to given time and return it's value + * @param timeout timeout value + * @param unit timeout unit + * @return result value + * @throws GoodDataException when polling fails, the timeout expires or the thread was interrupted + */ + public T get(final long timeout, final TimeUnit unit) { + if (handler.isDone()) { + return handler.getResult(); + } + return service.poll(handler, timeout, unit); + } + + public String getPollingUri() { + return handler.getPollingUri(); + } +} diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java new file mode 100644 index 000000000..4affa98a9 --- /dev/null +++ b/src/main/java/com/gooddata/PollHandler.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +import static com.gooddata.Validate.notNull; + +/** + * For internal usage by services employing polling.

+ * Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and + * may override {@link #onFinish()} method. + * @see FutureResult + */ +public class PollHandler { + + private final String pollingUri; + + private final Class resultClass; + + private boolean done = false; + + private T result; + + /** + * Creates a new instance of polling handler + * @param pollingUri URI for polling + * @param resultClass class of the result (or {@link Void}) + */ + public PollHandler(final String pollingUri, final Class resultClass) { + this.pollingUri = notNull(pollingUri, "pollingUri"); + this.resultClass = notNull(resultClass, "resultClass"); + } + + final String getPollingUri() { + return pollingUri; + } + + final Class getResultClass() { + return resultClass; + } + + final PollHandler setResult(T result) { + this.result = result; + this.done = true; + onFinish(); + return this; + } + + final boolean isDone() { + return done; + } + + /** + * Return result of polling + * @return result + */ + protected final T getResult() { + return result; + } + + /** + * Check if polling should finish + * @param response client side http response + * @return true if polling should finish + * @throws IOException + */ + protected boolean isFinished(final ClientHttpResponse response) throws IOException { + return HttpStatus.OK.equals(response.getStatusCode()); + } + + /** + * Method called after polling is successfully finished (default no-op) + */ + protected void onFinish() {} +} diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index dfdfa8c84..52776c24a 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -4,8 +4,10 @@ package com.gooddata.dataset; import com.gooddata.AbstractService; +import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.PollHandler; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; @@ -56,7 +58,7 @@ public DatasetManifest getDatasetManifest(Project project, String datasetId) { } } - public void loadDataset(Project project, DatasetManifest manifest, InputStream dataset) { + public FutureResult loadDataset(final Project project, final DatasetManifest manifest, final InputStream dataset) { notNull(project, "project"); notNull(dataset, "dataset"); notNull(manifest, "manifest"); @@ -68,45 +70,47 @@ public void loadDataset(Project project, DatasetManifest manifest, InputStream d dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); final PullTask pullTask = restTemplate.postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - final PullTaskStatus taskStatus = poll(pullTask.getUri(), new ConditionCallback() { + return new FutureResult<>(this, new PollHandler(pullTask.getUri(), Void.class) { @Override - public boolean finished(ClientHttpResponse response) throws IOException { + public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); - return status.isFinished(); + final boolean finished = status.isFinished(); + if (finished && !status.isSuccess()) { + String message = "status: " + status.getStatus(); + try { + final InputStream input = dataStoreService.download(dirPath.resolve(STATUS_FILE_NAME).toString()); + final FailStatus failStatus = mapper.readValue(input, FailStatus.class); + if (failStatus != null && failStatus.getError() != null) { + message = failStatus.getError().getFormattedMessage(); + } + } catch (IOException | DataStoreException ignored) { + // todo log? + } + throw new DatasetException(message, manifest.getDataSet()); + } + return finished; } - }, PullTaskStatus.class); - if (!taskStatus.isSuccess()) { - String message = "status: " + taskStatus.getStatus(); - try { - final InputStream input = dataStoreService.download(dirPath.resolve(STATUS_FILE_NAME).toString()); - final FailStatus status = mapper.readValue(input, FailStatus.class); - if (status != null && status.getError() != null) { - message = status.getError().getFormattedMessage(); + @Override + protected void onFinish() { + try { + dataStoreService.delete(dirPath.toString() + "/"); + } catch (DataStoreException ignored) { + // todo log? } - } catch (IOException | DataStoreException ignored) { - // todo log? } - throw new DatasetException(message, manifest.getDataSet()); - } + }); } catch (IOException e) { throw new DatasetException("Unable to serialize manifest", manifest.getDataSet(), e); } catch (DataStoreException | GoodDataRestException | RestClientException e) { throw new DatasetException("Unable to load", manifest.getDataSet(), e); - } finally { - try { - dataStoreService.delete(dirPath.toString() + "/"); - } catch (DataStoreException ignored) { - // todo log? - } } - } - public void loadDataset(Project project, String datasetId, InputStream dataset) { + public FutureResult loadDataset(Project project, String datasetId, InputStream dataset) { notNull(project, "project"); notEmpty(datasetId, "datasetId"); notNull(dataset, "dataset"); - loadDataset(project, getDatasetManifest(project, datasetId), dataset); + return loadDataset(project, getDatasetManifest(project, datasetId), dataset); } public Collection listDatasets(Project project) { diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 7ed4d69ad..3098492e8 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -4,8 +4,11 @@ package com.gooddata.model; import com.gooddata.AbstractService; +import com.gooddata.FutureResult; import com.gooddata.GoodDataRestException; +import com.gooddata.PollHandler; import com.gooddata.project.Project; +import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.FileCopyUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -24,24 +27,24 @@ public ModelService(RestTemplate restTemplate) { super(restTemplate); } - public ModelDiff getProjectModelDiff(Project project, DiffRequest diffRequest) { + public FutureResult getProjectModelDiff(Project project, DiffRequest diffRequest) { notNull(project, "project"); notNull(diffRequest, "diffRequest"); try { final DiffTask diffTask = restTemplate.postForObject(DiffRequest.URI, diffRequest, DiffTask.class, project.getId()); - return poll(diffTask.getUri(), new StatusOkConditionCallback(), ModelDiff.class); + return new FutureResult<>(this, new PollHandler<>(diffTask.getUri(), ModelDiff.class)); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); } } - public ModelDiff getProjectModelDiff(Project project, String targetModel) { + public FutureResult getProjectModelDiff(Project project, String targetModel) { notNull(project, "project"); notNull(targetModel, "targetModel"); return getProjectModelDiff(project, new DiffRequest(targetModel)); } - public ModelDiff getProjectModelDiff(Project project, Reader targetModel) { + public FutureResult getProjectModelDiff(Project project, Reader targetModel) { notNull(project, "project"); notNull(targetModel, "targetModel"); try { @@ -61,20 +64,27 @@ public void updateProjectModel(Project project, ModelDiff projectModelDiff) { } } - public void updateProjectModel(Project project, String maqlDdl) { + public FutureResult updateProjectModel(Project project, String maqlDdl) { notNull(project, "project"); notEmpty(maqlDdl, "maqlDdl"); try { final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), MaqlDdlLinks.class, project.getId()); - final MaqlDdlTaskStatus maqlDdlTaskStatus = poll(linkEntries.getStatusLink(), MaqlDdlTaskStatus.class); - if (!maqlDdlTaskStatus.isSuccess()) { - throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); - } + return new FutureResult<>(this, new PollHandler(linkEntries.getStatusLink(), Void.class) { + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + final boolean finished = super.isFinished(response); + if (finished) { + final MaqlDdlTaskStatus maqlDdlTaskStatus = extractData(response, MaqlDdlTaskStatus.class); + if (!maqlDdlTaskStatus.isSuccess()) { + throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); + } + } + return finished; + } + }); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to update project model", e); } } - - } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 784a04e5d..d1471fefa 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -13,6 +13,11 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import org.springframework.web.util.UriTemplate; +import java.util.HashSet; +import java.util.Set; + +import static java.util.Arrays.asList; + /** * Project in GoodData platform */ @@ -25,6 +30,7 @@ public class Project { public static final String PROJECTS_URI = "/gdc/account/profile/{id}/projects"; public static final String PROJECT_URI = Projects.URI + "/{id}"; public static final UriTemplate PROJECT_TEMPLATE = new UriTemplate(PROJECT_URI); + private static final Set PREPARING_STATES = new HashSet<>(asList("PREPARING", "PREPARED", "LOADING")); @JsonProperty("content") private ProjectContent content; @@ -203,6 +209,16 @@ public String getUploadsLink() { return links.getUploads(); } + @JsonIgnore + public boolean isPreparing() { + return PREPARING_STATES.contains(getState()); + } + + @JsonIgnore + public boolean isEnabled() { + return "ENABLED".equals(getState()); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 031cc1efc..13f92bd5f 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -6,8 +6,10 @@ import com.gooddata.AbstractService; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.account.AccountService; +import com.gooddata.FutureResult; +import com.gooddata.PollHandler; import com.gooddata.gdc.UriResponse; +import com.gooddata.account.AccountService; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; @@ -60,21 +62,29 @@ public Collection getProjects() { * @param project project to be created * @return created project (including very useful id) */ - public Project createProject(Project project) { + public FutureResult createProject(Project project) { notNull(project, "project"); - final UriResponse uri = restTemplate.postForObject(Projects.URI, project, UriResponse.class); + final UriResponse uri; + try { + uri = restTemplate.postForObject(Projects.URI, project, UriResponse.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create project", e); + } - return poll(uri.getUri(), - new ConditionCallback() { - @Override - public boolean finished(ClientHttpResponse response) throws IOException { - final Project project = extractData(response, Project.class); - return "ENABLED".equalsIgnoreCase(project.getState()); - } - }, - Project.class - ); + return new FutureResult<>(this, new PollHandler(uri.getUri(), Project.class) { + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + final Project project = extractData(response, Project.class); + return !project.isPreparing(); + } + @Override + protected void onFinish() { + if (!getResult().isEnabled()) { + throw new GoodDataException("Created project is not enabled"); + } + } + }); } /** diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index a979b2942..742abed99 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -17,7 +17,7 @@ public abstract class AbstractGoodDataIT { protected GoodData gd; @Before - public void setUp() { + public void commonSetUp() { initJadler().that().respondsWithDefaultContentType("application/json"); gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http") { @Override diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 3ec65270f..bfd60a8bb 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -35,12 +35,12 @@ public static void main(String... args) { final Collection projects = projectService.getProjects(); System.out.println(projects); - final Project project = projectService.createProject(new Project("sparkling", "pgroup2")); + final Project project = projectService.createProject(new Project("sparkling", "pgroup2")).get(); System.out.println(project.getSelfLink()); final ModelService modelService = gd.getModelService(); final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, - new InputStreamReader(Example.class.getResourceAsStream("/person.json"))); + new InputStreamReader(Example.class.getResourceAsStream("/person.json"))).get(); modelService.updateProjectModel(project, projectModelDiff); final MetadataService md = gd.getMetadataService(); @@ -51,7 +51,7 @@ public static void main(String... args) { final DatasetService datasetService = gd.getDatasetService(); final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); - datasetService.loadDataset(project, manifest, Example.class.getResourceAsStream("/person.csv")); + datasetService.loadDataset(project, manifest, Example.class.getResourceAsStream("/person.csv")).get(); final ReportDefinition reportDef = md.getObjByUri("/gdc/md/GoodSalesDemoKokot1/obj/1962", ReportDefinition.class); final ReportService reportService = gd.getReportService(); diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java new file mode 100644 index 000000000..703af2405 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -0,0 +1,108 @@ +package com.gooddata.project; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.UriResponse; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Before; +import org.junit.Test; + +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class ProjectServiceIT extends AbstractGoodDataIT { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final String PROJECT_URI = "/gdc/projects/123"; + + private Project loading; + private Project enabled; + private Project deleted; + + @Before + public void setUp() throws Exception { + loading = MAPPER.readValue(getClass().getResourceAsStream("/project/project-loading.json"), Project.class); + enabled = MAPPER.readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); + deleted = MAPPER.readValue(getClass().getResourceAsStream("/project/project-deleted.json"), Project.class); + } + + @Test + public void shouldCreateProject() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Projects.URI) + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withStatus(202) + ; + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROJECT_URI) + .respond() + .withBody(MAPPER.writeValueAsString(loading)) + .withStatus(202) + .thenRespond() + .withBody(MAPPER.writeValueAsString(enabled)) + .withStatus(200) + ; + + final Project project = gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); + assertThat(project, is(notNullValue())); + assertThat(project.getTitle(), is("TITLE")); + } + + @Test(expected = GoodDataException.class) + public void shouldFailWhenPostFails() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Projects.URI) + .respond() + .withStatus(400) + ; + gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); + } + + @Test(expected = GoodDataRestException.class) // todo previous method returns GoodDataException + public void shouldFailWhenPollFails() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Projects.URI) + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withStatus(202) + ; + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROJECT_URI) + .respond() + .withStatus(400) + ; + + gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); + } + + + @Test(expected = GoodDataException.class) + public void shouldFailWhenCantCreateProject() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Projects.URI) + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withStatus(202) + ; + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROJECT_URI) + .respond() + .withBody(MAPPER.writeValueAsString(deleted)) + .withStatus(200) + ; + + gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); + } + +} \ No newline at end of file diff --git a/src/test/resources/project/project-deleted.json b/src/test/resources/project/project-deleted.json new file mode 100644 index 000000000..789cd5ae2 --- /dev/null +++ b/src/test/resources/project/project-deleted.json @@ -0,0 +1,37 @@ +{ + "project": { + "content": { + "cluster": "CLUSTER", + "guidedNavigation": "1", + "isPublic": "0", + "driver": "Pg", + "state": "DELETED" + }, + "links": { + "ldm_thumbnail": "/gdc/projects/PROJECT_ID/ldm?thumbnail=1", + "self": "/gdc/projects/PROJECT_ID", + "clearCaches": "/gdc/projects/PROJECT_ID/clearCaches", + "invitations": "/gdc/projects/PROJECT_ID/invitations", + "users": "/gdc/projects/PROJECT_ID/users?link=1", + "uploads": "https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/", + "ldm": "/gdc/projects/PROJECT_ID/ldm", + "metadata": "/gdc/md/PROJECT_ID", + "publicartifacts": "/gdc/projects/PROJECT_ID/publicartifacts", + "roles": "/gdc/projects/PROJECT_ID/roles", + "dataload": "/gdc/projects/PROJECT_ID/dataload", + "connectors": "/gdc/projects/PROJECT_ID/connectors", + "execute": "/gdc/projects/PROJECT_ID/execute", + "schedules": "/gdc/projects/PROJECT_ID/schedules", + "templates": "/gdc/md/PROJECT_ID/templates", + "eventstores": "/gdc/projects/PROJECT_ID/dataload/eventstore/stores" + }, + "meta": { + "created": "2014-06-06 19:54:16", + "summary": "", + "updated": "2014-06-06 19:54:19", + "author": "/gdc/account/profile/USER_ID", + "title": "foo", + "contributor": "/gdc/account/profile/USER_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-loading.json b/src/test/resources/project/project-loading.json new file mode 100644 index 000000000..3e6e4e6a6 --- /dev/null +++ b/src/test/resources/project/project-loading.json @@ -0,0 +1,37 @@ +{ + "project": { + "content": { + "cluster": "CLUSTER", + "guidedNavigation": "1", + "isPublic": "0", + "driver": "Pg", + "state": "LOADING" + }, + "links": { + "ldm_thumbnail": "/gdc/projects/PROJECT_ID/ldm?thumbnail=1", + "self": "/gdc/projects/PROJECT_ID", + "clearCaches": "/gdc/projects/PROJECT_ID/clearCaches", + "invitations": "/gdc/projects/PROJECT_ID/invitations", + "users": "/gdc/projects/PROJECT_ID/users?link=1", + "uploads": "https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/", + "ldm": "/gdc/projects/PROJECT_ID/ldm", + "metadata": "/gdc/md/PROJECT_ID", + "publicartifacts": "/gdc/projects/PROJECT_ID/publicartifacts", + "roles": "/gdc/projects/PROJECT_ID/roles", + "dataload": "/gdc/projects/PROJECT_ID/dataload", + "connectors": "/gdc/projects/PROJECT_ID/connectors", + "execute": "/gdc/projects/PROJECT_ID/execute", + "schedules": "/gdc/projects/PROJECT_ID/schedules", + "templates": "/gdc/md/PROJECT_ID/templates", + "eventstores": "/gdc/projects/PROJECT_ID/dataload/eventstore/stores" + }, + "meta": { + "created": "2014-06-06 19:54:16", + "summary": "", + "updated": "2014-06-06 19:54:19", + "author": "/gdc/account/profile/USER_ID", + "title": "foo", + "contributor": "/gdc/account/profile/USER_ID" + } + } +} \ No newline at end of file From 581a38c14b2891d5bcf58c5606f12304003aa7a2 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 13 Jun 2014 18:02:05 +0200 Subject: [PATCH 0015/1191] tune DTOs in gdc package --- .../java/com/gooddata/gdc/ErrorStructure.java | 48 ++++++++++++++++--- src/main/java/com/gooddata/gdc/GdcError.java | 18 +++---- .../java/com/gooddata/gdc/UriResponse.java | 1 + .../com/gooddata/gdc/ErrorStructureTest.java | 33 +++++++++++++ .../java/com/gooddata/gdc/GdcErrorTest.java | 36 ++++++++++++++ .../com/gooddata/gdc/UriResponseTest.java | 32 +++++++++++++ src/test/resources/gdc/errorStructure.json | 10 ++++ src/test/resources/gdc/gdcError.json | 12 +++++ src/test/resources/gdc/uriResponse.json | 3 ++ 9 files changed, 176 insertions(+), 17 deletions(-) create mode 100644 src/test/java/com/gooddata/gdc/ErrorStructureTest.java create mode 100644 src/test/java/com/gooddata/gdc/GdcErrorTest.java create mode 100644 src/test/java/com/gooddata/gdc/UriResponseTest.java create mode 100644 src/test/resources/gdc/errorStructure.json create mode 100644 src/test/resources/gdc/gdcError.json create mode 100644 src/test/resources/gdc/uriResponse.json diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index ea13d0c51..966052707 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -1,20 +1,40 @@ package com.gooddata.gdc; +import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import static com.gooddata.Validate.notNull; + +/** + * Error structure (for embedding). + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) public class ErrorStructure { protected final String message; protected final String[] parameters; protected final String component; protected final String errorClass; + protected final String errorCode; + protected final String errorId; + protected final String trace; + protected final String requestId; - public ErrorStructure(@JsonProperty("errorClass") String errorClass, @JsonProperty("component") String component, - @JsonProperty("parameters") String[] parameters, @JsonProperty("message") String message) { - this.errorClass = errorClass; - this.component = component; - this.parameters = parameters; - this.message = message; + @JsonCreator + protected ErrorStructure(@JsonProperty("errorClass") String errorClass, @JsonProperty("component") String component, + @JsonProperty("parameters") String[] parameters, @JsonProperty("message") String message, + @JsonProperty("errorCode") String errorCode, @JsonProperty("errorId") String errorId, + @JsonProperty("trace") String trace, @JsonProperty("requestId") String requestId) { + this.errorClass = notNull(errorClass, "errorClass"); + this.component = notNull(component, "component"); + this.parameters = notNull(parameters, "parameters"); + this.message = notNull(message, "message"); + this.errorCode = errorCode; + this.errorId = errorId; + this.trace = trace; + this.requestId = requestId; } public String getMessage() { @@ -33,6 +53,22 @@ public String getErrorClass() { return errorClass; } + public String getErrorCode() { + return errorCode; + } + + public String getErrorId() { + return errorId; + } + + public String getTrace() { + return trace; + } + + public String getRequestId() { + return requestId; + } + @JsonIgnore public String getFormattedMessage() { return message == null ? null : String.format(message, parameters); diff --git a/src/main/java/com/gooddata/gdc/GdcError.java b/src/main/java/com/gooddata/gdc/GdcError.java index 58adcd982..5f17b9391 100644 --- a/src/main/java/com/gooddata/gdc/GdcError.java +++ b/src/main/java/com/gooddata/gdc/GdcError.java @@ -11,25 +11,21 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * GoodData REST API error structure + * GoodData REST API error structure. + * Deserialization only. */ @JsonTypeName("error") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class GdcError extends ErrorStructure { - private final String requestId; @JsonCreator - public GdcError(@JsonProperty("message") String message, @JsonProperty("parameters") String[] parameters, - @JsonProperty("requestId") String requestId, @JsonProperty("component") String component, - @JsonProperty("errorClass") String errorClass) { - super(errorClass, component, parameters, message); - this.requestId = requestId; - } - - public String getRequestId() { - return requestId; + private GdcError(@JsonProperty("errorClass") String errorClass, @JsonProperty("component") String component, + @JsonProperty("parameters") String[] parameters, @JsonProperty("message") String message, + @JsonProperty("errorCode") String errorCode, @JsonProperty("errorId") String errorId, + @JsonProperty("trace") String trace, @JsonProperty("requestId") String requestId) { + super(errorClass, component, parameters, message, errorCode, errorId, trace, requestId); } } diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index df17a443a..c9153914f 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -9,6 +9,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** + * Response containing URI */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java new file mode 100644 index 000000000..ca6b71cce --- /dev/null +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -0,0 +1,33 @@ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class ErrorStructureTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream inputStream = getClass().getResourceAsStream("/gdc/errorStructure.json"); + final ErrorStructure errStructure = new ObjectMapper().readValue(inputStream, ErrorStructure.class); + + assertThat(errStructure, is(notNullValue())); + assertThat(errStructure.getErrorClass(), is("CLASS")); + assertThat(errStructure.getTrace(), is("TRACE")); + assertThat(errStructure.getMessage(), is("MSG")); + assertThat(errStructure.getComponent(), is("COMPONENT")); + assertThat(errStructure.getErrorId(), is("ID")); + assertThat(errStructure.getErrorCode(), is("CODE")); + assertThat(errStructure.getRequestId(), is("REQ")); + + assertThat(errStructure.getParameters(), is(notNullValue())); + assertThat(errStructure.getParameters().length, is(2)); + assertThat(errStructure.getParameters()[0], is("PARAM1")); + assertThat(errStructure.getParameters()[1], is("PARAM2")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java new file mode 100644 index 000000000..620875829 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class GdcErrorTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream inputStream = getClass().getResourceAsStream("/gdc/gdcError.json"); + final GdcError err = new ObjectMapper().readValue(inputStream, GdcError.class); + + assertThat(err, is(notNullValue())); + assertThat(err.getErrorClass(), is("CLASS")); + assertThat(err.getTrace(), is("TRACE")); + assertThat(err.getMessage(), is("MSG")); + assertThat(err.getComponent(), is("COMPONENT")); + assertThat(err.getErrorId(), is("ID")); + assertThat(err.getErrorCode(), is("CODE")); + assertThat(err.getRequestId(), is("REQ")); + + assertThat(err.getParameters(), is(notNullValue())); + assertThat(err.getParameters().length, is(2)); + assertThat(err.getParameters()[0], is("PARAM1")); + assertThat(err.getParameters()[1], is("PARAM2")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java new file mode 100644 index 000000000..df5f89854 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Assert; +import org.junit.Test; + +import java.io.InputStream; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class UriResponseTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream inputStream = getClass().getResourceAsStream("/gdc/uriResponse.json"); + final UriResponse uriResponse = new ObjectMapper().readValue(inputStream, UriResponse.class); + + assertThat(uriResponse, is(notNullValue())); + assertThat(uriResponse.getUri(), is("URI")); + } + + @Test + public void testSerialization() throws Exception { + Assert.assertThat(new UriResponse("URI"), serializesToJson("/gdc/uriResponse.json")); + } +} \ No newline at end of file diff --git a/src/test/resources/gdc/errorStructure.json b/src/test/resources/gdc/errorStructure.json new file mode 100644 index 000000000..8945cb088 --- /dev/null +++ b/src/test/resources/gdc/errorStructure.json @@ -0,0 +1,10 @@ +{ + "errorClass": "CLASS", + "trace": "TRACE", + "message": "MSG", + "component": "COMPONENT", + "errorId": "ID", + "errorCode": "CODE", + "requestId": "REQ", + "parameters": [ "PARAM1", "PARAM2" ] +} diff --git a/src/test/resources/gdc/gdcError.json b/src/test/resources/gdc/gdcError.json new file mode 100644 index 000000000..b61b0dfad --- /dev/null +++ b/src/test/resources/gdc/gdcError.json @@ -0,0 +1,12 @@ +{ + "error" : { + "errorClass" : "CLASS", + "trace" : "TRACE", + "message" : "MSG", + "component" : "COMPONENT", + "errorId" : "ID", + "errorCode" : "CODE", + "requestId" : "REQ", + "parameters" : [ "PARAM1", "PARAM2" ] + } +} diff --git a/src/test/resources/gdc/uriResponse.json b/src/test/resources/gdc/uriResponse.json new file mode 100644 index 000000000..38134e286 --- /dev/null +++ b/src/test/resources/gdc/uriResponse.json @@ -0,0 +1,3 @@ +{ + "uri" : "URI" +} From 1c754aae8ac6498dfa659737f982d907779ecc8b Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 16 Jun 2014 12:19:37 +0200 Subject: [PATCH 0016/1191] document Validate class --- src/main/java/com/gooddata/Validate.java | 42 +++++++++++++++++++----- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/Validate.java b/src/main/java/com/gooddata/Validate.java index 894314f1a..ad6c4b6c6 100644 --- a/src/main/java/com/gooddata/Validate.java +++ b/src/main/java/com/gooddata/Validate.java @@ -8,27 +8,53 @@ */ public abstract class Validate { - public static T notNull(T value, String aargument) { + /** + * Throws IllegalArgumentException if the value is null, otherwise returns the value. + * + * @param value input value + * @param argumentName the name of input argument + * @param the type of the argument + * @return the value + */ + public static T notNull(T value, String argumentName) { if (value == null) { - throw new IllegalArgumentException(aargument + " can't be null"); + throw new IllegalArgumentException(argumentName + " can't be null"); } return value; } - public static T notEmpty(T value, String argument) { - notNull(value, argument); + /** + * Throws IllegalArgumentException if the char sequence is empty, otherwise returns the char sequence. + * + * @param value input char sequence + * @param argumentName the name of input argument + * @param the type of char sequence + * @return the char sequence + */ + public static T notEmpty(T value, String argumentName) { + notNull(value, argumentName); if (value.toString().trim().length() == 0) { - throw new IllegalArgumentException(argument + " can't be empty"); + throw new IllegalArgumentException(argumentName + " can't be empty"); } return value; } - public static T noNullElements(T collection, String argument) { - notNull(collection, argument); + /** + * + * Throws IllegalArgumentException if the collection contains null elements (or is null), otherwise returns + * the collection. + * + * @param collection input collection + * @param argumentName the name of input argument + * @param the type of the collection + * @return the collection + */ + public static T noNullElements(T collection, String argumentName) { + notNull(collection, argumentName); int i = 0; for (Iterator it = collection.iterator(); it.hasNext(); i++) { if (it.next() == null) { - throw new IllegalArgumentException(argument + " contains null element at index: " + i); + throw new IllegalArgumentException(argumentName + " contains null element at index: " + i); } } return collection; From fee79115c36b3b41be7b4119ec5d2d4aec836684 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 16 Jun 2014 12:38:57 +0200 Subject: [PATCH 0017/1191] tune model package DTOs --- .../DiffTask.java => gdc/AsyncTask.java} | 13 +-- .../java/com/gooddata/gdc/LinkEntries.java | 49 +++++++++ .../java/com/gooddata/model/DiffRequest.java | 6 +- src/main/java/com/gooddata/model/MaqlDdl.java | 8 +- .../java/com/gooddata/model/MaqlDdlLinks.java | 37 ++----- .../com/gooddata/model/MaqlDdlTaskStatus.java | 15 +-- .../java/com/gooddata/model/ModelDiff.java | 101 ++++++++++++------ .../java/com/gooddata/model/ModelService.java | 12 +-- .../java/com/gooddata/gdc/AsyncTaskTest.java | 22 ++++ .../com/gooddata/gdc/LinkEntriesTest.java | 29 +++++ .../com/gooddata/model/DiffRequestTest.java | 6 +- .../java/com/gooddata/model/DiffTaskTest.java | 29 ----- .../com/gooddata/model/MaqlDdlLinksTest.java | 25 +++++ .../gooddata/model/MaqlDdlTaskStatusTest.java | 12 +-- .../java/com/gooddata/model/MaqlDdlTest.java | 9 +- .../com/gooddata/model/ModelDiffTest.java | 89 +++++++++++++++ src/test/resources/gdc/asyncTask.json | 7 ++ src/test/resources/gdc/linkEntries.json | 8 ++ src/test/resources/model/maqlDdlLinks.json | 8 ++ src/test/resources/model/modelDiff.json | 31 ++++++ 20 files changed, 389 insertions(+), 127 deletions(-) rename src/main/java/com/gooddata/{model/DiffTask.java => gdc/AsyncTask.java} (75%) create mode 100644 src/main/java/com/gooddata/gdc/LinkEntries.java create mode 100644 src/test/java/com/gooddata/gdc/AsyncTaskTest.java create mode 100644 src/test/java/com/gooddata/gdc/LinkEntriesTest.java delete mode 100644 src/test/java/com/gooddata/model/DiffTaskTest.java create mode 100644 src/test/java/com/gooddata/model/MaqlDdlLinksTest.java create mode 100644 src/test/java/com/gooddata/model/ModelDiffTest.java create mode 100644 src/test/resources/gdc/asyncTask.json create mode 100644 src/test/resources/gdc/linkEntries.json create mode 100644 src/test/resources/model/maqlDdlLinks.json create mode 100644 src/test/resources/model/modelDiff.json diff --git a/src/main/java/com/gooddata/model/DiffTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java similarity index 75% rename from src/main/java/com/gooddata/model/DiffTask.java rename to src/main/java/com/gooddata/gdc/AsyncTask.java index ddab79ba8..1c34b51b3 100644 --- a/src/main/java/com/gooddata/model/DiffTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.model; +package com.gooddata.gdc; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -11,18 +11,19 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * TODO may be move somewhere to common + * Asynchronous task containing link for polling. + * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("asyncTask") @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class DiffTask { +public class AsyncTask { private Link link; @JsonCreator - public DiffTask(@JsonProperty("link") Link link) { + private AsyncTask(@JsonProperty("link") Link link) { this.link = link; } @@ -30,11 +31,11 @@ public String getUri() { return link.pollUri; } - public static class Link { + private static class Link { private String pollUri; @JsonCreator - public Link(@JsonProperty("poll") String pollUri) { + private Link(@JsonProperty("poll") String pollUri) { this.pollUri = pollUri; } } diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/src/main/java/com/gooddata/gdc/LinkEntries.java new file mode 100644 index 000000000..38dd4ab52 --- /dev/null +++ b/src/main/java/com/gooddata/gdc/LinkEntries.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; + +/** + * Collection of links. Typically used as a result of asynchronous task returning more links. + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class LinkEntries { + + private final List entries; + + @JsonCreator + protected LinkEntries(@JsonProperty("entries") List entries) { + this.entries = entries; + } + + protected List getEntries() { + return entries; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + protected static class LinkEntry { + private final String link; + private final String category; + + @JsonCreator + private LinkEntry(@JsonProperty("link") String link, @JsonProperty("category") String category) { + this.link = link; + this.category = category; + } + + public String getLink() { + return link; + } + + public String getCategory() { + return category; + } + } +} diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index 0bbe90c83..df9543b56 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -3,7 +3,6 @@ */ package com.gooddata.model; -import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonRawValue; @@ -15,6 +14,7 @@ /** * A request to perform diff between current project model and given targetModel. + * Serialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("diffRequest") @@ -25,13 +25,13 @@ public class DiffRequest { public static final String URI = "/gdc/projects/{project-id}/model/diff"; @JsonRawValue + @JsonProperty("targetModel") private final String targetModel; /** * @param targetModel desired target state of project model */ - @JsonCreator - public DiffRequest(@JsonProperty("targetModel") String targetModel) { + public DiffRequest(String targetModel) { this.targetModel = notNull(targetModel, "targetModel"); } diff --git a/src/main/java/com/gooddata/model/MaqlDdl.java b/src/main/java/com/gooddata/model/MaqlDdl.java index f4b724450..6e82f264e 100644 --- a/src/main/java/com/gooddata/model/MaqlDdl.java +++ b/src/main/java/com/gooddata/model/MaqlDdl.java @@ -3,7 +3,6 @@ */ package com.gooddata.model; -import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -11,7 +10,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * MAQL DDL statement + * MAQL DDL statement. + * Serialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("manage") @@ -21,10 +21,10 @@ public class MaqlDdl { public static final String URI = "/gdc/md/{project}/ldm/manage2"; + @JsonProperty("maql") private final String maql; - @JsonCreator - public MaqlDdl(@JsonProperty("maql") String maql) { + public MaqlDdl(String maql) { this.maql = maql; } diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/src/main/java/com/gooddata/model/MaqlDdlLinks.java index 37593764b..9e599599a 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/src/main/java/com/gooddata/model/MaqlDdlLinks.java @@ -3,6 +3,7 @@ */ package com.gooddata.model; +import com.gooddata.gdc.LinkEntries; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; @@ -11,48 +12,26 @@ import java.util.List; /** -* TODO -*/ + * MAQL DDL links (result from POSTing to /ldm/manage2). + * Deserialization only. + */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -class MaqlDdlLinks { +class MaqlDdlLinks extends LinkEntries { private static final String TASKS_STATUS = "tasks-status"; - private final List entries; - @JsonCreator - MaqlDdlLinks(@JsonProperty("entries") List entries) { - this.entries = entries; + private MaqlDdlLinks(@JsonProperty("entries") List entries) { + super(entries); } public String getStatusLink() { - for (LinkEntry linkEntry : entries) { + for (LinkEntry linkEntry : getEntries()) { if (TASKS_STATUS.equals(linkEntry.getCategory())) { return linkEntry.getLink(); } } return null; } - - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - private static class LinkEntry { - private final String link; - private final String category; - - @JsonCreator - private LinkEntry(@JsonProperty("link") String link, @JsonProperty("category") String category) { - this.link = link; - this.category = category; - } - - public String getLink() { - return link; - } - - public String getCategory() { - return category; - } - } } diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java index 8735e57aa..1e88c2275 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java @@ -14,7 +14,8 @@ import java.util.Collection; /** - * MAQL DDL task status + * MAQL DDL asynchronous task status. + * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("wTaskStatus") @@ -26,15 +27,15 @@ public class MaqlDdlTaskStatus { private final String status; - private final String uri; + private final String pollUri; private final Collection messages; @JsonCreator - public MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String uri, - @JsonProperty("messages") Collection messages) { + private MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, + @JsonProperty("messages") Collection messages) { this.status = status; - this.uri = uri; + this.pollUri = pollUri; this.messages = messages; } @@ -42,8 +43,8 @@ public String getStatus() { return status; } - public String getUri() { - return uri; + public String getPollUri() { + return pollUri; } public Collection getMessages() { diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index 4383590c7..e480d716a 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -6,78 +6,119 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonPropertyOrder; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; + import java.util.Collections; import java.util.List; +import static java.util.Collections.emptyList; +import static java.util.Collections.unmodifiableList; + /** - * Model diff + * Model diff including MAQL DDL. + * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("projectModelDiff") -@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS) -@JsonPropertyOrder({"updateOperations", "updateScripts"}) @JsonIgnoreProperties(ignoreUnknown = true) public class ModelDiff { - private final List updateOperations; - private final List updateScripts; /** - * @param updateOperations informal structured representation of the diff; suitable for presentation purposes - * @param updateScripts + * @param updateScripts several variants of MAQL DDL evolution scripts that should be executed to update + * the source model to the target state */ @JsonCreator - public ModelDiff(@JsonProperty("updateOperations") List updateOperations, - @JsonProperty("updateScripts") List updateScripts) { - - this.updateOperations = updateOperations == null ? Collections.emptyList() : updateOperations; + ModelDiff(@JsonProperty("updateScripts") List updateScripts) { this.updateScripts = updateScripts == null ? Collections.emptyList() : updateScripts; } /** - * Returns informal structured representation of the diff. Suitable for presentation purposes. - * - * Returned list will be empty if there are no differences. + * Returns several variants of MAQL DDL evolution scripts that should be executed to update the source model to the + * target state. Individual variants differ in their side-effects (truncation of loaded data, drops of related objects...) + *

+ * Will be empty for empty diff. */ - public List getUpdateOperations() { - return Collections.unmodifiableList(updateOperations); + List getUpdateScripts() { + return unmodifiableList(updateScripts); } /** - * Returns several variants of MAQL DDL evolution scripts that should be executed to update the source model to the - * target state. Individual variants differ in their side-effects (truncation of loaded data, drops of related objects...) + * Returns MAQL DDL update script that should be executed to update the source model to the + * target state. + *

+ * It picks the best possible variant by it's side-effects (truncation + * of loaded data, drops of related objects). It returns first present variant by order: + *

    + *
  1. preserve data + no cascade drops
  2. + *
  3. no preserve data + no cascade drops
  4. + *
  5. preserve data + cascade drops
  6. + *
  7. no preserve data + cascade drops
  8. + *
+ *

+ * Returned list will be empty if there are no differences. * - * Will be empty for empty diff. + * @return MAQL DDL update scripts. Empty list if there are no differences. */ - public List getUpdateScripts() { - return Collections.unmodifiableList(updateScripts); + public List getUpdateMaql() { + if (updateScripts.isEmpty()) { + return emptyList(); + } + + UpdateScript chosenScript; + if ((chosenScript = getUpdateScriptByFlags(true, false)) != null) { + return unmodifiableList(chosenScript.getMaqlChunks()); + } + if ((chosenScript = getUpdateScriptByFlags(false, false)) != null) { + return unmodifiableList(chosenScript.getMaqlChunks()); + } + if ((chosenScript = getUpdateScriptByFlags(true, true)) != null) { + return unmodifiableList(chosenScript.getMaqlChunks()); + } + + return unmodifiableList(updateScripts.get(0).getMaqlChunks()); } - @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) - @JsonTypeName("updateOperation") - @JsonIgnoreProperties(ignoreUnknown = true) - public static class UpdateOperation { + private UpdateScript getUpdateScriptByFlags(final boolean preserveData, final boolean cascadeDrops) { + UpdateScript result = null; + for (final UpdateScript script : updateScripts) { + if (script.isPreserveData() == preserveData && script.isCascadeDrops() == cascadeDrops) { + result = script; + } + } + return result; } @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("updateScript") @JsonIgnoreProperties(ignoreUnknown = true) - public static class UpdateScript { + static class UpdateScript { private List maqlChunks; + private Boolean preserveData; + private Boolean cascadeDrops; @JsonCreator - public UpdateScript(@JsonProperty("maqlDdlChunks") List maqlChunks) { - this.maqlChunks = maqlChunks; + UpdateScript(@JsonProperty("maqlDdlChunks") List maqlChunks, + @JsonProperty("preserveData") Boolean preserveData, + @JsonProperty("cascadeDrops") Boolean cascadeDrops) { + this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; + this.preserveData = preserveData; + this.cascadeDrops = cascadeDrops; } public List getMaqlChunks() { return maqlChunks; } + + public Boolean isPreserveData() { + return preserveData; + } + + public Boolean isCascadeDrops() { + return cascadeDrops; + } } } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 3098492e8..24beb4bc6 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -7,6 +7,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataRestException; import com.gooddata.PollHandler; +import com.gooddata.gdc.AsyncTask; import com.gooddata.project.Project; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.FileCopyUtils; @@ -31,8 +32,8 @@ public FutureResult getProjectModelDiff(Project project, DiffRequest notNull(project, "project"); notNull(diffRequest, "diffRequest"); try { - final DiffTask diffTask = restTemplate.postForObject(DiffRequest.URI, diffRequest, DiffTask.class, project.getId()); - return new FutureResult<>(this, new PollHandler<>(diffTask.getUri(), ModelDiff.class)); + final AsyncTask asyncTask = restTemplate.postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); + return new FutureResult<>(this, new PollHandler<>(asyncTask.getUri(), ModelDiff.class)); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); } @@ -57,10 +58,9 @@ public FutureResult getProjectModelDiff(Project project, Reader targe public void updateProjectModel(Project project, ModelDiff projectModelDiff) { notNull(project, "project"); notNull(projectModelDiff, "projectModelDiff"); - for (ModelDiff.UpdateScript updateScript : projectModelDiff.getUpdateScripts()) { - for (String maql : updateScript.getMaqlChunks()) { - updateProjectModel(project, maql); - } + + for (String maql : projectModelDiff.getUpdateMaql()) { + updateProjectModel(project, maql); } } diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java new file mode 100644 index 000000000..7abb362b0 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.junit.Assert.assertEquals; + +public class AsyncTaskTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream is = getClass().getResourceAsStream("/gdc/asyncTask.json"); + final AsyncTask asyncTask = new ObjectMapper().readValue(is, AsyncTask.class); + + assertEquals("POLL-URI", asyncTask.getUri()); + } +} diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java new file mode 100644 index 000000000..89494ffa9 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; + +public class LinkEntriesTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/gdc/linkEntries.json"); + final LinkEntries linkEntries = new ObjectMapper().readValue(stream, LinkEntries.class); + + assertThat(linkEntries, is(notNullValue())); + assertThat(linkEntries.getEntries(), hasSize(1)); + assertThat(linkEntries.getEntries().get(0), is(notNullValue())); + assertThat(linkEntries.getEntries().get(0).getLink(), is("URI")); + assertThat(linkEntries.getEntries().get(0).getCategory(), is("tasks-status")); + } +} diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index 318614b87..a0991bb4d 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -3,18 +3,18 @@ */ package com.gooddata.model; -import static org.junit.Assert.assertEquals; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class DiffRequestTest { private static final ObjectMapper mapper = new ObjectMapper(); @Test - public void testSer() throws Exception { + public void testSerialization() throws Exception { String valueAsString = mapper.writeValueAsString(new DiffRequest("{\"projectModel\":\"xxx\"}")); assertEquals("{\"diffRequest\":{\"targetModel\":{\"projectModel\":\"xxx\"}}}", valueAsString); - } } diff --git a/src/test/java/com/gooddata/model/DiffTaskTest.java b/src/test/java/com/gooddata/model/DiffTaskTest.java deleted file mode 100644 index 16aae0d8e..000000000 --- a/src/test/java/com/gooddata/model/DiffTaskTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.model; - - -import static org.junit.Assert.assertEquals; -import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; - -public class DiffTaskTest { - - private static final ObjectMapper mapper = new ObjectMapper(); - - @Test - public void testDeser() throws Exception { - - final DiffTask diffTask = mapper.readValue("{\n" - + " \"asyncTask\": {\n" - + " \"link\": {\n" - + " \"poll\": \"/gdc/projects/{project-id}/model/diff/{diff-id}\"\n" - + " }\n" - + " }\n" - + "}", DiffTask.class); - assertEquals("/gdc/projects/{project-id}/model/diff/{diff-id}", diffTask.getUri()); - - - } -} diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java new file mode 100644 index 000000000..0b5db4c9a --- /dev/null +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.model; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.junit.Assert.assertThat; + +public class MaqlDdlLinksTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/model/maqlDdlLinks.json"); + final MaqlDdlLinks maqlDdlLinks = new ObjectMapper().readValue(stream, MaqlDdlLinks.class); + + assertThat(maqlDdlLinks, is(notNullValue())); + assertThat(maqlDdlLinks.getStatusLink(), is("URI")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index ff3956bdd..2e26b46b0 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -3,15 +3,15 @@ */ package com.gooddata.model; +import com.gooddata.gdc.GdcError; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; -import com.gooddata.gdc.GdcError; -import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; - public class MaqlDdlTaskStatusTest { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -20,14 +20,14 @@ public class MaqlDdlTaskStatusTest { public void testDeser() throws Exception { final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), MaqlDdlTaskStatus.class); assertEquals("OK", status.getStatus()); - assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getUri()); + assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getPollUri()); } @Test public void testDeserMessages() throws Exception { final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), MaqlDdlTaskStatus.class); assertEquals("ERROR", status.getStatus()); - assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getUri()); + assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getPollUri()); assertThat(status.getMessages(), hasSize(1)); final GdcError error = status.getMessages().iterator().next(); assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index 4c791fa89..814aca162 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -3,16 +3,17 @@ */ package com.gooddata.model; - -import static org.junit.Assert.assertEquals; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; +import static org.junit.Assert.assertEquals; + public class MaqlDdlTest { @Test - public void testSer() throws Exception { - assertEquals("{\"manage\":{\"maql\":\"maqlddl\"}}", new ObjectMapper().writeValueAsString(new MaqlDdl("maqlddl"))); + public void testSerialization() throws Exception { + assertEquals("{\"manage\":{\"maql\":\"maqlddl\"}}", + new ObjectMapper().writeValueAsString(new MaqlDdl("maqlddl"))); } } diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java new file mode 100644 index 000000000..14e5539b2 --- /dev/null +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.model; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; +import java.util.Collections; + +import static com.gooddata.model.ModelDiff.UpdateScript; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.notNullValue; + +public class ModelDiffTest { + + @Test + public void testGetUpdateMaqls() throws Exception { + final ModelDiff diff = new ModelDiff(singletonList(new UpdateScript(asList("maql1", "maql2"), true, false))); + + assertThat(diff.getUpdateMaql(), hasSize(2)); + assertThat(diff.getUpdateMaql(), contains("maql1", "maql2")); + } + + @Test + public void testGetUpdateMaqlsReturnsBest() throws Exception { + final ModelDiff diff = new ModelDiff(asList( + new UpdateScript(asList("maql1"), false, false), + new UpdateScript(asList("maql2"), true, false)) + ); + + assertThat(diff.getUpdateMaql(), hasSize(1)); + assertThat(diff.getUpdateMaql(), contains("maql2")); + } + + @Test + public void testGetUpdateMaqlsReturnsNotWorst() throws Exception { + final ModelDiff diff = new ModelDiff(asList( + new UpdateScript(asList("maql1"), false, true), + new UpdateScript(asList("maql2"), false, false)) + ); + + assertThat(diff.getUpdateMaql(), hasSize(1)); + assertThat(diff.getUpdateMaql(), contains("maql2")); + } + + @Test + public void testGetUpdateMaqlsNoPreserveData() throws Exception { + final ModelDiff diff = new ModelDiff(singletonList(new UpdateScript(asList("maql"), false, false))); + + assertThat(diff.getUpdateMaql(), hasSize(1)); + assertThat(diff.getUpdateMaql().get(0), equalTo("maql")); + } + + @Test + public void testGetUpdateMaqlsNoUpdateScript() throws Exception { + final ModelDiff diff = new ModelDiff(Collections.emptyList()); + + assertThat(diff.getUpdateMaql(), hasSize(0)); + } + + @Test + public void testGetUpdateMaqlsNoMaqlInUpdateScript() throws Exception { + final ModelDiff diff = new ModelDiff(asList(new UpdateScript(Collections.emptyList(), true, false))); + + assertThat(diff.getUpdateMaql(), hasSize(0)); + } + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/model/modelDiff.json"); + final ModelDiff diff = new ObjectMapper().readValue(stream, ModelDiff.class); + + assertThat(diff, is(notNullValue())); + assertThat(diff.getUpdateScripts(), hasSize(2)); + assertThat(diff.getUpdateScripts().get(0).isPreserveData(), is(true)); + assertThat(diff.getUpdateScripts().get(0).isCascadeDrops(), is(false)); + assertThat(diff.getUpdateScripts().get(0).getMaqlChunks(), hasSize(1)); + assertThat(diff.getUpdateScripts().get(0).getMaqlChunks(), contains( + "CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee} PRESERVE DATA;")); + } +} \ No newline at end of file diff --git a/src/test/resources/gdc/asyncTask.json b/src/test/resources/gdc/asyncTask.json new file mode 100644 index 000000000..2cf1a7ac2 --- /dev/null +++ b/src/test/resources/gdc/asyncTask.json @@ -0,0 +1,7 @@ +{ + "asyncTask": { + "link": { + "poll": "POLL-URI" + } + } +} diff --git a/src/test/resources/gdc/linkEntries.json b/src/test/resources/gdc/linkEntries.json new file mode 100644 index 000000000..c406691fd --- /dev/null +++ b/src/test/resources/gdc/linkEntries.json @@ -0,0 +1,8 @@ +{ + "entries" : [ + { + "link" : "URI", + "category" : "tasks-status" + } + ] +} diff --git a/src/test/resources/model/maqlDdlLinks.json b/src/test/resources/model/maqlDdlLinks.json new file mode 100644 index 000000000..c406691fd --- /dev/null +++ b/src/test/resources/model/maqlDdlLinks.json @@ -0,0 +1,8 @@ +{ + "entries" : [ + { + "link" : "URI", + "category" : "tasks-status" + } + ] +} diff --git a/src/test/resources/model/modelDiff.json b/src/test/resources/model/modelDiff.json new file mode 100644 index 000000000..8488e2b5b --- /dev/null +++ b/src/test/resources/model/modelDiff.json @@ -0,0 +1,31 @@ +{ + "projectModelDiff": { + "updateOperations": [ + { + "updateOperation": { + "type": "create.fact", + "dataset": "dataset.employee", + "destructive": false, + "description": "Create Fact '%s'", + "paramaters": ["Employee Age"] + } + } + ], + "updateScripts": [ + { + "updateScript": { + "maqlDdlChunks": [ "CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee} PRESERVE DATA;" ], + "preserveData": true, + "cascadeDrops": false + } + }, + { + "updateScript": { + "maqlDdlChunks": [ "CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee};" ], + "preserveData": false, + "cascadeDrops": false + } + } + ] + } +} From e42fc865d40a15d2368475be8e24a6fa83c35380 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 16 Jun 2014 13:01:26 +0200 Subject: [PATCH 0018/1191] tune ProjectService --- .../com/gooddata/project/ProjectService.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 13f92bd5f..769682f0f 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -4,12 +4,12 @@ package com.gooddata.project; import com.gooddata.AbstractService; +import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.FutureResult; import com.gooddata.PollHandler; -import com.gooddata.gdc.UriResponse; import com.gooddata.account.AccountService; +import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; @@ -36,6 +36,12 @@ public class ProjectService extends AbstractService { private final AccountService accountService; + /** + * Constructs service for GoodData project management (list projects, create a project, ...). + * + * @param restTemplate RESTful HTTP Spring template + * @param accountService GoodData account service + */ public ProjectService(RestTemplate restTemplate, AccountService accountService) { super(restTemplate); this.accountService = notNull(accountService, "accountService"); @@ -72,12 +78,18 @@ public FutureResult createProject(Project project) { throw new GoodDataException("Unable to create project", e); } + if (uri == null) { + throw new GoodDataException("Empty response when project POSTed to API"); + } + return new FutureResult<>(this, new PollHandler(uri.getUri(), Project.class) { + @Override public boolean isFinished(ClientHttpResponse response) throws IOException { final Project project = extractData(response, Project.class); return !project.isPreparing(); } + @Override protected void onFinish() { if (!getResult().isEnabled()) { From 64f9f429c0f303f361deea4cfe3b4d23585ae2ff Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 19 Jun 2014 18:30:12 +0200 Subject: [PATCH 0019/1191] tune report package DTOs --- .../java/com/gooddata/report/ExecResult.java | 24 ------------------- .../com/gooddata/report/ReportRequest.java | 4 ++++ .../com/gooddata/report/ReportService.java | 11 +++++---- .../gooddata/report/ReportRequestTest.java | 18 ++++++++++++++ src/test/resources/report/reportRequest.json | 5 ++++ 5 files changed, 33 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/com/gooddata/report/ExecResult.java create mode 100644 src/test/java/com/gooddata/report/ReportRequestTest.java create mode 100644 src/test/resources/report/reportRequest.json diff --git a/src/main/java/com/gooddata/report/ExecResult.java b/src/main/java/com/gooddata/report/ExecResult.java deleted file mode 100644 index 37a858362..000000000 --- a/src/main/java/com/gooddata/report/ExecResult.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.report; - -import org.codehaus.jackson.JsonNode; - -import static com.gooddata.Validate.notNull; - -/** - * Executed report - */ -class ExecResult { - - private final JsonNode jsonNode; - - ExecResult(JsonNode jsonNode) { - this.jsonNode = notNull(jsonNode, "jsonNode"); - } - - JsonNode getJsonNode() { - return jsonNode; - } -} diff --git a/src/main/java/com/gooddata/report/ReportRequest.java b/src/main/java/com/gooddata/report/ReportRequest.java index 9c0d43f68..dedd847f5 100644 --- a/src/main/java/com/gooddata/report/ReportRequest.java +++ b/src/main/java/com/gooddata/report/ReportRequest.java @@ -9,6 +9,10 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; +/** + * Report execution request. + * Serialization only. + */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("report_req") @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index dbaccefb6..e12055d4d 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -7,6 +7,7 @@ import com.gooddata.GoodDataException; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; +import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ObjectNode; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; @@ -38,7 +39,7 @@ public ReportService(final RestTemplate restTemplate) { public String exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format) { notNull(reportDefinition, "reportDefinition"); notNull(format, "format"); - final ExecResult execResult = executeReport(reportDefinition.getUri()); + final JsonNode execResult = executeReport(reportDefinition.getUri()); return exportReport(execResult, format); } @@ -58,13 +59,13 @@ public Integer extractData(ClientHttpResponse response) throws IOException { } } - private ExecResult executeReport(final String reportDefinitionUri) { + private JsonNode executeReport(final String reportDefinitionUri) { notEmpty(reportDefinitionUri, "reportDefinitionUri"); try { final ResponseEntity entity = restTemplate .exchange(ReportRequest.URI, POST, new HttpEntity<>(new ReportRequest(reportDefinitionUri)), String.class); - return new ExecResult(mapper.readTree(entity.getBody())); + return mapper.readTree(entity.getBody()); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to execute report", e); } catch (IOException e) { @@ -72,13 +73,13 @@ private ExecResult executeReport(final String reportDefinitionUri) { } } - private String exportReport(final ExecResult execResult, final ReportExportFormat format) { + private String exportReport(final JsonNode execResult, final ReportExportFormat format) { notNull(execResult, "execResult"); notNull(format, "format"); final ObjectNode root = mapper.createObjectNode(); final ObjectNode child = mapper.createObjectNode(); - child.put("result", execResult.getJsonNode()); + child.put("result", execResult); child.put("format", format.getValue()); root.put("result_req", child); diff --git a/src/test/java/com/gooddata/report/ReportRequestTest.java b/src/test/java/com/gooddata/report/ReportRequestTest.java new file mode 100644 index 000000000..73ecb69cc --- /dev/null +++ b/src/test/java/com/gooddata/report/ReportRequestTest.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.report; + +import com.gooddata.JsonMatchers; +import org.junit.Test; + +import static org.junit.Assert.assertThat; + +public class ReportRequestTest { + + @Test + public void testSerialization() throws Exception { + final ReportRequest request = new ReportRequest("DEF-URI"); + assertThat(request, JsonMatchers.serializesToJson("/report/reportRequest.json")); + } +} \ No newline at end of file diff --git a/src/test/resources/report/reportRequest.json b/src/test/resources/report/reportRequest.json new file mode 100644 index 000000000..f29a80af0 --- /dev/null +++ b/src/test/resources/report/reportRequest.json @@ -0,0 +1,5 @@ +{ + "report_req": { + "reportDefinition": "DEF-URI" + } +} From a7ec3afccd9c39cb62639c5bdec6e92009b6cd51 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 21 Jun 2014 02:19:42 +0200 Subject: [PATCH 0020/1191] add docs to GoodData class --- src/main/java/com/gooddata/GoodData.java | 86 +++++++++++++++++++++++- 1 file changed, 84 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 096077fa7..1f0e02461 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -27,8 +27,20 @@ import static com.gooddata.Validate.notEmpty; import static java.util.Collections.singletonMap; +import static org.apache.http.util.VersionInfo.loadVersionInfo; /** + * Entry point for GoodData SDK usage. + *

+ * Configure connection to GoodData using one of constructors. One can then get initialized service he needs from + * the newly constructed instance. This instance can be also used later for logout from GoodData Platform. + *

+ * Usage example: + *


+ *     GoodData gd = new GoodData("roman@gooddata.com", "Roman1");
+ *     // do something useful like: gd.getSomeService().doSomething()
+ *     gd.logout();
+ * 
*/ public class GoodData { @@ -48,14 +60,39 @@ public class GoodData { private final DatasetService datasetService; private final ReportService reportService; + /** + * Create instance configured to communicate with GoodData Platform under user with given credentials. + * + * @param login GoodData user's login + * @param password GoodData user's password + */ public GoodData(String login, String password) { this(HOSTNAME, login, password); } + /** + * Create instance configured to communicate with GoodData Platform running on given host using given user's + * credentials. + * + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param login GoodData user's login + * @param password GoodData user's password + */ public GoodData(String hostname, String login, String password) { this(hostname, login, password, PORT, PROTOCOL); } + + /** + * Create instance configured to communicate with GoodData Platform running on given host, port and protocol using + * given user's credentials. + * + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param login GoodData user's login + * @param password GoodData user's password + * @param port GoodData Platform's API port (e.g. 443) + * @param protocol GoodData Platform's API protocol (e.g. https) + */ public GoodData(String hostname, String login, String password, int port, String protocol) { notEmpty(hostname, "hostname"); notEmpty(login, "login"); @@ -63,7 +100,8 @@ public GoodData(String hostname, String login, String password, int port, String notEmpty(protocol, "protocol"); final HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() .setUserAgent(getUserAgent()); - final RestTemplate restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, protocol); + final RestTemplate restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, + protocol); accountService = new AccountService(restTemplate); projectService = new ProjectService(restTemplate, accountService); @@ -101,7 +139,7 @@ private String getUserAgent() { final String clientVersion = pkg != null && pkg.getImplementationVersion() != null ? pkg.getImplementationVersion() : UNKNOWN_VERSION; - final VersionInfo vi = VersionInfo.loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); + final VersionInfo vi = loadVersionInfo("org.apache.http.client", HttpClientBuilder.class.getClassLoader()); final String apacheVersion = vi != null ? vi.getRelease() : UNKNOWN_VERSION; return String.format("%s/%s (%s; %s) %s/%s", "GoodData-Java-SDK", clientVersion, @@ -109,38 +147,82 @@ private String getUserAgent() { "Apache-HttpClient", apacheVersion); } + /** + * Logout from GoodData Platform + */ public void logout() { getAccountService().logout(); } + /** + * Get initialized service for project management (to list projects, create a project, ...) + * + * @return initialized service for project management + */ public ProjectService getProjectService() { return projectService; } + /** + * Get initialized service for account management (to get current account information, logout, ...) + * + * @return initialized service for account management + */ public AccountService getAccountService() { return accountService; } + /** + * Get initialized service for metadata management (to query, create and update project metadata like attributes, + * facts, metrics, reports, ...) + * + * @return initialized service for metadata management + */ public MetadataService getMetadataService() { return metadataService; } + /** + * Get initialized service for model management (to get model diff, update model, ...) + * + * @return initialized service for model management + */ public ModelService getModelService() { return modelService; } + /** + * Get initialized service for API root management (to get API root links, ...) + * + * @return initialized service for API root management + */ public GdcService getGdcService() { return gdcService; } + /** + * Get initialized service for data store (user staging/WebDAV) management (to upload, download, delete, ...) + * + * @return initialized service for data store management + */ public DataStoreService getDataStoreService() { return dataStoreService; } + /** + * Get initialized service for dataset management (to list manifest, get datasets, load dataset, ...) + * + * @return initialized service for dataset management + */ public DatasetService getDatasetService() { return datasetService; } + /** + * Get initialized service for report management (to execute and export report, ...) + * + * @return initialized service for report management + */ public ReportService getReportService() { return reportService; } From 303a1eafa5e26adfa6213638bcf9e8cfbd3b52b4 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Sun, 22 Jun 2014 10:44:19 +0200 Subject: [PATCH 0021/1191] add javadocs to AccountService --- .../java/com/gooddata/account/AccountService.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index dc9844fb0..d58a5e541 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -9,6 +9,7 @@ import org.springframework.web.client.RestTemplate; /** + * Service to access and manipulate account. */ public class AccountService extends AbstractService { @@ -16,6 +17,12 @@ public AccountService(RestTemplate restTemplate) { super(restTemplate); } + /** + * Gets current account of logged user. + * @throws com.gooddata.GoodDataException when current account can't be accessed. + * + * @return current account + */ public Account getCurrent() { try { return restTemplate.getForObject(Account.URI, Account.class, Account.CURRENT_ID); @@ -24,6 +31,10 @@ public Account getCurrent() { } } + /** + * Performs user logout. + * @throws com.gooddata.GoodDataException when logout failed. + */ public void logout() { try { final String id = getCurrent().getId(); From 019dc03bf525f9162addc42ed4b5fc73adb2a57e Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Sun, 22 Jun 2014 11:44:06 +0200 Subject: [PATCH 0022/1191] document DatasetService --- .../com/gooddata/dataset/DatasetService.java | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 52776c24a..0d100d119 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -29,6 +29,7 @@ import static java.util.Collections.emptyList; /** + * Service to work with datasets and manifests. */ public class DatasetService extends AbstractService { @@ -42,6 +43,17 @@ public DatasetService(RestTemplate restTemplate, DataStoreService dataStoreServi this.dataStoreService = notNull(dataStoreService, "dataStoreService"); } + /** + * Obtains manifest from given project by given datasetId + * + * @param project project to which manifest belongs + * @param datasetId id of dataset + * + * @throws com.gooddata.dataset.DatasetNotFoundException when manifest can't be found (doesn't exist) + * @throws com.gooddata.dataset.DatasetException in case the API call failure + * + * @return manifest for dataset + */ public DatasetManifest getDatasetManifest(Project project, String datasetId) { notNull(project, "project"); notEmpty(datasetId, "datasetId"); @@ -58,6 +70,20 @@ public DatasetManifest getDatasetManifest(Project project, String datasetId) { } } + /** + * Loads dataset into platform. Uploads given dataset and manifest to staging area and triggers ETL pull. + * The call is asynchronous returning {@link com.gooddata.FutureResult} to let caller wait for results. + * Uploaded files are deleted from staging area when finished. + * + * @param project project to which dataset belongs + * @param manifest dataset manifest + * @param dataset dataset to upload + * + * @throws com.gooddata.dataset.DatasetException if there is a problem to serialize manifest or upload dataset + * + * @return {@link com.gooddata.FutureResult} of the task, which can throw {@link com.gooddata.dataset.DatasetException} + * in case the ETL pull task fails + */ public FutureResult loadDataset(final Project project, final DatasetManifest manifest, final InputStream dataset) { notNull(project, "project"); notNull(dataset, "dataset"); @@ -106,6 +132,16 @@ protected void onFinish() { } } + /** + * Gets DatasetManifest (using {@link #getDatasetManifest(com.gooddata.project.Project, String)} + * first and then calls {@link #loadDataset(com.gooddata.project.Project, DatasetManifest, java.io.InputStream)} + * + * @param project project to which dataset belongs + * @param datasetId datasetId to obtain a manifest + * @param dataset dataset to upload + * + * @return {@link com.gooddata.FutureResult} of the task + */ public FutureResult loadDataset(Project project, String datasetId, InputStream dataset) { notNull(project, "project"); notEmpty(datasetId, "datasetId"); @@ -113,6 +149,12 @@ public FutureResult loadDataset(Project project, String datasetId, InputSt return loadDataset(project, getDatasetManifest(project, datasetId), dataset); } + /** + * Lists datasets in project. Returns empty list in case there are no datasets. + * + * @param project project to list datasets in + * @return collection of datasets in project or empty list + */ public Collection listDatasets(Project project) { notNull(project, "project"); try { From 59d2a29cc2fd11fbe3ab13a046cade214ba4b007 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 25 Jun 2014 10:04:05 +0200 Subject: [PATCH 0023/1191] add some javadocs and reformat sources --- .../java/com/gooddata/AbstractService.java | 9 +++-- src/main/java/com/gooddata/FutureResult.java | 11 +++++- src/main/java/com/gooddata/GoodData.java | 8 ++--- .../java/com/gooddata/GoodDataException.java | 12 +++++++ .../com/gooddata/GoodDataRestException.java | 24 +++++++++++-- .../HeaderSettingRequestInterceptor.java | 5 +-- src/main/java/com/gooddata/PollHandler.java | 14 ++++++-- src/main/java/com/gooddata/Validate.java | 1 - .../com/gooddata/account/AccountService.java | 8 ++++- .../com/gooddata/dataset/DatasetService.java | 35 +++++++++---------- .../java/com/gooddata/dataset/FailStatus.java | 2 +- src/main/java/com/gooddata/gdc/Gdc.java | 18 ++++++++++ .../java/com/gooddata/md/DisplayForm.java | 3 +- .../gooddata/md/NonUniqueObjException.java | 4 +-- .../com/gooddata/md/ObjCreateException.java | 8 ++--- .../com/gooddata/md/ObjNotFoundException.java | 2 +- .../report/GridReportDefinitionContent.java | 3 +- .../md/report/ReportDefinitionContent.java | 3 +- .../java/com/gooddata/model/ModelService.java | 10 ++++-- .../java/com/gooddata/project/Project.java | 3 +- .../com/gooddata/project/ProjectService.java | 6 +++- 21 files changed, 139 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 6754eb8ef..019d230ea 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -8,7 +8,6 @@ import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.http.converter.HttpMessageConverter; import org.springframework.util.FileCopyUtils; import org.springframework.web.client.HttpMessageConverterExtractor; import org.springframework.web.client.RequestCallback; @@ -18,7 +17,6 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; -import java.util.List; import java.util.concurrent.TimeUnit; import static com.gooddata.Validate.notNull; @@ -26,6 +24,7 @@ import static org.springframework.http.HttpMethod.GET; /** + * Parent for GoodData services providing helpers for REST API calls and polling. */ public abstract class AbstractService { @@ -49,6 +48,12 @@ public ClientHttpResponse extractData(final ClientHttpResponse response) throws }; + /** + * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending + * this abstract one. + * + * @param restTemplate RESTful HTTP Spring template + */ public AbstractService(RestTemplate restTemplate) { this.restTemplate = notNull(restTemplate, "restTemplate"); } diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index 64ea37443..518b097fc 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -19,6 +19,7 @@ public final class FutureResult { /** * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

* For internal usage by services employing polling. + * * @param service this service * @param handler poll handler */ @@ -29,6 +30,7 @@ public FutureResult(final AbstractService service, final PollHandler handler) /** * Checks if the result is available + * * @return true if so * @throws GoodDataException when polling fails or the thread was interrupted */ @@ -38,6 +40,7 @@ public boolean isDone() { /** * Wait for the result to be available and return it's value + * * @return result value * @throws GoodDataException when polling fails or the thread was interrupted */ @@ -47,8 +50,9 @@ public T get() { /** * Wait for the result to be available up to given time and return it's value + * * @param timeout timeout value - * @param unit timeout unit + * @param unit timeout unit * @return result value * @throws GoodDataException when polling fails, the timeout expires or the thread was interrupted */ @@ -59,6 +63,11 @@ public T get(final long timeout, final TimeUnit unit) { return service.poll(handler, timeout, unit); } + /** + * Get URI used for polling + * + * @return URI string + */ public String getPollingUri() { return handler.getPollingUri(); } diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 1f0e02461..abce45251 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -63,7 +63,7 @@ public class GoodData { /** * Create instance configured to communicate with GoodData Platform under user with given credentials. * - * @param login GoodData user's login + * @param login GoodData user's login * @param password GoodData user's password */ public GoodData(String login, String password) { @@ -75,7 +75,7 @@ public GoodData(String login, String password) { * credentials. * * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) - * @param login GoodData user's login + * @param login GoodData user's login * @param password GoodData user's password */ public GoodData(String hostname, String login, String password) { @@ -88,9 +88,9 @@ public GoodData(String hostname, String login, String password) { * given user's credentials. * * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) - * @param login GoodData user's login + * @param login GoodData user's login * @param password GoodData user's password - * @param port GoodData Platform's API port (e.g. 443) + * @param port GoodData Platform's API port (e.g. 443) * @param protocol GoodData Platform's API protocol (e.g. https) */ public GoodData(String hostname, String login, String password, int port, String protocol) { diff --git a/src/main/java/com/gooddata/GoodDataException.java b/src/main/java/com/gooddata/GoodDataException.java index 225c2d27b..0b88ab4cb 100644 --- a/src/main/java/com/gooddata/GoodDataException.java +++ b/src/main/java/com/gooddata/GoodDataException.java @@ -4,13 +4,25 @@ package com.gooddata; /** + * Signals that something unexpected happened in GoodData SDK. */ public class GoodDataException extends RuntimeException { + /** + * Construct a GoodDataException with the specified detail message. + * + * @param message the detail message + */ public GoodDataException(String message) { super(message); } + /** + * Construct a GoodDataException with the specified detail message and cause. + * + * @param message the detail message + * @param cause the cause + */ public GoodDataException(String message, Throwable cause) { super(message, cause); } diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index f2b7d5738..cc4b01644 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -6,7 +6,7 @@ import com.gooddata.gdc.GdcError; /** - * A REST API exception + * Signals client or server error during communication with GoodData REST API. */ public class GoodDataRestException extends GoodDataException { @@ -18,7 +18,17 @@ public class GoodDataRestException extends GoodDataException { private final String errorClass; - public GoodDataRestException(int statusCode, String requestId, String message, String component, String errorClass) { + /** + * Construct a GoodDataRestException with specified details. + * + * @param statusCode the HTTP status code of the response + * @param requestId the GoodData request ID (from header) + * @param message the detail message + * @param component the GoodData component where error occurred + * @param errorClass the class of the error + */ + public GoodDataRestException(int statusCode, String requestId, String message, String component, + String errorClass) { super(statusCode + ": [requestId=" + requestId + "] " + message); this.statusCode = statusCode; this.requestId = requestId; @@ -26,7 +36,15 @@ public GoodDataRestException(int statusCode, String requestId, String message, S this.errorClass = errorClass; } - public GoodDataRestException (int statusCode, String requestId, String statusText, GdcError error) { + /** + * Construct a GoodDataRestException with specified details. + * + * @param statusCode the HTTP status code of the response + * @param requestId the GoodData request ID (from header) + * @param statusText the HTTP status text of the response + * @param error the GoodData REST API error structure + */ + public GoodDataRestException(int statusCode, String requestId, String statusText, GdcError error) { this(statusCode, error != null && error.getRequestId() != null ? error.getRequestId() : requestId, error != null && error.getMessage() != null ? error.getFormattedMessage() : statusText, diff --git a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java index 605538fa1..30b220b4a 100644 --- a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java +++ b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java @@ -23,9 +23,10 @@ public HeaderSettingRequestInterceptor(Map headers) { } @Override - public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + public ClientHttpResponse intercept(HttpRequest request, byte[] body, + ClientHttpRequestExecution execution) throws IOException { final HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request); - for (final Map.Entry header: headers.entrySet()) { + for (final Map.Entry header : headers.entrySet()) { requestWrapper.getHeaders().set(header.getKey(), header.getValue()); } return execution.execute(requestWrapper, body); diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index 4affa98a9..a3f54e62b 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -14,6 +14,7 @@ * For internal usage by services employing polling.

* Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and * may override {@link #onFinish()} method. + * * @see FutureResult */ public class PollHandler { @@ -28,7 +29,8 @@ public class PollHandler { /** * Creates a new instance of polling handler - * @param pollingUri URI for polling + * + * @param pollingUri URI for polling * @param resultClass class of the result (or {@link Void}) */ public PollHandler(final String pollingUri, final Class resultClass) { @@ -36,6 +38,11 @@ public PollHandler(final String pollingUri, final Class resultClass) { this.resultClass = notNull(resultClass, "resultClass"); } + /** + * Get URI used for polling + * + * @return URI string + */ final String getPollingUri() { return pollingUri; } @@ -57,6 +64,7 @@ final boolean isDone() { /** * Return result of polling + * * @return result */ protected final T getResult() { @@ -65,6 +73,7 @@ protected final T getResult() { /** * Check if polling should finish + * * @param response client side http response * @return true if polling should finish * @throws IOException @@ -76,5 +85,6 @@ protected boolean isFinished(final ClientHttpResponse response) throws IOExcepti /** * Method called after polling is successfully finished (default no-op) */ - protected void onFinish() {} + protected void onFinish() { + } } diff --git a/src/main/java/com/gooddata/Validate.java b/src/main/java/com/gooddata/Validate.java index ad6c4b6c6..60562823d 100644 --- a/src/main/java/com/gooddata/Validate.java +++ b/src/main/java/com/gooddata/Validate.java @@ -40,7 +40,6 @@ public static T notEmpty(T value, String argumentName) } /** - * * Throws IllegalArgumentException if the collection contains null elements (or is null), otherwise returns * the collection. * diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index d58a5e541..5e9e727da 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -13,15 +13,20 @@ */ public class AccountService extends AbstractService { + /** + * Constructs service for GoodData account management. + * + * @param restTemplate RESTful HTTP Spring template + */ public AccountService(RestTemplate restTemplate) { super(restTemplate); } /** * Gets current account of logged user. - * @throws com.gooddata.GoodDataException when current account can't be accessed. * * @return current account + * @throws com.gooddata.GoodDataException when current account can't be accessed. */ public Account getCurrent() { try { @@ -33,6 +38,7 @@ public Account getCurrent() { /** * Performs user logout. + * * @throws com.gooddata.GoodDataException when logout failed. */ public void logout() { diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 0d100d119..1da7b717f 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -23,9 +23,9 @@ import java.nio.file.Paths; import java.util.Collection; -import static java.nio.charset.StandardCharsets.UTF_8; import static com.gooddata.Validate.notEmpty; import static com.gooddata.Validate.notNull; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.emptyList; /** @@ -46,13 +46,11 @@ public DatasetService(RestTemplate restTemplate, DataStoreService dataStoreServi /** * Obtains manifest from given project by given datasetId * - * @param project project to which manifest belongs + * @param project project to which manifest belongs * @param datasetId id of dataset - * - * @throws com.gooddata.dataset.DatasetNotFoundException when manifest can't be found (doesn't exist) - * @throws com.gooddata.dataset.DatasetException in case the API call failure - * * @return manifest for dataset + * @throws com.gooddata.dataset.DatasetNotFoundException when manifest can't be found (doesn't exist) + * @throws com.gooddata.dataset.DatasetException in case the API call failure */ public DatasetManifest getDatasetManifest(Project project, String datasetId) { notNull(project, "project"); @@ -75,16 +73,15 @@ public DatasetManifest getDatasetManifest(Project project, String datasetId) { * The call is asynchronous returning {@link com.gooddata.FutureResult} to let caller wait for results. * Uploaded files are deleted from staging area when finished. * - * @param project project to which dataset belongs + * @param project project to which dataset belongs * @param manifest dataset manifest - * @param dataset dataset to upload - * - * @throws com.gooddata.dataset.DatasetException if there is a problem to serialize manifest or upload dataset - * + * @param dataset dataset to upload * @return {@link com.gooddata.FutureResult} of the task, which can throw {@link com.gooddata.dataset.DatasetException} - * in case the ETL pull task fails + * in case the ETL pull task fails + * @throws com.gooddata.dataset.DatasetException if there is a problem to serialize manifest or upload dataset */ - public FutureResult loadDataset(final Project project, final DatasetManifest manifest, final InputStream dataset) { + public FutureResult loadDataset(final Project project, final DatasetManifest manifest, + final InputStream dataset) { notNull(project, "project"); notNull(dataset, "dataset"); notNull(manifest, "manifest"); @@ -95,7 +92,8 @@ public FutureResult loadDataset(final Project project, final DatasetManife final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); - final PullTask pullTask = restTemplate.postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); + final PullTask pullTask = restTemplate + .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); return new FutureResult<>(this, new PollHandler(pullTask.getUri(), Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { @@ -104,7 +102,8 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { if (finished && !status.isSuccess()) { String message = "status: " + status.getStatus(); try { - final InputStream input = dataStoreService.download(dirPath.resolve(STATUS_FILE_NAME).toString()); + final InputStream input = dataStoreService + .download(dirPath.resolve(STATUS_FILE_NAME).toString()); final FailStatus failStatus = mapper.readValue(input, FailStatus.class); if (failStatus != null && failStatus.getError() != null) { message = failStatus.getError().getFormattedMessage(); @@ -116,6 +115,7 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { } return finished; } + @Override protected void onFinish() { try { @@ -136,10 +136,9 @@ protected void onFinish() { * Gets DatasetManifest (using {@link #getDatasetManifest(com.gooddata.project.Project, String)} * first and then calls {@link #loadDataset(com.gooddata.project.Project, DatasetManifest, java.io.InputStream)} * - * @param project project to which dataset belongs + * @param project project to which dataset belongs * @param datasetId datasetId to obtain a manifest - * @param dataset dataset to upload - * + * @param dataset dataset to upload * @return {@link com.gooddata.FutureResult} of the task */ public FutureResult loadDataset(Project project, String datasetId, InputStream dataset) { diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java index 9a9d95f2b..0ac8cd51a 100644 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ b/src/main/java/com/gooddata/dataset/FailStatus.java @@ -18,7 +18,7 @@ public class FailStatus { @JsonCreator private FailStatus(@JsonProperty("status") String status, @JsonProperty("date") String date, - @JsonProperty("error") ErrorStructure error) { + @JsonProperty("error") ErrorStructure error) { this.status = status; this.date = date; this.error = error; diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 2ee143010..9489a0ff5 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -36,6 +36,7 @@ public Gdc(@JsonProperty("links") List links) { /** * Get GoodData API root link + * * @return GoodData API root link */ @JsonIgnore @@ -45,6 +46,7 @@ public String getHomeLink() { /** * Get temporary token generator link + * * @return temporary token generator link */ @JsonIgnore @@ -54,6 +56,7 @@ public String getTokenLink() { /** * Get authentication service link + * * @return authentication service link */ @JsonIgnore @@ -63,6 +66,7 @@ public String getLoginLink() { /** * Get metadata resources link + * * @return metadata resources link */ @JsonIgnore @@ -72,6 +76,7 @@ public String getMetadataLink() { /** * Get report execution resource link + * * @return report execution resource link */ @JsonIgnore @@ -81,6 +86,7 @@ public String getXTabLink() { /** * Get link of resource used to determine valid attribute values in the context of a report + * * @return link of resource used to determine valid attribute values in the context of a report */ @JsonIgnore @@ -90,6 +96,7 @@ public String getAvailableElementsLink() { /** * Get report exporting resource link + * * @return report exporting resource link */ @JsonIgnore @@ -99,6 +106,7 @@ public String getReportExporterLink() { /** * Get account manipulation resource link + * * @return account manipulation resource link */ @JsonIgnore @@ -108,6 +116,7 @@ public String getAccountLink() { /** * Get user and project management resource link + * * @return user and project management resource link */ @JsonIgnore @@ -117,6 +126,7 @@ public String getProjectsLink() { /** * Get miscellaneous tool resource link + * * @return miscellaneous tool resource link */ @JsonIgnore @@ -126,6 +136,7 @@ public String getToolLink() { /** * Get template resource link + * * @return template resource link */ @JsonIgnore @@ -135,6 +146,7 @@ public String getTemplatesLink() { /** * Get release information link + * * @return release information link */ @JsonIgnore @@ -144,6 +156,7 @@ public String getReleaseInfoLink() { /** * Get user data staging area link + * * @return user data staging area link */ @JsonIgnore @@ -153,6 +166,7 @@ public String getUserStagingLink() { /** * Get link by category + * * @param category requested link category * @return link by given category */ @@ -187,6 +201,7 @@ public Link(@JsonProperty("category") String category, @JsonProperty("link") Str /** * Get link category + * * @return link category */ public String getCategory() { @@ -195,6 +210,7 @@ public String getCategory() { /** * Get link URI + * * @return link URI */ public String getUri() { @@ -203,6 +219,7 @@ public String getUri() { /** * Get link summary + * * @return link summary */ public String getSummary() { @@ -211,6 +228,7 @@ public String getSummary() { /** * Get link title + * * @return link title */ public String getTitle() { diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 1fc05ffad..d953a6b62 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -58,7 +58,8 @@ protected static class Content { @JsonCreator public Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") Integer isDefault, @JsonProperty("ldmexpression") String ldmExpression) { + @JsonProperty("default") Integer isDefault, + @JsonProperty("ldmexpression") String ldmExpression) { this.formOf = formOf; this.expression = expression; this.isDefault = isDefault; diff --git a/src/main/java/com/gooddata/md/NonUniqueObjException.java b/src/main/java/com/gooddata/md/NonUniqueObjException.java index 7b0702f7f..8ff744e2c 100644 --- a/src/main/java/com/gooddata/md/NonUniqueObjException.java +++ b/src/main/java/com/gooddata/md/NonUniqueObjException.java @@ -12,9 +12,9 @@ public class NonUniqueObjException extends GoodDataException { /** * Construct a new instance of NonUniqueObjException. * - * @param cls class of metadata object you're searching for + * @param cls class of metadata object you're searching for * @param results collection of URIs you have found - * @param the type of results you're searching for + * @param the type of results you're searching for */ public NonUniqueObjException(Class cls, Collection results) { super("Expected a single instance of " + cls.getSimpleName().toLowerCase() + " but found " + results); diff --git a/src/main/java/com/gooddata/md/ObjCreateException.java b/src/main/java/com/gooddata/md/ObjCreateException.java index a0c83afcb..53bf176d9 100644 --- a/src/main/java/com/gooddata/md/ObjCreateException.java +++ b/src/main/java/com/gooddata/md/ObjCreateException.java @@ -10,9 +10,9 @@ public class ObjCreateException extends GoodDataException { /** * Construct a new instance of ObjCreateException. * - * @param obj the metadata object you're trying to create + * @param obj the metadata object you're trying to create * @param cause the cause of error - * @param the type of metadata object you're trying to create + * @param the type of metadata object you're trying to create */ public ObjCreateException(T obj, Throwable cause) { super("Can't create metadata object: " + obj.getClass().getSimpleName(), cause); @@ -22,8 +22,8 @@ public ObjCreateException(T obj, Throwable cause) { * Construct a new instance of ObjCreateException. * * @param message the detail message - * @param obj the metadata object you're trying to create - * @param the type of metadata object you're trying to create + * @param obj the metadata object you're trying to create + * @param the type of metadata object you're trying to create */ public ObjCreateException(String message, T obj) { super("Can't create metadata object: " + obj.getClass().getSimpleName() + "; Cause: " + message); diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index 1f00143a3..7d927a8e3 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -12,7 +12,7 @@ public class ObjNotFoundException extends GoodDataException { * * @param uri the URI of metadata object you're searching for * @param cls class of metadata object you're searching for - * @param e caused by this exception + * @param e caused by this exception * @param the type of results you're searching for */ public ObjNotFoundException(String uri, Class cls, Exception e) { diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index 085808698..72a57088f 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -33,7 +33,8 @@ public String getFormat() { return FORMAT; } - public static ReportDefinition create(String title, List columns, List rows, List metrics) { + public static ReportDefinition create(String title, List columns, List rows, + List metrics) { return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics))); } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index bcffb8ee6..12559f49c 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -19,7 +19,8 @@ @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "format") @JsonSubTypes({ @JsonSubTypes.Type(name = GridReportDefinitionContent.FORMAT, value = GridReportDefinitionContent.class), - @JsonSubTypes.Type(name = OneNumberReportDefinitionContent.FORMAT, value = OneNumberReportDefinitionContent.class) + @JsonSubTypes.Type(name = OneNumberReportDefinitionContent.FORMAT, + value = OneNumberReportDefinitionContent.class) }) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 24beb4bc6..b1489df6b 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -13,6 +13,7 @@ import org.springframework.util.FileCopyUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; + import java.io.IOException; import java.io.Reader; @@ -32,7 +33,8 @@ public FutureResult getProjectModelDiff(Project project, DiffRequest notNull(project, "project"); notNull(diffRequest, "diffRequest"); try { - final AsyncTask asyncTask = restTemplate.postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); + final AsyncTask asyncTask = restTemplate + .postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); return new FutureResult<>(this, new PollHandler<>(asyncTask.getUri(), ModelDiff.class)); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); @@ -68,7 +70,8 @@ public FutureResult updateProjectModel(Project project, String maqlDdl) { notNull(project, "project"); notEmpty(maqlDdl, "maqlDdl"); try { - final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), MaqlDdlLinks.class, project.getId()); + final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), + MaqlDdlLinks.class, project.getId()); return new FutureResult<>(this, new PollHandler(linkEntries.getStatusLink(), Void.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { @@ -76,7 +79,8 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException if (finished) { final MaqlDdlTaskStatus maqlDdlTaskStatus = extractData(response, MaqlDdlTaskStatus.class); if (!maqlDdlTaskStatus.isSuccess()) { - throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); + throw new ModelException( + "Unable to update project model: " + maqlDdlTaskStatus.getMessages()); } } return finished; diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 76e709938..b2b1c5079 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -430,7 +430,8 @@ private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("contri @JsonProperty("uri") String uri, @JsonProperty("deprecated") String deprecated, @JsonProperty("identifier") String identifier, @JsonProperty("locked") Integer locked, @JsonProperty("unlisted") Integer unlisted) { - super(author, contributor, created, updated, summary, title, category, tags, uri, deprecated, identifier, locked, unlisted); + super(author, contributor, created, updated, summary, title, category, tags, uri, deprecated, identifier, + locked, unlisted); } private ProjectMeta(String title) { diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 769682f0f..b56940c72 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -39,7 +39,7 @@ public class ProjectService extends AbstractService { /** * Constructs service for GoodData project management (list projects, create a project, ...). * - * @param restTemplate RESTful HTTP Spring template + * @param restTemplate RESTful HTTP Spring template * @param accountService GoodData account service */ public ProjectService(RestTemplate restTemplate, AccountService accountService) { @@ -51,6 +51,7 @@ public ProjectService(RestTemplate restTemplate, AccountService accountService) * Get all projects current user has access to. * * @return collection of all projects current user has access to + * @throws com.gooddata.GoodDataException when projects can't be accessed */ public Collection getProjects() { try { @@ -67,6 +68,7 @@ public Collection getProjects() { * * @param project project to be created * @return created project (including very useful id) + * @throws com.gooddata.GoodDataException when projects creation fails */ public FutureResult createProject(Project project) { notNull(project, "project"); @@ -104,6 +106,7 @@ protected void onFinish() { * * @param uri URI of project resource (/gdc/projects/{id}) * @return project + * @throws com.gooddata.GoodDataException when project can't be accessed */ public Project getProjectByUri(final String uri) { notEmpty(uri, "uri"); @@ -125,6 +128,7 @@ public Project getProjectByUri(final String uri) { * * @param id id of project * @return project + * @throws com.gooddata.GoodDataException when project can't be accessed */ public Project getProjectById(String id) { notEmpty(id, "id"); From abbe6baacc74856ea3116dbbf1c68de47d3a61bb Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sun, 22 Jun 2014 17:08:03 +0200 Subject: [PATCH 0024/1191] fix Grid DTO, Example and README --- README.md | 24 +++++++-------- .../java/com/gooddata/gdc/ErrorStructure.java | 6 ++-- .../java/com/gooddata/md/report/Grid.java | 8 ++--- .../report/GridReportDefinitionContent.java | 2 +- .../java/com/gooddata/md/report/Report.java | 3 +- .../md/report/ReportDefinitionContent.java | 1 + src/test/java/com/gooddata/Example.java | 29 +++++++++++++++---- .../GridReportDefinitionContentTest.java | 2 +- .../java/com/gooddata/md/report/GridTest.java | 7 ++++- .../OneNumberReportDefinitionContentTest.java | 2 +- .../report/ReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionTest.java | 2 +- src/test/resources/md/report/grid-input.json | 12 +++++++- 13 files changed, 65 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 6bcaf6660..743ae9bc8 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ List projects, create a project,... ```java ProjectService projectService = gd.getProjectService(); Collection projects = projectService.getProjects(); -Project project = projectService.createProject(new Project("my project", "MyToken")); +Project project = projectService.createProject(new Project("my project", "MyToken")).get(); ``` ### Project Model API @@ -37,7 +37,7 @@ Create and update the project model, execute MAQL DDL,... ```java ModelService modelService = gd.getModelService(); -ModelDiff diff = modelService.getProjectModelDiff(project, new FileInputStream("model.json"); +ModelDiff diff = modelService.getProjectModelDiff(project, new InputStreamReader(getClass().getResourceAsStream("/model.json"))).get(); modelService.updateProjectModel(project, diff); modelService.updateProjectModel(project, "MAQL DDL EXPRESSION"); @@ -50,18 +50,18 @@ Query, create and update project metadata - attributes, facts, metrics, reports, ```java MetadataService md = gd.getMetadataService(); -String factUri = md.getObjUri(project, Fact.class, Restriction.title("myfact")); +String factUri = md.findObjUri(project, Fact.class, Restriction.title("myfact")); -Metric metric = new Metric("my sum", "SELECT SUM([" + factUri + "])", "#,##0"); -Metric m = md.createObj(project, metric); +Metric m = md.createObj(project, new Metric("My Sum", "SELECT SUM([" + factUri + "])", "#,##0")); -ReportDefinition definition = GridReportDefinition.create( +ReportDefinition definition = GridReportDefinitionContent.create( "my report", asList("metricGroup"), - asList(new AttributeItem("/gdc/md/PROJECT_ID/obj/ID")), - asList(new Item("/gdc/md/PROJECT_ID/obj/ID")) + asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_DISPLAY_FORM_ID")), + asList(new GridElement(m.getUri(), "My Sum")) ); -md.createMd(project, definition); +definition = md.createObj(project, definition); +Report report = md.createObj(project, new Report(definition.getTitle(), definition.getUri(), null)); ``` ### Dataset API @@ -70,8 +70,7 @@ Upload data to datasets,.. ```java DatasetService datasetService = gd.getDatasetService(); -datasetService.loadDataset(project, "datasetId", new FileInputStream("data.csv")); - +datasetService.loadDataset(project, "datasetId", new FileInputStream("data.csv")).get(); ``` ### Report API @@ -80,7 +79,7 @@ Execute and export reports. ```java ReportService reportService = gd.getReportService(); -String imgUri = reportService.exportReport(reportDef, "png"); +String imgUri = reportService.exportReport(reportDef, ReportExportFormat.PNG); ``` ### DataStore API @@ -92,5 +91,4 @@ DataStoreService dataStoreService = gd.getDataStoreService(); dataStoreService.upload("/dir/file.txt", new FileInputStream("file.txt")); InputStream stream = dataStoreService.download("/dir/file.txt"); dataStoreService.delete("/dir/file.txt"); - ``` diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 966052707..7f3b2a7f6 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -27,9 +27,9 @@ protected ErrorStructure(@JsonProperty("errorClass") String errorClass, @JsonPro @JsonProperty("parameters") String[] parameters, @JsonProperty("message") String message, @JsonProperty("errorCode") String errorCode, @JsonProperty("errorId") String errorId, @JsonProperty("trace") String trace, @JsonProperty("requestId") String requestId) { - this.errorClass = notNull(errorClass, "errorClass"); - this.component = notNull(component, "component"); - this.parameters = notNull(parameters, "parameters"); + this.errorClass = errorClass; + this.component = component; + this.parameters = parameters; this.message = notNull(message, "message"); this.errorCode = errorCode; this.errorId = errorId; diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 85d170e99..804fe8c34 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -22,14 +22,14 @@ public class Grid { private final Collection columns; - private final Collection rows; + private final Collection rows; private final Collection metrics; private final Map> sort; private final Collection> columnWidths; @JsonCreator public Grid(@JsonProperty("columns") Collection columns, - @JsonProperty("rows") Collection rows, + @JsonProperty("rows") Collection rows, @JsonProperty("metrics") Collection metrics, @JsonProperty("sort") Map> sort, @JsonProperty("columnWidths") Collection> columnWidths) { @@ -40,7 +40,7 @@ public Grid(@JsonProperty("columns") Collection columns, this.columnWidths = columnWidths; } - public Grid(final Collection columns, final Collection rows, + public Grid(final Collection columns, final Collection rows, final Collection metrics) { this.columns = columns; this.rows = rows; @@ -55,7 +55,7 @@ public Collection getColumns() { return columns; } - public Collection getRows() { + public Collection getRows() { return rows; } diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index 72a57088f..b6c3afe80 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -33,7 +33,7 @@ public String getFormat() { return FORMAT; } - public static ReportDefinition create(String title, List columns, List rows, + public static ReportDefinition create(String title, List columns, List rows, List metrics) { return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics))); } diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index b767df97c..3eb92e402 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -36,8 +36,7 @@ private Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content this.content = content; } - /* Just for serialization test */ - Report(String title, String definition, String domain) { + public Report(String title, String definition, String domain) { super(new Meta(title)); content = new Content(asList(definition), asList(domain)); } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index 12559f49c..e4387ef3f 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -21,6 +21,7 @@ @JsonSubTypes.Type(name = GridReportDefinitionContent.FORMAT, value = GridReportDefinitionContent.class), @JsonSubTypes.Type(name = OneNumberReportDefinitionContent.FORMAT, value = OneNumberReportDefinitionContent.class) + //TODO chart }) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index bfd60a8bb..bae67dc05 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -7,10 +7,15 @@ import com.gooddata.account.AccountService; import com.gooddata.dataset.DatasetManifest; import com.gooddata.dataset.DatasetService; +import com.gooddata.md.Attribute; import com.gooddata.md.Fact; import com.gooddata.md.MetadataService; import com.gooddata.md.Metric; import com.gooddata.md.Restriction; +import com.gooddata.md.report.AttributeInGrid; +import com.gooddata.md.report.GridElement; +import com.gooddata.md.report.GridReportDefinitionContent; +import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; import com.gooddata.model.ModelService; @@ -22,6 +27,8 @@ import java.io.InputStreamReader; import java.util.Collection; +import static java.util.Arrays.asList; + public class Example { public static void main(String... args) { @@ -35,7 +42,7 @@ public static void main(String... args) { final Collection projects = projectService.getProjects(); System.out.println(projects); - final Project project = projectService.createProject(new Project("sparkling", "pgroup2")).get(); + final Project project = projectService.createProject(new Project("sparkling3", "pgroup2")).get(); System.out.println(project.getSelfLink()); final ModelService modelService = gd.getModelService(); @@ -45,18 +52,28 @@ public static void main(String... args) { final MetadataService md = gd.getMetadataService(); - final String factUri = md.findObjUri(project, Fact.class, Restriction.title("myfact")); + final String factUri = md.findObjUri(project, Fact.class, Restriction.title("Person Age")); + final String attrUri = md.findObjUri(project, Attribute.class, Restriction.title("Department")); + final Attribute attr = md.getObjByUri(attrUri, Attribute.class); + + final Metric m = md.createObj(project, new Metric("Age Sum", "SELECT SUM([" + factUri + "])", "#,##0")); - final Metric m = md.createObj(project, new Metric("my sum", "SELECT SUM([" + factUri + "])", "#,##0")); + ReportDefinition definition = GridReportDefinitionContent.create( + "my report", + asList("metricGroup"), + asList(new AttributeInGrid(attr.getDisplayForms().iterator().next().getUri())), + asList(new GridElement(m.getUri(), "Age Sum")) + ); + definition = md.createObj(project, definition); + final Report report = md.createObj(project, new Report(definition.getTitle(), definition.getUri(), null)); final DatasetService datasetService = gd.getDatasetService(); final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); datasetService.loadDataset(project, manifest, Example.class.getResourceAsStream("/person.csv")).get(); - final ReportDefinition reportDef = md.getObjByUri("/gdc/md/GoodSalesDemoKokot1/obj/1962", ReportDefinition.class); final ReportService reportService = gd.getReportService(); - final String imgUri = reportService.exportReport(reportDef, ReportExportFormat.PNG); - System.out.println(imgUri); + final String exportUri = reportService.exportReport(definition, ReportExportFormat.CSV); + System.out.println(exportUri); gd.logout(); } diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index f09068133..4abc361aa 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -28,7 +28,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final GridReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), + new Grid(Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 43462a64c..d289d6692 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -6,6 +6,7 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -32,6 +33,8 @@ public void testDeserialization() throws Exception { assertThat(grid.getRows(), is(notNullValue())); assertThat(grid.getRows(), hasSize(1)); + final AttributeInGrid attrInGrid = grid.getRows().iterator().next(); + assertThat(attrInGrid.getAlias(), is("attr")); assertThat(grid.getMetrics(), is(notNullValue())); assertThat(grid.getMetrics(), hasSize(1)); @@ -51,7 +54,9 @@ public void testSerialization() throws Exception { colWidths.put("width", 343); sort.put("columns", Collections.emptyList()); sort.put("rows", Collections.emptyList()); - final Grid grid = new Grid(asList("metricGroup"), Collections.emptyList(), + final Grid grid = new Grid(asList("metricGroup"), + asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", + asList((Collection)Collections.emptyList()), "attr")), asList(new GridElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); assertThat(grid, serializesToJson("/md/report/grid-input.json")); diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 751dd13fc..0ce9cf555 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -29,7 +29,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final OneNumberReportDefinitionContent def = new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), + new Grid(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), "desc" ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinitionContent-input.json")); diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index b08d8cf44..e698a2972 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -28,7 +28,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final ReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), + new Grid(Collections.emptyList(), Collections.emptyList(), Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 6c7046e7f..6ce1ff6dd 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -31,7 +31,7 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final ReportDefinition def = new ReportDefinition("Untitled", new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), + new Grid(Collections.emptyList(), Collections.emptyList(), Collections.emptyList()), "desc") ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); diff --git a/src/test/resources/md/report/grid-input.json b/src/test/resources/md/report/grid-input.json index ff0b3eced..b760b581a 100644 --- a/src/test/resources/md/report/grid-input.json +++ b/src/test/resources/md/report/grid-input.json @@ -17,5 +17,15 @@ "uri": "/gdc/md/PROJECT_ID/obj/METR_ID" } ], - "rows": [] + "rows": [ + { + "attribute": { + "alias": "attr", + "totals": [ + [] + ], + "uri": "/gdc/md/PROJECT_ID/obj/ATTR_ID" + } + } + ] } From 843c3f8aad09c5de60858cf6d8fb92485e6ad2c5 Mon Sep 17 00:00:00 2001 From: Juraj Martinka Date: Wed, 2 Jul 2014 08:48:02 +0200 Subject: [PATCH 0025/1191] Mockito dependency scope set to test. --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 87e023b93..fb635e146 100644 --- a/pom.xml +++ b/pom.xml @@ -136,6 +136,7 @@ org.mockito mockito-all 1.9.5 + test org.hamcrest From 64703777160300bda65ae04a37bd992ff1b4d514 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 16:13:47 +0200 Subject: [PATCH 0026/1191] change version to 0.8.0-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fb635e146..cc2af554a 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.gooddata gooddata-java - 1.0-SNAPSHOT + 0.8.0-SNAPSHOT ${project.artifactId} GoodData Java SDK From 8f4d104cb96396460cfa9fd1d1bb0229b809c437 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 18:45:08 +0200 Subject: [PATCH 0027/1191] add: sources and javadoc plugins --- pom.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/pom.xml b/pom.xml index cc2af554a..1028a9713 100644 --- a/pom.xml +++ b/pom.xml @@ -73,6 +73,28 @@ + + maven-source-plugin + 2.2.1 + + + + jar + + + + + + maven-javadoc-plugin + 2.9 + + + + jar + + + + org.apache.maven.plugins maven-failsafe-plugin From 407d3a33a89e6e1fd5de5542c378888ddf39126d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 18:45:19 +0200 Subject: [PATCH 0028/1191] change groupId --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1028a9713..2c552e1ee 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gooddata + cz.geek gooddata-java 0.8.0-SNAPSHOT ${project.artifactId} From 9d6873a0f468a5761f57fa016ed2d545f1341cbf Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 18:59:23 +0200 Subject: [PATCH 0029/1191] [maven-release-plugin] prepare release gooddata-java-0.8.0 --- pom.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 2c552e1ee..c797f4f06 100644 --- a/pom.xml +++ b/pom.xml @@ -1,12 +1,10 @@ - + 4.0.0 cz.geek gooddata-java - 0.8.0-SNAPSHOT + 0.8.0 ${project.artifactId} GoodData Java SDK From 69ed591793d510e3d3efebc945934988ce7c7988 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 18:59:24 +0200 Subject: [PATCH 0030/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c797f4f06..4f22f0201 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.8.0 + 0.8.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 4030a74a6d25a13830bfd1982e71f9d8dd5b05cb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 19:14:16 +0200 Subject: [PATCH 0031/1191] update readme --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 743ae9bc8..ed9438964 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,13 @@ ## Usage +The *GoodData Java SDK* is available in Maven Central Repository, to use it from Maven add to `pom.xml`: + ```xml - com.gooddata + cz.geek gooddata-java - ${gooddata-java.version} + 0.8.0 ``` From bd48d4c6d2f1fa83143514a4477855a0051df48d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 2 Jul 2014 22:10:09 +0200 Subject: [PATCH 0032/1191] remove dependencies close: #15 --- pom.xml | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 4f22f0201..7e46f83fe 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,20 @@ org.springframework spring-web 3.2.5.RELEASE + + + aopalliance + aopalliance + + + org.springframework + spring-aop + + + org.springframework + spring-context + + org.codehaus.jackson @@ -140,11 +154,6 @@ sardine 5.1 - - commons-lang - commons-lang - 2.6 - junit From a024048f4bdce09b199ba3da3595dd601a698f67 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 20 Aug 2014 17:47:55 +0200 Subject: [PATCH 0033/1191] enable polling with result different from polling object --- .../java/com/gooddata/AbstractService.java | 8 +-- src/main/java/com/gooddata/FutureResult.java | 4 +- src/main/java/com/gooddata/PollHandler.java | 51 ++++++++++++++----- .../com/gooddata/dataset/DatasetService.java | 2 +- .../java/com/gooddata/model/ModelService.java | 4 +- .../com/gooddata/project/ProjectService.java | 2 +- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 019d230ea..a5cf0fb69 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -58,7 +58,7 @@ public AbstractService(RestTemplate restTemplate) { this.restTemplate = notNull(restTemplate, "restTemplate"); } - final T poll(final PollHandler handler, long timeout, final TimeUnit unit) { + final R poll(final PollHandler handler, long timeout, final TimeUnit unit) { notNull(handler, "handler"); final long start = System.currentTimeMillis(); while (true) { @@ -77,15 +77,15 @@ final T poll(final PollHandler handler, long timeout, final TimeUnit unit } } - final boolean pollOnce(final PollHandler handler) { + final

boolean pollOnce(final PollHandler handler) { notNull(handler, "handler"); final ClientHttpResponse response = restTemplate.execute(handler.getPollingUri(), GET, noopRequestCallback, reusableResponseExtractor); try { if (handler.isFinished(response)) { - final T data = extractData(response, handler.getResultClass()); - handler.setResult(data); + final P data = extractData(response, handler.getPollClass()); + handler.handlePollResult(data); } else if (HttpStatus.Series.CLIENT_ERROR.equals(response.getStatusCode().series())) { throw new GoodDataException( format("Polling returned client error HTTP status %s", response.getStatusCode().value()) diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index 518b097fc..22c1b85c5 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -14,7 +14,7 @@ public final class FutureResult { private final AbstractService service; - private final PollHandler handler; + private final PollHandler handler; /** * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

@@ -23,7 +23,7 @@ public final class FutureResult { * @param service this service * @param handler poll handler */ - public FutureResult(final AbstractService service, final PollHandler handler) { + public FutureResult(final AbstractService service, final PollHandler handler) { this.service = notNull(service, "service"); this.handler = notNull(handler, "handler"); } diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index a3f54e62b..350729200 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -13,28 +13,43 @@ /** * For internal usage by services employing polling.

* Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and - * may override {@link #onFinish()} method. + * may override {@link #onFinish()} and {@link #handlePollResult(Object)} methods. * - * @see FutureResult + * @param

polling type + * @param result type + * + * @see com.gooddata.FutureResult */ -public class PollHandler { +public class PollHandler { private final String pollingUri; - private final Class resultClass; + private final Class

pollClass; + private final Class resultClass; private boolean done = false; - private T result; + private R result; /** * Creates a new instance of polling handler - * - * @param pollingUri URI for polling - * @param resultClass class of the result (or {@link Void}) + * @param pollingUri URI for polling + * @param pollAndResultClass class of the polling object and result (or {@link Void}) */ - public PollHandler(final String pollingUri, final Class resultClass) { + @SuppressWarnings("unchecked") + public PollHandler(final String pollingUri, final Class pollAndResultClass) { + this(pollingUri, pollAndResultClass, pollAndResultClass); + } + + /** + * Creates a new instance of polling handler + * @param pollingUri URI for polling + * @param pollClass class of the polling object (or {@link Void}) + * @param resultClass class of the result (or {@link Void}) + */ + public PollHandler(final String pollingUri, final Class

pollClass, Class resultClass) { this.pollingUri = notNull(pollingUri, "pollingUri"); + this.pollClass = notNull(pollClass, "pollClass"); this.resultClass = notNull(resultClass, "resultClass"); } @@ -47,11 +62,15 @@ final String getPollingUri() { return pollingUri; } - final Class getResultClass() { + final Class getResultClass() { return resultClass; } - final PollHandler setResult(T result) { + final Class

getPollClass() { + return pollClass; + } + + protected PollHandler setResult(R result) { this.result = result; this.done = true; onFinish(); @@ -67,7 +86,7 @@ final boolean isDone() { * * @return result */ - protected final T getResult() { + protected final R getResult() { return result; } @@ -87,4 +106,12 @@ protected boolean isFinished(final ClientHttpResponse response) throws IOExcepti */ protected void onFinish() { } + + protected void handlePollResult(P pollResult) { + if (resultClass.equals(pollClass)) { + setResult(resultClass.cast(pollResult)); + } else { + throw new IllegalStateException("Please override handlePollResult method when you want different type of polling and result class"); + } + } } diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 1da7b717f..daac0582a 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -94,7 +94,7 @@ public FutureResult loadDataset(final Project project, final DatasetManife final PullTask pullTask = restTemplate .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - return new FutureResult<>(this, new PollHandler(pullTask.getUri(), Void.class) { + return new FutureResult<>(this, new PollHandler(pullTask.getUri(), Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index b1489df6b..145b7c02b 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -35,7 +35,7 @@ public FutureResult getProjectModelDiff(Project project, DiffRequest try { final AsyncTask asyncTask = restTemplate .postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); - return new FutureResult<>(this, new PollHandler<>(asyncTask.getUri(), ModelDiff.class)); + return new FutureResult<>(this, new PollHandler(asyncTask.getUri(), ModelDiff.class)); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); } @@ -72,7 +72,7 @@ public FutureResult updateProjectModel(Project project, String maqlDdl) { try { final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), MaqlDdlLinks.class, project.getId()); - return new FutureResult<>(this, new PollHandler(linkEntries.getStatusLink(), Void.class) { + return new FutureResult<>(this, new PollHandler(linkEntries.getStatusLink(), Void.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { final boolean finished = super.isFinished(response); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index b56940c72..5e91d4b5c 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -84,7 +84,7 @@ public FutureResult createProject(Project project) { throw new GoodDataException("Empty response when project POSTed to API"); } - return new FutureResult<>(this, new PollHandler(uri.getUri(), Project.class) { + return new FutureResult<>(this, new PollHandler(uri.getUri(), Project.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { From c63c66e067e52118ea904fd18460ae60c7fe67ba Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 22 Aug 2014 09:49:04 +0200 Subject: [PATCH 0034/1191] introduce warehouse (ADS/DSS) API support --- README.md | 14 ++ src/main/java/com/gooddata/GoodData.java | 13 ++ .../com/gooddata/warehouse/Warehouse.java | 143 ++++++++++++++ .../warehouse/WarehouseNotFoundException.java | 21 ++ .../gooddata/warehouse/WarehouseService.java | 187 ++++++++++++++++++ .../com/gooddata/warehouse/WarehouseTask.java | 36 ++++ .../com/gooddata/warehouse/Warehouses.java | 31 +++ .../warehouse/WarehouseServiceIT.java | 168 ++++++++++++++++ .../gooddata/warehouse/WarehouseTaskTest.java | 29 +++ .../com/gooddata/warehouse/WarehouseTest.java | 36 ++++ .../gooddata/warehouse/WarehousesTest.java | 23 +++ .../resources/warehouse/warehouse-create.json | 7 + src/test/resources/warehouse/warehouse.json | 18 ++ .../warehouse/warehouseTask-finished.json | 9 + .../warehouse/warehouseTask-poll.json | 7 + src/test/resources/warehouse/warehouses.json | 43 ++++ 16 files changed, 785 insertions(+) create mode 100644 src/main/java/com/gooddata/warehouse/Warehouse.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseService.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseTask.java create mode 100644 src/main/java/com/gooddata/warehouse/Warehouses.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseTest.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehousesTest.java create mode 100644 src/test/resources/warehouse/warehouse-create.json create mode 100644 src/test/resources/warehouse/warehouse.json create mode 100644 src/test/resources/warehouse/warehouseTask-finished.json create mode 100644 src/test/resources/warehouse/warehouseTask-poll.json create mode 100644 src/test/resources/warehouse/warehouses.json diff --git a/README.md b/README.md index ed9438964..ec914cc84 100644 --- a/README.md +++ b/README.md @@ -94,3 +94,17 @@ dataStoreService.upload("/dir/file.txt", new FileInputStream("file.txt")); InputStream stream = dataStoreService.download("/dir/file.txt"); dataStoreService.delete("/dir/file.txt"); ``` + +### Warehouse API +Manage warehouses - create, update, list and delete. +```java +WarehouseService warehouseService = gd.getWarehouseService(); +Warehouse warehouse = warehouseService.createWarehouse(new Warehouse("title", "authToken", "description")); +String jdbc = warehouse.getJdbcConnectionString(); + +warehouse.setTitle("another Title"); +warehouse = warehouseService.updateWarehouse(warehouse); + +Collection warehouseList = warehouseService.listInstances(); +warehouseService.removeWarehouse(warehouse); +``` diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index abce45251..adba154fb 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -4,6 +4,8 @@ package com.gooddata; import com.gooddata.account.AccountService; +import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; import com.gooddata.gdc.GdcService; @@ -59,6 +61,7 @@ public class GoodData { private final DataStoreService dataStoreService; private final DatasetService datasetService; private final ReportService reportService; + private final WarehouseService warehouseService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -111,6 +114,8 @@ public GoodData(String hostname, String login, String password, int port, String dataStoreService = new DataStoreService(httpClientBuilder, gdcService, login, password); datasetService = new DatasetService(restTemplate, dataStoreService); reportService = new ReportService(restTemplate); + processService = new ProcessService(restTemplate); + warehouseService = new WarehouseService(restTemplate, hostname, port); } private RestTemplate createRestTemplate(String login, String password, String hostname, HttpClientBuilder builder, @@ -227,4 +232,12 @@ public ReportService getReportService() { return reportService; } + /** + * Get initialized service for ADS management (create, access and delete ads instances). + * + * @return initialized service for ADS management + */ + public WarehouseService getWarehouseService() { + return warehouseService; + } } diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java new file mode 100644 index 000000000..efdd3b521 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -0,0 +1,143 @@ +package com.gooddata.warehouse; + +import static com.gooddata.Validate.notNull; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.Map; + +/** + * Warehouse + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("dssInstance") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Warehouse { + + private static final String ID_PARAM = "id"; + public static final String URI = Warehouses.URI + "/{" + ID_PARAM + "}"; + + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + public static final UriTemplate JDBC_CONNECTION_TEMPLATE = new UriTemplate("jdbc:dss://{host}:{port}/gdc/dss/instances/{id}"); + + private static final String SELF_LINK = "self"; + private static final String STATUS_ENABLED = "ENABLED"; + + private String title; + private String description; + + private String authorizationToken; + private String created; // TODO should be date + private String updated; // TODO should be date + private String createdBy; + private String updatedBy; + private String status; + private Map links; + + private String warehouseHost; + private int warehousePort = 443; + + + public Warehouse(String title, String authToken, String description) { + this.title = notNull(title, "title"); + this.authorizationToken = notNull(authToken, "authToken"); + this.description = notNull(description, "description"); + } + + @JsonCreator + Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, + @JsonProperty("description") String description, @JsonProperty("created") String created, @JsonProperty("updated") String updated, + @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, @JsonProperty("status") String status, @JsonProperty("links") Map links) { + this(title, authToken, description); + this.created = created; + this.updated = updated; + this.createdBy = createdBy; + this.updatedBy = updatedBy; + this.status = status; + this.links = links; + } + + public String getTitle() { + return title; + } + + public String getAuthorizationToken() { + return authorizationToken; + } + + public String getDescription() { + return description; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getCreated() { + return created; + } + + public String getUpdated() { + return updated; + } + + public String getCreatedBy() { + return createdBy; + } + + public String getUpdatedBy() { + return updatedBy; + } + + public String getStatus() { + return status; + } + + void setWarehouseHost(String warehouseHost) { + this.warehouseHost = warehouseHost; + } + + void setWarehousePort(int warehousePort) { + this.warehousePort = warehousePort; + } + + /** + * Get jdbc connection string. Works only on Warehouse loaded from API (using WarehouseService). + * @return jdbc connection string + */ + @JsonIgnore + public String getJdbcConnectionString() { + if (warehouseHost == null) { + throw new IllegalStateException("Please set warehouseHost " + + "to be able to construct jdbc connection string"); + } + return JDBC_CONNECTION_TEMPLATE.expand(warehouseHost, warehousePort, getId()).toString(); + } + + @JsonIgnore + public String getSelfLink() { + return links != null ? links.get(SELF_LINK): null; + } + + @JsonIgnore + public String getId() { + return TEMPLATE.match(getSelfLink()).get(ID_PARAM); + } + + @JsonIgnore + public boolean isEnabled() { + return STATUS_ENABLED.equals(status); + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java new file mode 100644 index 000000000..cdcbe9ed6 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java @@ -0,0 +1,21 @@ +package com.gooddata.warehouse; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; + +/** + * Warehouse instance doesn't exist. + */ +public class WarehouseNotFoundException extends GoodDataException { + + private final String warehouseUri; + + public WarehouseNotFoundException(String uri, GoodDataRestException cause) { + super("Warehouse instance " + uri + " was not found", cause); + this.warehouseUri = uri; + } + + public String getWarehouseUri() { + return warehouseUri; + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java new file mode 100644 index 000000000..0f84cbfdf --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -0,0 +1,187 @@ +package com.gooddata.warehouse; + +import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.notNull; +import static java.util.Collections.emptyList; + +import com.gooddata.AbstractService; +import com.gooddata.FutureResult; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.PollHandler; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; +import java.util.Collection; + +/** + * Provide access to warehouse API - create, update, list and delete warehouses. + */ +public class WarehouseService extends AbstractService { + + private final String warehouseHost; + private final int warehousePort; + + /** + * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending + * this abstract one. + * + * @param restTemplate RESTful HTTP Spring template + * @param warehouseHost host to connect warehouses + * @param warehousePort port to connect warehouses + */ + public WarehouseService(RestTemplate restTemplate, String warehouseHost, int warehousePort) { + super(restTemplate); + this.warehouseHost = notNull(warehouseHost, "warehouseHost"); + this.warehousePort = warehousePort; + } + + /** + * Create new warehouse. + * + * @param warehouse warehouse to create + * + * @return created warehouse + */ + public FutureResult createWarehouse(Warehouse warehouse) { + notNull(warehouse, "warehouse"); + final WarehouseTask task; + try { + task = restTemplate.postForObject(Warehouses.URI, warehouse, WarehouseTask.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create Warehouse", e); + } + + if (task == null) { + throw new GoodDataException("Empty response when Warehouse POSTed to API"); + } + + return new FutureResult<>(this, new PollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { + + @Override + protected boolean isFinished(ClientHttpResponse response) throws IOException { + return HttpStatus.CREATED.equals(response.getStatusCode()); + } + + @Override + protected void onFinish() { + if (!getResult().isEnabled()) { + throw new GoodDataException("Created warehouse, uri: " + getResult().getSelfLink() + " is not enabled!"); + } + } + + @Override + protected void handlePollResult(WarehouseTask pollResult) { + try { + final Warehouse warehouse = restTemplate.getForObject(pollResult.getWarehouseLink(), Warehouse.class); + setResult(setWarehouseConnection(warehouse)); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Warehouse creation finished, but can't get created warehouse, uri: " + + pollResult.getWarehouseLink(), e); + } + } + }); + } + + /** + * Delete Warehouse. + * @param warehouse to delete + */ + public void removeWarehouse(Warehouse warehouse) { + notNull(warehouse, "warehouse"); + try { + restTemplate.delete(warehouse.getSelfLink()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to delete Warehouse, uri: " + warehouse.getSelfLink(), e); + } + } + + /** + * Get Warehouse identified by given uri. + * @param uri warehouse uri + * @return Warehouse + * @throws com.gooddata.GoodDataException when Warehouse can't be accessed + */ + public Warehouse getWarehouseByUri(String uri) { + notEmpty(uri, "uri"); + try { + return setWarehouseConnection(restTemplate.getForObject(uri, Warehouse.class)); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new WarehouseNotFoundException(uri, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get Warehouse instance " + uri, e); + } + } + + /** + * Get Warehouse identified by given id. + * @param id warehouse id + * @return Warehouse + * @throws com.gooddata.GoodDataException when Warehouse can't be accessed + */ + public Warehouse getWarehouseById(String id) { + notEmpty(id, "id"); + return getWarehouseByUri(uriFromId(id)); + } + + private static String uriFromId(String id) { + return Warehouse.TEMPLATE.expand(id).toString(); + } + + /** + * Lists Warehouses. Returns empty list in case there are no warehouses. + * + * @return collection of instances or empty list + */ + public Collection listWarehouses() { + try { + final Warehouses result = restTemplate.getForObject(Warehouses.URI, Warehouses.class); + if (result == null || result.getItems() == null) { + return emptyList(); + } + return setWarehouseConnection(result.getItems()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list Warehouses", e); + } + } + + /** + * Updates given Warehouse. + * + * @param toUpdate warehouse to be updated + * @return updated warehouse + * @throws com.gooddata.GoodDataException when update fails + */ + public Warehouse updateWarehouse(Warehouse toUpdate) { + notNull(toUpdate, "warehouse to update"); + try { + restTemplate.put(toUpdate.getSelfLink(), toUpdate); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to update Warehouse, uri: " + toUpdate.getSelfLink()); + } + + return getWarehouseByUri(toUpdate.getSelfLink()); + } + + private Warehouse setWarehouseConnection(Warehouse warehouse) { + notNull(warehouse, "warehouse"); + warehouse.setWarehouseHost(warehouseHost); + warehouse.setWarehousePort(warehousePort); + return warehouse; + } + + private Collection setWarehouseConnection(Collection warehouses) { + notNull(warehouses, "warehouses"); + for (Warehouse warehouse : warehouses) { + setWarehouseConnection(warehouse); + } + return warehouses; + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java new file mode 100644 index 000000000..8d3b7806f --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -0,0 +1,36 @@ +package com.gooddata.warehouse; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.util.Map; + +/** + * Async task for warehouse. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("asyncTask") +@JsonIgnoreProperties(ignoreUnknown = true) +class WarehouseTask { + + private static final String POLL_LINK = "poll"; + private static final String WAREHOUSE_LINK = "dssInstance"; + + private final Map links; + + @JsonCreator + private WarehouseTask(@JsonProperty("links") Map links) { + this.links = links; + } + + String getPollLink() { + return links.get(POLL_LINK); + } + + String getWarehouseLink() { + return links.get(WAREHOUSE_LINK); + } +} diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java new file mode 100644 index 000000000..5a3f144f6 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -0,0 +1,31 @@ +package com.gooddata.warehouse; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.util.List; + +/** + * List of warehouses. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("dssInstances") +@JsonIgnoreProperties(ignoreUnknown = true) +class Warehouses { + + static final String URI = "/gdc/dss/instances"; + + private final List items; + + @JsonCreator + private Warehouses(@JsonProperty("items") List items) { + this.items = items; + } + + List getItems() { + return items; + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java new file mode 100644 index 000000000..a88d572e4 --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -0,0 +1,168 @@ +package com.gooddata.warehouse; + +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static net.jadler.Jadler.verifyThatRequest; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +import com.gooddata.AbstractGoodDataIT; +import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Collection; + + +public class WarehouseServiceIT extends AbstractGoodDataIT { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final String TITLE = "Test"; + private static final String TASK_POLL = "/warehouse/warehouseTask-poll.json"; + private static final String TASK_DONE = "/warehouse/warehouseTask-finished.json"; + private static final String WAREHOUSE_ID = "instanceId"; + private static final String WAREHOUSE = "/warehouse/warehouse.json"; + + private static final String WAREHOUSE_URI = Warehouse.TEMPLATE.expand(WAREHOUSE_ID).toString(); + + private WarehouseTask pollingTask; + private WarehouseTask finishedTask; + private Warehouse warehouse; + + @Before + public void setUp() throws Exception { + pollingTask = MAPPER.readValue(readResource(TASK_POLL), WarehouseTask.class); + finishedTask = MAPPER.readValue(readResource(TASK_DONE), WarehouseTask.class); + warehouse = MAPPER.readValue(readResource(WAREHOUSE), Warehouse.class); + } + + private InputStream readResource(String path) { + return getClass().getResourceAsStream(path); + } + + @Test + public void shouldCreateWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Warehouses.URI) + .respond() + .withBody(readResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(202) + .thenRespond() + .withBody(readResource(TASK_DONE)) + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(finishedTask.getWarehouseLink()) + .respond() + .withBody(readResource(WAREHOUSE)) + .withStatus(200); + + final Warehouse created = gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); + assertNotNull(created); + assertThat(created.getTitle(), is(TITLE)); + assertThat(created.getJdbcConnectionString(), is("jdbc:dss://localhost:" + port() + WAREHOUSE_URI)); + } + + @Test + public void shouldListWarehouses() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(Warehouses.URI) + .respond() + .withBody(readResource("/warehouse/warehouses.json")) + .withStatus(200); + + final Collection list = gd.getWarehouseService().listWarehouses(); + assertNotNull(list); + assertThat(list, hasSize(2)); + } + + @Test + public void shouldRemoveWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(WAREHOUSE_URI) + .respond() + .withStatus(204); + + gd.getWarehouseService().removeWarehouse(warehouse); + + verifyThatRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(WAREHOUSE_URI) + .receivedOnce(); + } + + @Test + public void shouldGetWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouse.getSelfLink()) + .respond() + .withBody(readResource(WAREHOUSE)) + .withStatus(200); + + final Warehouse warehouse = gd.getWarehouseService().getWarehouseById(WAREHOUSE_ID); + assertNotNull(warehouse); + assertThat(warehouse.getTitle(), is(TITLE)); + } + + @Test + public void shouldUpdateWarehouse() throws Exception { + + final String updatedTitle = "UPDATED_TITLE"; + + final Warehouse toUpdate = MAPPER.readValue(readResource(WAREHOUSE), Warehouse.class); + toUpdate.setTitle(updatedTitle); + + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(warehouse.getSelfLink()) + .respond() + .withStatus(204); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouse.getSelfLink()) + .respond() + .withBody(MAPPER.writeValueAsString(toUpdate)) + .withStatus(200); + + final Warehouse updated = gd.getWarehouseService().updateWarehouse(toUpdate); + assertNotNull(updated); + assertThat(updated.getTitle(), is(updatedTitle)); + + verifyThatRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(warehouse.getSelfLink()) + .havingBody(new BaseMatcher() { + @Override + public boolean matches(Object o) { + try { + Warehouse instance = MAPPER.readValue((String) o, Warehouse.class); + return updatedTitle.equals(instance.getTitle()); + } catch (IOException e) { + return false; + } + } + + + @Override + public void describeTo(Description description) { + description.appendText("Warehouse not changed"); + } + }) + .receivedOnce(); + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java new file mode 100644 index 000000000..6d397f7aa --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -0,0 +1,29 @@ +package com.gooddata.warehouse; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +public class WarehouseTaskTest { + + @Test + public void testDeserializePoll() throws Exception { + final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-poll.json"); + assertThat(warehouseTask.getPollLink(), is("/gdc/dss/executions/executionId")); + } + + @Test + public void testDeserializeInstance() throws Exception { + final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-finished.json"); + assertThat(warehouseTask.getWarehouseLink(), is("/gdc/dss/instances/instanceId")); + } + + private WarehouseTask deserialize(String path) throws Exception { + final InputStream stream = getClass().getResourceAsStream(path); + return new ObjectMapper().readValue(stream, WarehouseTask.class); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java new file mode 100644 index 000000000..6b1ebee7f --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -0,0 +1,36 @@ +package com.gooddata.warehouse; + + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +public class WarehouseTest { + + @Test + public void testSerialization() throws Exception { + final Warehouse warehouse = new Warehouse("New ADS", "Your-ADS-Token", "ADS Description"); + assertThat(warehouse, serializesToJson("/warehouse/warehouse-create.json")); + } + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse.json"); + final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + + assertThat(warehouse.getTitle(), is("Test")); + assertThat(warehouse.getDescription(), is("Storage")); + assertThat(warehouse.getAuthorizationToken(), is("{Token}")); + assertThat(warehouse.getCreatedBy(), is("/gdc/account/profile/createdBy")); + assertThat(warehouse.getUpdatedBy(), is("/gdc/account/profile/updatedBy")); + assertThat(warehouse.getCreated(), is("2014-05-05T08:27:33.000Z")); + assertThat(warehouse.getUpdated(), is("2014-05-05T08:27:34.000Z")); + assertThat(warehouse.getAuthorizationToken(), is("{Token}")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java new file mode 100644 index 000000000..6715eaa40 --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -0,0 +1,23 @@ +package com.gooddata.warehouse; + +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.io.InputStream; + +public class WarehousesTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouses.json"); + final Warehouses warehouses = new ObjectMapper().readValue(stream, Warehouses.class); + + assertNotNull(warehouses.getItems()); + assertThat(warehouses.getItems(), hasSize(2)); + assertThat(warehouses.getItems().get(0).getTitle(), is("Storage")); + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouse-create.json b/src/test/resources/warehouse/warehouse-create.json new file mode 100644 index 000000000..0546e5f3b --- /dev/null +++ b/src/test/resources/warehouse/warehouse-create.json @@ -0,0 +1,7 @@ +{ + "dssInstance": { + "title": "New ADS", + "authorizationToken": "Your-ADS-Token", + "description": "ADS Description" + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouse.json b/src/test/resources/warehouse/warehouse.json new file mode 100644 index 000000000..bd2bfe165 --- /dev/null +++ b/src/test/resources/warehouse/warehouse.json @@ -0,0 +1,18 @@ +{ + "dssInstance" : { + "title" : "Test", + "description" : "Storage", + "status" : "ENABLED", + "authorizationToken" : "{Token}", + "created" : "2014-05-05T08:27:33.000Z", + "updated" : "2014-05-05T08:27:34.000Z", + "createdBy" : "/gdc/account/profile/createdBy", + "updatedBy" : "/gdc/account/profile/updatedBy", + "links" : { + "self" : "/gdc/dss/instances/instanceId", + "parent" : "/gdc/dss/instances", + "users" : "/gdc/dss/instances/instanceId/users", + "jdbc" : "/gdc/dss/instances/instanceId/jdbc" + } + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouseTask-finished.json b/src/test/resources/warehouse/warehouseTask-finished.json new file mode 100644 index 000000000..cbb131bca --- /dev/null +++ b/src/test/resources/warehouse/warehouseTask-finished.json @@ -0,0 +1,9 @@ +{ + "asyncTask": { + "links": { + "dssInstance": "/gdc/dss/instances/instanceId", + "user": "user URI", + "users": "URI of users in DSS Instance" + } + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouseTask-poll.json b/src/test/resources/warehouse/warehouseTask-poll.json new file mode 100644 index 000000000..cd26a4eec --- /dev/null +++ b/src/test/resources/warehouse/warehouseTask-poll.json @@ -0,0 +1,7 @@ +{ + "asyncTask" : { + "links" : { + "poll" : "/gdc/dss/executions/executionId" + } + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouses.json b/src/test/resources/warehouse/warehouses.json new file mode 100644 index 000000000..89863b7c3 --- /dev/null +++ b/src/test/resources/warehouse/warehouses.json @@ -0,0 +1,43 @@ +{ + "dssInstances" : { + "items" : [ { + "dssInstance" : { + "title" : "Storage", + "description" : "Testing Storage", + "status" : "ENABLED", + "authorizationToken" : "token", + "created" : "2014-03-17T13:02:39.000Z", + "updated" : "2014-03-17T13:02:41.000Z", + "createdBy" : "/gdc/account/profile/{profile-id}", + "updatedBy" : "/gdc/account/profile/{profile-id}", + "links" : { + "self" : "/gdc/dss/instances/{instance-id}", + "parent" : "/gdc/dss/instances", + "users" : "/gdc/dss/instances/{instance-id}/users", + "jdbc" : "/gdc/dss/instances/{instance-id}/jdbc" + } + } + }, { + "dssInstance" : { + "title" : "Salesforce", + "description" : "Test", + "status" : "ENABLED", + "authorizationToken" : "token", + "created" : "2014-04-09T22:10:26.000Z", + "updated" : "2014-04-09T22:10:26.000Z", + "createdBy" : "/gdc/account/profile/{profile-id}", + "updatedBy" : "/gdc/account/profile/{profile-id}", + "links" : { + "self" : "/gdc/dss/instances/{instance-id}", + "parent" : "/gdc/dss/instances", + "users" : "/gdc/dss/instances/{instance-id}/users", + "jdbc" : "/gdc/dss/instances/{instance-id}/jdbc" + } + } + } ], + "links" : { + "parent" : "/gdc/dss", + "self" : "/gdc/dss/instances" + } + } +} \ No newline at end of file From 690b546e458af4abe18f95300fccf8a8afff596b Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 25 Aug 2014 14:02:00 +0200 Subject: [PATCH 0035/1191] introduce simple zip utils --- src/main/java/com/gooddata/ZipUtils.java | 60 ++++++++++++++++++++ src/test/java/com/gooddata/ZipUtilsTest.java | 50 ++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/main/java/com/gooddata/ZipUtils.java create mode 100644 src/test/java/com/gooddata/ZipUtilsTest.java diff --git a/src/main/java/com/gooddata/ZipUtils.java b/src/main/java/com/gooddata/ZipUtils.java new file mode 100644 index 000000000..c9d8bf94a --- /dev/null +++ b/src/main/java/com/gooddata/ZipUtils.java @@ -0,0 +1,60 @@ +package com.gooddata; + +import static com.gooddata.Validate.notNull; + +import org.springframework.util.StreamUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Path; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * Utility class for manipulating zip archives. + */ +public abstract class ZipUtils { + + /** + * This method compresses the input file to zip format. If the given file is a directory, it recursively + * packs the directory into the output. + * + * @param file file to be zipped + * @param output stream where the output will be written + */ + public static void zip(File file, OutputStream output) throws IOException { + notNull(file, "file"); + notNull(output, "output"); + + try (ZipOutputStream zos = new ZipOutputStream(output)) { + final Path rootPath = file.getParentFile().toPath(); + if (file.isDirectory()) { + zipDir(rootPath, file, zos); + } else { + zipFile(rootPath, file, zos); + } + + } + } + + private static void zipDir(Path rootPath, File dir, ZipOutputStream zos) throws IOException { + for (File file : notNull(dir.listFiles(), "listed files")) { + if (file.isDirectory()) { + zipDir(rootPath, file, zos); + } else { + zipFile(rootPath, file, zos); + } + } + } + + private static void zipFile(Path rootPath, File file, ZipOutputStream zos) throws IOException { + ZipEntry ze = new ZipEntry(rootPath.relativize(file.toPath()).toString()); + zos.putNextEntry(ze); + try (FileInputStream fis = new FileInputStream(file)) { + StreamUtils.copy(fis, zos); + } + zos.closeEntry(); + } +} diff --git a/src/test/java/com/gooddata/ZipUtilsTest.java b/src/test/java/com/gooddata/ZipUtilsTest.java new file mode 100644 index 000000000..ee0dd3f21 --- /dev/null +++ b/src/test/java/com/gooddata/ZipUtilsTest.java @@ -0,0 +1,50 @@ +package com.gooddata; + +import static org.junit.Assert.*; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +public class ZipUtilsTest { + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + + @Test + public void shouldZipSingleFile() throws Exception { + final File file = temporaryFolder.newFile("someFile.zip"); + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + ZipUtils.zip(file, output); + output.close(); + try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { + ZipEntry entry = zipInputStream.getNextEntry(); + assertNotNull(entry); + assertEquals("someFile.zip", entry.getName()); + } + } + } + + @Test + public void shouldZipDir() throws Exception { + File toZipDir = temporaryFolder.newFolder("toZip"); + File toZipFile = toZipDir.toPath().resolve("a/b/someFile.zip").toFile(); + toZipFile.getParentFile().mkdirs(); + toZipFile.createNewFile(); + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + ZipUtils.zip(toZipDir, output); + output.close(); + try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { + ZipEntry entry = zipInputStream.getNextEntry(); + assertNotNull(entry); + assertEquals("toZip/a/b/someFile.zip", entry.getName()); + } + } + } +} \ No newline at end of file From 778a1e8d338c270ad843186552c1b0f24d42ef4e Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 26 Aug 2014 14:13:47 +0200 Subject: [PATCH 0036/1191] introduce dataload processes support --- README.md | 9 + .../java/com/gooddata/AbstractService.java | 17 + src/main/java/com/gooddata/GoodData.java | 6 +- .../gooddata/dataload/processes/Process.java | 92 ++++++ .../dataload/processes/ProcessExecution.java | 67 ++++ .../processes/ProcessExecutionDetail.java | 89 ++++++ .../processes/ProcessExecutionException.java | 39 +++ .../processes/ProcessExecutionTask.java | 36 +++ .../processes/ProcessNotFoundException.java | 20 ++ .../dataload/processes/ProcessService.java | 294 ++++++++++++++++++ .../dataload/processes/Processes.java | 37 +++ .../com/gooddata/report/ReportService.java | 8 +- .../processes/ProcessExecutionDetailTest.java | 31 ++ .../processes/ProcessExecutionTaskTest.java | 19 ++ .../processes/ProcessExecutionTest.java | 29 ++ .../dataload/processes/ProcessServiceIT.java | 202 ++++++++++++ .../dataload/processes/ProcessTest.java | 34 ++ .../dataload/processes/ProcessesTest.java | 22 ++ .../dataload/processes/execution.json | 13 + .../processes/executionDetail-success.json | 15 + .../dataload/processes/executionDetail.json | 20 ++ .../dataload/processes/executionTask.json | 8 + .../dataload/processes/process-input.json | 6 + .../resources/dataload/processes/process.json | 13 + .../dataload/processes/processes.json | 17 + 25 files changed, 1135 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gooddata/dataload/processes/Process.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessExecution.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessService.java create mode 100644 src/main/java/com/gooddata/dataload/processes/Processes.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessTest.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessesTest.java create mode 100644 src/test/resources/dataload/processes/execution.json create mode 100644 src/test/resources/dataload/processes/executionDetail-success.json create mode 100644 src/test/resources/dataload/processes/executionDetail.json create mode 100644 src/test/resources/dataload/processes/executionTask.json create mode 100644 src/test/resources/dataload/processes/process-input.json create mode 100644 src/test/resources/dataload/processes/process.json create mode 100644 src/test/resources/dataload/processes/processes.json diff --git a/README.md b/README.md index ec914cc84..c39eb567d 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,12 @@ warehouse = warehouseService.updateWarehouse(warehouse); Collection warehouseList = warehouseService.listInstances(); warehouseService.removeWarehouse(warehouse); ``` + +### Dataload processes API +Manage dataload processes - create, update, list, delete, and process executions - execute, get logs, ... +```java +ProcessService processService = gd.getProcessService(); +Process process = processService.createProcess(project, new Process('name', 'GRAPH'), new File('path/to/processdatadir')).get(); +ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); +processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten"); +``` diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index a5cf0fb69..f4bbadd64 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -12,17 +12,21 @@ import org.springframework.web.client.HttpMessageConverterExtractor; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.util.concurrent.TimeUnit; import static com.gooddata.Validate.notNull; import static java.lang.String.format; +import static java.util.Collections.emptyList; import static org.springframework.http.HttpMethod.GET; + /** * Parent for GoodData services providing helpers for REST API calls and polling. */ @@ -161,4 +165,17 @@ public void close() { } } + protected static class OutputStreamResponseExtractor implements ResponseExtractor { + private final OutputStream output; + + public OutputStreamResponseExtractor(OutputStream output) { + this.output = output; + } + + @Override + public Integer extractData(ClientHttpResponse response) throws IOException { + return FileCopyUtils.copy(response.getBody(), output); + } + } + } diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index adba154fb..1b39448dc 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -61,6 +61,7 @@ public class GoodData { private final DataStoreService dataStoreService; private final DatasetService datasetService; private final ReportService reportService; + private final ProcessService processService; private final WarehouseService warehouseService; /** @@ -114,7 +115,7 @@ public GoodData(String hostname, String login, String password, int port, String dataStoreService = new DataStoreService(httpClientBuilder, gdcService, login, password); datasetService = new DatasetService(restTemplate, dataStoreService); reportService = new ReportService(restTemplate); - processService = new ProcessService(restTemplate); + processService = new ProcessService(restTemplate, accountService); warehouseService = new WarehouseService(restTemplate, hostname, port); } @@ -232,6 +233,9 @@ public ReportService getReportService() { return reportService; } + public ProcessService getProcessService() { + return processService; + } /** * Get initialized service for ADS management (create, access and delete ads instances). * diff --git a/src/main/java/com/gooddata/dataload/processes/Process.java b/src/main/java/com/gooddata/dataload/processes/Process.java new file mode 100644 index 000000000..d2e04a0f4 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/Process.java @@ -0,0 +1,92 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.Validate.notEmpty; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +/** + * Dataload process. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("process") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Process { + + public static final String URI = "/gdc/projects/{projectId}/dataload/processes/{processId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + private static final String EXECUTIONS_LINK = "executions"; + + private String name; + private String type; + private Set executables; + private Map links; + + public Process(String name, String type) { + this.name = notEmpty(name, "name"); + this.type = notEmpty(type, "type"); + } + + @JsonCreator + private Process(@JsonProperty("name") String name, @JsonProperty("type") String type, + @JsonProperty("executables") Set executables, + @JsonProperty("links") Map links) { + this(name, type); + this.executables = executables != null ? Collections.unmodifiableSet(executables) : null; + this.links = links; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public void setName(String name) { + this.name = name; + } + + public void setType(String type) { + this.type = type; + } + + @JsonIgnore + public Set getExecutables() { + return executables; + } + + @JsonIgnore + public String getSelfLink() { + return links != null ? links.get(SELF_LINK) : null; + } + + @JsonIgnore + public String getId() { + return TEMPLATE.match(getSelfLink()).get("processId"); + } + + @JsonIgnore + public String getExecutionsLink() { + return links != null ? links.get(EXECUTIONS_LINK) : null; + } + + @JsonIgnore + public String getSourceLink() { + return getSelfLink() != null ? getSelfLink() + "/source" : null; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java new file mode 100644 index 000000000..a10f33d57 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -0,0 +1,67 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.notNull; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.util.CollectionUtils; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * Dataload process execution. Serialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("execution") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProcessExecution { + + private final String executionsUri; + + private final String executable; + private final Map params; + private final Map hiddenParams; + + public ProcessExecution(Process process, String executable) { + this(process, executable, new HashMap(), new HashMap()); + } + + public ProcessExecution(Process process, String executable, Map params) { + this(process, executable, params, new HashMap()); + } + + public ProcessExecution(Process process, String executable, Map params, Map hiddenParams) { + notNull(process, "process"); + this.executionsUri = notEmpty(process.getExecutionsLink(), "process executions link"); + this.executable = executable; + this.params = notNull(params, "params"); + this.hiddenParams = notNull(hiddenParams, "hiddenParams"); + + if (!CollectionUtils.isEmpty(process.getExecutables()) && + !process.getExecutables().contains(executable)) { + throw new IllegalArgumentException("Executable " + executable + " not found in process executables."); + } + } + + public String getExecutable() { + return executable; + } + + public Map getParams() { + return params; + } + + public Map getHiddenParams() { + return hiddenParams; + } + + @JsonIgnore + String getExecutionsUri() { + return executionsUri; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java new file mode 100644 index 000000000..72398093d --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -0,0 +1,89 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.notNull; + +import com.gooddata.gdc.ErrorStructure; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.net.URI; +import java.util.Map; + +/** + * Dataload process execution detail. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("executionDetail") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProcessExecutionDetail { + + private static final String LOG_LINK = "log"; + private static final String STATUS_OK = "OK"; + private final String status; + + // TODO should be dates + private final String created; + private final String started; + private final String updated; + private final String finished; + + private final ErrorStructure error; + private final Map links; + + @JsonCreator + private ProcessExecutionDetail(@JsonProperty("status") String status, @JsonProperty("created") String created, @JsonProperty("started") String started, + @JsonProperty("updated") String updated, @JsonProperty("finished")String finished, @JsonProperty("error") ErrorStructure error, + @JsonProperty("links") Map links) { + this.status = notEmpty(status, "status"); + this.created = notNull(created, "created"); + this.started = started; + this.updated = updated; + this.finished = finished; + this.error = error; + this.links = links; + } + + public String getStatus() { + return status; + } + + public String getCreated() { + return created; + } + + public String getStarted() { + return started; + } + + public String getUpdated() { + return updated; + } + + public String getFinished() { + return finished; + } + + public ErrorStructure getError() { + return error; + } + + @JsonIgnore + public String getLogLink() { + return links != null ? links.get(LOG_LINK) : null; + } + + @JsonIgnore + public boolean isSuccess() { + return STATUS_OK.equals(status); + } + + + public static URI uriFromExecutionUri(URI executionUri) { + return URI.create(executionUri.toString() + "/detail"); + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java new file mode 100644 index 000000000..e107d5369 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java @@ -0,0 +1,39 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.GoodDataException; + +/** + * Represents failure during process execution + */ +public class ProcessExecutionException extends GoodDataException { + + + private ProcessExecutionDetail executionDetail; + private String executionDetailUri; + + public ProcessExecutionException(String message) { + super(message); + } + + public ProcessExecutionException(String message, Throwable cause) { + super(message, cause); + } + + public ProcessExecutionException(String message, ProcessExecutionDetail executionDetail) { + super(message); + this.executionDetail = executionDetail; + } + + public ProcessExecutionException(String message, Throwable cause, String executionDetailUri) { + super(message, cause); + this.executionDetailUri = executionDetailUri; + } + + public ProcessExecutionDetail getExecutionDetail() { + return executionDetail; + } + + public String getExecutionDetailUri() { + return executionDetailUri; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java new file mode 100644 index 000000000..150347bdb --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -0,0 +1,36 @@ +package com.gooddata.dataload.processes; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.util.Map; + +/** + * Process execution task. Deserialization only + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("executionTask") +@JsonIgnoreProperties(ignoreUnknown = true) +class ProcessExecutionTask { + + private static final String POLL_LINK = "poll"; + private static final String DETAIL_LINK = "detail"; + + private final Map links; + + @JsonCreator + private ProcessExecutionTask(@JsonProperty("links") Map links) { + this.links = links; + } + + String getPollLink() { + return links != null ? links.get(POLL_LINK) : null; + } + + String getDetailLink() { + return links != null ? links.get(DETAIL_LINK) : null; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java new file mode 100644 index 000000000..bf1572d1d --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java @@ -0,0 +1,20 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.GoodDataException; + +/** + * Process of the given URI doesn't exist + */ +public class ProcessNotFoundException extends GoodDataException { + + private final String uri; + + public ProcessNotFoundException(String uri, Throwable cause) { + super("Process " + uri + " was not found", cause); + this.uri = uri; + } + + public String getUri() { + return uri; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java new file mode 100644 index 000000000..2c0a1d7d7 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -0,0 +1,294 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.notNull; +import static java.util.Collections.emptyList; + +import com.gooddata.AbstractService; +import com.gooddata.FutureResult; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.PollHandler; +import com.gooddata.ZipUtils; +import com.gooddata.account.AccountService; +import com.gooddata.project.Project; +import org.springframework.core.io.FileSystemResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.FileCopyUtils; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URI; +import java.util.Collection; + +/** + * Service to manage dataload processes and process executions. + */ +public class ProcessService extends AbstractService { + + private static final MediaType MEDIA_TYPE_ZIP = MediaType.parseMediaType("application/zip"); + + private final AccountService accountService; + + /** + * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending + * this abstract one. + * + * @param restTemplate RESTful HTTP Spring template + * @param accountService service to access accounts + */ + public ProcessService(RestTemplate restTemplate, AccountService accountService) { + super(restTemplate); + this.accountService = notNull(accountService, "accountService"); + } + + /** + * Create new process with given data by given project. + * + * @param project project to which the process belongs + * @param process to create + * @param processData process data to upload + * @return created process + */ + public Process createProcess(Project project, Process process, File processData) { + notNull(process, "process"); + notNull(processData, "processData"); + notNull(project, "project"); + + return postProcess(process, processData, getProcessesUri(project)); + } + + /** + * Update process with given data by given project. + * + * @param project project to which the process belongs + * @param process to create + * @param processData process data to upload + * @return updated process + */ + public Process updateProcess(Project project, Process process, File processData) { + notNull(process, "process"); + notNull(processData, "processData"); + notNull(project, "project"); + + return postProcess(process, processData, getProcessUri(project, process.getId())); + } + + /** + * Get process by given URI. + * @param uri process uri + * @return found process + * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist + */ + public Process getProcessByUri(String uri) { + notEmpty(uri, "uri"); + try { + return restTemplate.getForObject(uri, Process.class); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new ProcessNotFoundException(uri, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get process " + uri, e); + } + } + + /** + * Get process by given id and project. + * @param project project to which the process belongs + * @param id process id + * @return found process + * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist + */ + public Process getProcessById(Project project, String id) { + notEmpty(id, "id"); + notNull(project, "project"); + return getProcessByUri(getProcessUri(project, id).toString()); + } + + /** + * Get list of processes by given project. + * @param project project of processes + * @return list of found processes or empty list + */ + public Collection listProcesses(Project project) { + notNull(project, "project"); + return listProcesses(getProcessesUri(project)); + } + + /** + * Get list of current user processes by given user account. + * @return list of found processes or empty list + */ + public Collection listUserProcesses() { + return listProcesses(Processes.USER_PROCESSES_TEMPLATE.expand(accountService.getCurrent().getId())); + } + + /** + * Delete given process + * @param process to delete + */ + public void removeProcess(Process process) { + notNull(process, "process"); + try { + restTemplate.delete(process.getSelfLink()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to remove process " + process.getSelfLink(), e); + } + } + + /** + * Get process source data + * @param process process to fetch data of + * @param outputStream stream where to write fetched data + */ + public void getProcessSource(Process process, OutputStream outputStream) { + notNull(process, "process"); + notNull(outputStream, "outputStream"); + try { + restTemplate.execute(process.getSourceLink(), HttpMethod.GET, + noopRequestCallback, new OutputStreamResponseExtractor(outputStream)); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to get process source " + process.getSourceLink(), e); + } + } + + /** + * Get process execution log + * @param executionDetail execution to log of + * @param outputStream stream to write the log to + */ + public void getExecutionLog(ProcessExecutionDetail executionDetail, OutputStream outputStream) { + notNull(executionDetail, "executionDetail"); + notNull(outputStream, "outputStream"); + try { + restTemplate.execute(executionDetail.getLogLink(), HttpMethod.GET, + noopRequestCallback, new OutputStreamResponseExtractor(outputStream)); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to get process execution log " + executionDetail.getLogLink(), e); + } + } + + /** + * Run given execution under given process + * + * @param execution to run + * @return result of the execution + * @throws com.gooddata.dataload.processes.ProcessExecutionException in case process can't be executed + */ + public FutureResult executeProcess(ProcessExecution execution) { + notNull(execution, "execution"); + ProcessExecutionTask executionTask; + try { + executionTask = restTemplate.postForObject(execution.getExecutionsUri(), execution, ProcessExecutionTask.class); + } catch (GoodDataException | RestClientException e) { + throw new ProcessExecutionException("Cannot execute process", e); + } + + if (executionTask == null) { + throw new ProcessExecutionException("Cannot find started execution."); + } + + final String detailLink = executionTask.getDetailLink(); + + return new FutureResult<>(this, new PollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { + @Override + protected boolean isFinished(ClientHttpResponse response) throws IOException { + return HttpStatus.NO_CONTENT.equals(response.getStatusCode()); + } + + @Override + protected void handlePollResult(Void pollResult) { + ProcessExecutionDetail executionDetail; + try { + executionDetail = restTemplate.getForObject(detailLink, ProcessExecutionDetail.class); + } catch (GoodDataException | RestClientException e) { + throw new ProcessExecutionException("Execution finished, but cannot get its result.", e, detailLink); + } + + if (!executionDetail.isSuccess()) { + throw new ProcessExecutionException("Execution was not successful", executionDetail); + } else { + setResult(executionDetail); + } + } + }); + } + + private Collection listProcesses(URI uri) { + try { + final Processes processes = restTemplate.getForObject(uri, Processes.class); + if (processes == null || processes.getItems() == null) { + return emptyList(); + } + return processes.getItems(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list processes", e); + } + } + + private static URI getProcessUri(Project project, String id) { + return Process.TEMPLATE.expand(project.getId(), id); + } + + private static URI getProcessesUri(Project project) { + return Processes.TEMPLATE.expand(project.getId()); + } + + private Process postProcess(Process process, File processData, URI postUri) { + File tempFile = createTempFile("process", ".zip"); + + final MultiValueMap parts = new LinkedMultiValueMap<>(2); + parts.add("process", process); + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MEDIA_TYPE_ZIP); + parts.add("data", new HttpEntity<>(new FileSystemResource(tempFile), headers)); + + try (FileOutputStream output = new FileOutputStream(tempFile)) { + ZipUtils.zip(processData, output); + } catch (IOException e) { + throw new GoodDataException("Unable to zip process data", e); + } + + try { + return restTemplate.postForObject(postUri, parts, Process.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create dataload process.", e); + } finally { + deleteTempFile(tempFile); + } + } + + private File createTempFile(String prefix, String suffix) { + File tempFile; + try { + tempFile = File.createTempFile(prefix, suffix); + tempFile.deleteOnExit(); + } catch (IOException e) { + throw new GoodDataException("Unable to create temporary file", e); + } + return tempFile; + } + + private void deleteTempFile(File file) { + notNull(file, "file"); + file.delete(); + } + +} diff --git a/src/main/java/com/gooddata/dataload/processes/Processes.java b/src/main/java/com/gooddata/dataload/processes/Processes.java new file mode 100644 index 000000000..ecc1cbcf2 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/Processes.java @@ -0,0 +1,37 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.account.Account; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Collection; +import java.util.List; + +/** + * List of processes. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("processes") +@JsonIgnoreProperties(ignoreUnknown = true) +class Processes { + public static final String URI = "/gdc/projects/{projectId}/dataload/processes"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + public static final String USER_PROCESSES_URI = Account.URI + "/dataload/processes"; + public static final UriTemplate USER_PROCESSES_TEMPLATE = new UriTemplate(USER_PROCESSES_URI); + + private final List items; + + @JsonCreator + private Processes(@JsonProperty("items") List items) { + this.items = items; + } + + Collection getItems() { + return items; + } +} diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index e12055d4d..90514095c 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -48,12 +48,7 @@ public void exportReport(final ReportDefinition reportDefinition, final ReportEx notNull(output, "output"); final String uri = exportReport(reportDefinition, format); try { - restTemplate.execute(uri, GET, noopRequestCallback, new ResponseExtractor() { - @Override - public Integer extractData(ClientHttpResponse response) throws IOException { - return FileCopyUtils.copy(response.getBody(), output); - } - }); + restTemplate.execute(uri, GET, noopRequestCallback, new OutputStreamResponseExtractor(output)); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to export report", e); } @@ -89,5 +84,4 @@ private String exportReport(final JsonNode execResult, final ReportExportFormat throw new GoodDataException("Unable to export report", e); } } - } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java new file mode 100644 index 000000000..1978c78ea --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -0,0 +1,31 @@ +package com.gooddata.dataload.processes; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +public class ProcessExecutionDetailTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeserialization() throws Exception { + final ProcessExecutionDetail executionDetail = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/executionDetail.json"), + ProcessExecutionDetail.class); + assertNotNull(executionDetail); + assertThat(executionDetail.getStatus(), is("ERROR")); + assertThat(executionDetail.getCreated(), is("2014-02-24T19:00:35.999Z")); + assertThat(executionDetail.getStarted(), is("2014-02-24T19:00:39.155Z")); + assertThat(executionDetail.getUpdated(), is("2014-02-24T19:26:13.197Z")); + assertThat(executionDetail.getFinished(), is("2014-02-24T19:26:13.060Z")); + assertNotNull(executionDetail.getError()); + assertThat(executionDetail.getError().getErrorCode(), is("executor.error")); + assertThat(executionDetail.getError().getFormattedMessage(), + is("Error message with some placeholders for parameters - like this one.")); + + } + + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java new file mode 100644 index 000000000..3069fc484 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -0,0 +1,19 @@ +package com.gooddata.dataload.processes; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +public class ProcessExecutionTaskTest { + + @Test + public void testDeserialize() throws Exception { + final ProcessExecutionTask task = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/executionTask.json"), ProcessExecutionTask.class); + assertThat(task.getPollLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); + assertThat(task.getDetailLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail")); + + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java new file mode 100644 index 000000000..f420006f5 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -0,0 +1,29 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.junit.Assert.assertThat; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class ProcessExecutionTest { + + @Test + public void testSerialization() throws Exception { + final Map params = new HashMap<>(); + final Map hidden = new HashMap<>(); + params.put("PARAM1", "VALUE1"); + params.put("PARAM2", "VALUE2"); + hidden.put("HIDDEN_PARAM1", "SENSITIVE_VALUE1"); + hidden.put("HIDDEN_PARAM2", "SENSITIVE_VALUE2"); + + final Process process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + + final ProcessExecution execution = new ProcessExecution(process, "test.groovy", params, hidden); + assertThat(execution, serializesToJson("/dataload/processes/execution.json")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java new file mode 100644 index 000000000..71322aef1 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -0,0 +1,202 @@ +package com.gooddata.dataload.processes; + +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.verifyThatRequest; +import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertThat; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.FutureResult; +import com.gooddata.project.Project; +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.util.Collection; + + +public class ProcessServiceIT extends AbstractGoodDataIT { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + private static final String PROCESSES_PATH = Processes.TEMPLATE.expand("PROJECT_ID").toString(); + private static final String PROCESS_ID = "processId"; + private static final String PROCESS_PATH = Process.TEMPLATE.expand("PROJECT_ID", PROCESS_ID).toString(); + private static final String PROCESS_SOURCE_PATH = PROCESS_PATH + "/source"; + private static final String EXECUTIONS_PATH = PROCESS_PATH + "/executions"; + private static final String EXECUTION_PATH = EXECUTIONS_PATH + "/executionId"; + private static final String EXECUTION_DETAIL_PATH = EXECUTION_PATH + "/detail"; + + private Project project; + + @Rule + public TemporaryFolder temporaryFolder = new TemporaryFolder(); + private Process process; + + @Before + public void setUp() throws Exception { + project = MAPPER.readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); + process = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + + } + + @Test + public void shouldCreateProcess() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROCESSES_PATH) + .respond() + .withBody(getClass().getResourceAsStream("/dataload/processes/process.json")) + .withStatus(201); + + File file = temporaryFolder.newFile("test.groovy"); + final Process process = gd.getProcessService().createProcess(project, new Process("testProcess", "GROOVY"), file); + assertNotNull(process); + assertThat(process.getExecutables(), hasSize(1)); + assertThat(process.getExecutables().iterator().next(), is("test.groovy")); + + // TODO jadler misses possibility to verify multipart +// verifyThatRequest() +// .havingMethodEqualTo("POST") +// .havingPathEqualTo(Processes.URI) +// .receivedOnce(); + + } + + @Test + public void shouldListProcesses() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESSES_PATH) + .respond() + .withBody(getClass().getResourceAsStream("/dataload/processes/processes.json")) + .withStatus(200); + + final Collection processes = gd.getProcessService().listProcesses(project); + assertNotNull(processes); + assertThat(processes, hasSize(1)); + } + + @Test + public void shouldGetProcess() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESS_PATH) + .respond() + .withBody(getClass().getResourceAsStream("/dataload/processes/process.json")) + .withStatus(200); + + final Process process = gd.getProcessService().getProcessById(project, PROCESS_ID); + assertNotNull(process); + assertThat(process.getName(), is("testProcess")); + } + + @Test + public void shouldRemoveProcess() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(PROCESS_PATH) + .respond() + .withStatus(204); + + gd.getProcessService().removeProcess(process); + + verifyThatRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(PROCESS_PATH) + .receivedOnce(); + } + + @Test + public void shouldGetProcessSource() throws Exception { + final String processDownloadLink = "/processSourceUri"; + final String processSource = "processSource"; + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESS_SOURCE_PATH) + .respond() + .withHeader("Location", processDownloadLink) + .withStatus(303); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(processDownloadLink) + .respond() + .withBody(processSource) + .withStatus(200); + + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + gd.getProcessService().getProcessSource(process, outputStream); + assertThat(outputStream.toString(), is(processSource)); + } + + @Test + public void shouldGetExecutionLog() throws Exception { + final String logDownloadLink = EXECUTION_PATH + "/log"; + final String log = "log"; + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(logDownloadLink) + .respond() + .withBody(log) + .withStatus(200); + + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + final ProcessExecutionDetail executionDetail = MAPPER.readValue(readResource("/dataload/processes/executionDetail.json"), ProcessExecutionDetail.class); + gd.getProcessService().getExecutionLog(executionDetail, outputStream); + assertThat(outputStream.toString(), is(log)); + } + + @Test + public void shouldExecuteProcess() throws Exception { + mockExecutionRequests(); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(EXECUTION_DETAIL_PATH) + .respond() + .withBody(readResource("/dataload/processes/executionDetail-success.json")) + .withStatus(200); + + final FutureResult result = gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")); + final ProcessExecutionDetail executionDetail = result.get(); + + assertJsonEquals(MAPPER.readValue(readResource("/dataload/processes/executionDetail-success.json"), ProcessExecutionDetail.class), executionDetail); + } + + @Test(expected = ProcessExecutionException.class) + public void shouldThrowOnExecuteProcessError() throws Exception { + mockExecutionRequests(); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(EXECUTION_DETAIL_PATH) + .respond() + .withBody(readResource("/dataload/processes/executionDetail.json")) + .withStatus(200); + + gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")).get(); + } + + private void mockExecutionRequests() { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(EXECUTIONS_PATH) + .respond() + .withBody(readResource("/dataload/processes/executionTask.json")) + .withHeader("Location", EXECUTION_PATH) + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(EXECUTION_PATH) + .respond() + .withStatus(202) + .thenRespond() + .withStatus(204); + } +} diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java new file mode 100644 index 000000000..24ac29e6a --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java @@ -0,0 +1,34 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.junit.Assert.assertThat; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +public class ProcessTest { + + + @Test + public void testDeserialization() throws Exception { + final Process process = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + + assertThat(process, is(notNullValue())); + assertThat(process.getName(), is("testProcess")); + assertThat(process.getType(), is("GROOVY")); + assertThat(process.getExecutables(), hasSize(1)); + assertThat(process.getId(), is("processId")); + assertThat(process.getExecutionsLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions")); + + } + + @Test + public void testSerialization() { + final Process process = new Process("testProcess", "GROOVY"); + assertThat(process, serializesToJson("/dataload/processes/process-input.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java new file mode 100644 index 000000000..11cc0d617 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java @@ -0,0 +1,22 @@ +package com.gooddata.dataload.processes; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.junit.Assert.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.junit.Test; + +public class ProcessesTest { + + @Test + public void testDeserialization() throws Exception { + final Processes processes = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), Processes.class); + + assertThat(processes, is(notNullValue())); + assertThat(processes.getItems(), hasSize(1)); + } + +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/execution.json b/src/test/resources/dataload/processes/execution.json new file mode 100644 index 000000000..560c37c56 --- /dev/null +++ b/src/test/resources/dataload/processes/execution.json @@ -0,0 +1,13 @@ +{ + "execution" : { + "executable" : "test.groovy", + "params" : { + "PARAM1" : "VALUE1", + "PARAM2" : "VALUE2" + }, + "hiddenParams" : { + "HIDDEN_PARAM1" : "SENSITIVE_VALUE1", + "HIDDEN_PARAM2" : "SENSITIVE_VALUE2" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/executionDetail-success.json b/src/test/resources/dataload/processes/executionDetail-success.json new file mode 100644 index 000000000..e570e5d71 --- /dev/null +++ b/src/test/resources/dataload/processes/executionDetail-success.json @@ -0,0 +1,15 @@ +{ + "executionDetail": { + "status": "OK", + "created": "2014-02-24T19:00:35.999Z", + "started": "2014-02-24T19:00:39.155Z", + "updated": "2014-02-24T19:26:13.197Z", + "finished": "2014-02-24T19:26:13.060Z", + "links": { + "poll": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId", + "self": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/log", + "data": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/data" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/executionDetail.json b/src/test/resources/dataload/processes/executionDetail.json new file mode 100644 index 000000000..1d5e79ef7 --- /dev/null +++ b/src/test/resources/dataload/processes/executionDetail.json @@ -0,0 +1,20 @@ +{ + "executionDetail": { + "status": "ERROR", + "created": "2014-02-24T19:00:35.999Z", + "started": "2014-02-24T19:00:39.155Z", + "updated": "2014-02-24T19:26:13.197Z", + "finished": "2014-02-24T19:26:13.060Z", + "error" : { + "errorCode" : "executor.error", + "message" : "Error message with some placeholders for parameters - like %s.", + "parameters" : [ "this one" ] + }, + "links": { + "poll": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId", + "self": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/log", + "data": "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/data" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/executionTask.json b/src/test/resources/dataload/processes/executionTask.json new file mode 100644 index 000000000..f97e58bd2 --- /dev/null +++ b/src/test/resources/dataload/processes/executionTask.json @@ -0,0 +1,8 @@ +{ + "executionTask" : { + "links" : { + "poll" : "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId", + "detail" : "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/process-input.json b/src/test/resources/dataload/processes/process-input.json new file mode 100644 index 000000000..202cbf148 --- /dev/null +++ b/src/test/resources/dataload/processes/process-input.json @@ -0,0 +1,6 @@ +{ + "process" : { + "type" : "GROOVY", + "name" : "testProcess" + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/process.json b/src/test/resources/dataload/processes/process.json new file mode 100644 index 000000000..7d66f7fda --- /dev/null +++ b/src/test/resources/dataload/processes/process.json @@ -0,0 +1,13 @@ +{ + "process":{ + "type" : "GROOVY", + "name" : "testProcess", + "executables" : [ + "test.groovy" + ], + "links" : { + "self" : "/gdc/projects/PROJECT_ID/dataload/processes/processId", + "executions" : "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/processes.json b/src/test/resources/dataload/processes/processes.json new file mode 100644 index 000000000..710d13b2d --- /dev/null +++ b/src/test/resources/dataload/processes/processes.json @@ -0,0 +1,17 @@ +{ + "processes" : { + "items" : [ { + "process":{ + "type" : "GROOVY", + "name" : "testProcess", + "executables" : [ + "test.groovy" + ], + "links" : { + "self" : "/gdc/PROJECT_ID/projectId/dataload/processes/processId", + "executions" : "/gdc/PROJECT_ID/dataload/processes/processId/executions" + } + } + } ] + } +} \ No newline at end of file From e71bc69b6080d6672070d6d4cd9fec0c81da7f94 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 27 Aug 2014 11:18:17 +0200 Subject: [PATCH 0037/1191] fix polling on response without body --- .../java/com/gooddata/AbstractService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index f4bbadd64..97a87a4b1 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -3,6 +3,10 @@ */ package com.gooddata; +import static com.gooddata.Validate.notNull; +import static java.lang.String.format; +import static org.springframework.http.HttpMethod.GET; + import org.codehaus.jackson.map.ObjectMapper; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -12,7 +16,6 @@ import org.springframework.web.client.HttpMessageConverterExtractor; import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; -import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.ByteArrayInputStream; @@ -21,11 +24,6 @@ import java.io.OutputStream; import java.util.concurrent.TimeUnit; -import static com.gooddata.Validate.notNull; -import static java.lang.String.format; -import static java.util.Collections.emptyList; -import static org.springframework.http.HttpMethod.GET; - /** * Parent for GoodData services providing helpers for REST API calls and polling. @@ -112,7 +110,7 @@ protected final T extractData(ClientHttpResponse response, Class cls) thr private class ReusableClientHttpResponse implements ClientHttpResponse { - private final byte[] body; + private byte[] body; private final HttpStatus statusCode; private final int rawStatusCode; private final String statusText; @@ -120,7 +118,10 @@ private class ReusableClientHttpResponse implements ClientHttpResponse { public ReusableClientHttpResponse(ClientHttpResponse response) { try { - body = FileCopyUtils.copyToByteArray(response.getBody()); + final InputStream bodyStream = response.getBody(); + if (bodyStream != null) { + body = FileCopyUtils.copyToByteArray(bodyStream); + } statusCode = response.getStatusCode(); rawStatusCode = response.getRawStatusCode(); statusText = response.getStatusText(); @@ -156,7 +157,7 @@ public HttpHeaders getHeaders() { @Override public InputStream getBody() throws IOException { - return new ByteArrayInputStream(body); + return body != null ? new ByteArrayInputStream(body) : null; } @Override From 525797135e514c712b9c0cbf31802bd482c851dd Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 28 Aug 2014 13:07:12 +0200 Subject: [PATCH 0038/1191] extract readResource helper method --- src/test/java/com/gooddata/AbstractGoodDataIT.java | 9 +++++++++ .../gooddata/dataload/processes/ProcessServiceIT.java | 10 +++++----- src/test/java/com/gooddata/gdc/GdcServiceIT.java | 2 +- .../java/com/gooddata/project/ProjectServiceIT.java | 6 +++--- .../com/gooddata/warehouse/WarehouseServiceIT.java | 7 ------- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 742abed99..e520a204f 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -5,15 +5,20 @@ import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.codehaus.jackson.map.ObjectMapper; import org.junit.After; import org.junit.Before; +import static com.gooddata.Validate.notNull; import static net.jadler.Jadler.closeJadler; import static net.jadler.Jadler.initJadler; import static net.jadler.Jadler.port; +import java.io.InputStream; + public abstract class AbstractGoodDataIT { + protected static final ObjectMapper MAPPER = new ObjectMapper(); protected GoodData gd; @Before @@ -32,4 +37,8 @@ protected HttpClient createHttpClient(final String login, final String password, public void tearDown() { closeJadler(); } + + protected InputStream readResource(String path) { + return notNull(getClass().getResourceAsStream(path), "resource denote by path: " + path); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 71322aef1..8a966a2a4 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -41,8 +41,8 @@ public class ProcessServiceIT extends AbstractGoodDataIT { @Before public void setUp() throws Exception { - project = MAPPER.readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); - process = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + process = MAPPER.readValue(readResource("/dataload/processes/process.json"), Process.class); } @@ -52,7 +52,7 @@ public void shouldCreateProcess() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(PROCESSES_PATH) .respond() - .withBody(getClass().getResourceAsStream("/dataload/processes/process.json")) + .withBody(readResource("/dataload/processes/process.json")) .withStatus(201); File file = temporaryFolder.newFile("test.groovy"); @@ -75,7 +75,7 @@ public void shouldListProcesses() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESSES_PATH) .respond() - .withBody(getClass().getResourceAsStream("/dataload/processes/processes.json")) + .withBody(readResource("/dataload/processes/processes.json")) .withStatus(200); final Collection processes = gd.getProcessService().listProcesses(project); @@ -89,7 +89,7 @@ public void shouldGetProcess() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESS_PATH) .respond() - .withBody(getClass().getResourceAsStream("/dataload/processes/process.json")) + .withBody(readResource("/dataload/processes/process.json")) .withStatus(200); final Process process = gd.getProcessService().getProcessById(project, PROCESS_ID); diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index e6b91cd06..ee384fc30 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -16,7 +16,7 @@ public void shouldReturnGdc() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc") .respond() - .withBody(getClass().getResourceAsStream("/gdc/gdc.json")) + .withBody(readResource("/gdc/gdc.json")) .withStatus(200); final Gdc gdc = gd.getGdcService().getGdc(); diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 703af2405..fdd608382 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -24,9 +24,9 @@ public class ProjectServiceIT extends AbstractGoodDataIT { @Before public void setUp() throws Exception { - loading = MAPPER.readValue(getClass().getResourceAsStream("/project/project-loading.json"), Project.class); - enabled = MAPPER.readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); - deleted = MAPPER.readValue(getClass().getResourceAsStream("/project/project-deleted.json"), Project.class); + loading = MAPPER.readValue(readResource("/project/project-loading.json"), Project.class); + enabled = MAPPER.readValue(readResource("/project/project.json"), Project.class); + deleted = MAPPER.readValue(readResource("/project/project-deleted.json"), Project.class); } @Test diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index a88d572e4..998da0578 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -9,20 +9,17 @@ import static org.junit.Assert.assertThat; import com.gooddata.AbstractGoodDataIT; -import org.codehaus.jackson.map.ObjectMapper; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.junit.Before; import org.junit.Test; import java.io.IOException; -import java.io.InputStream; import java.util.Collection; public class WarehouseServiceIT extends AbstractGoodDataIT { - private static final ObjectMapper MAPPER = new ObjectMapper(); private static final String TITLE = "Test"; private static final String TASK_POLL = "/warehouse/warehouseTask-poll.json"; private static final String TASK_DONE = "/warehouse/warehouseTask-finished.json"; @@ -42,10 +39,6 @@ public void setUp() throws Exception { warehouse = MAPPER.readValue(readResource(WAREHOUSE), Warehouse.class); } - private InputStream readResource(String path) { - return getClass().getResourceAsStream(path); - } - @Test public void shouldCreateWarehouse() throws Exception { onRequest() From f6dd9c0b8a6c8a35e81fc29da42b0566f7ea2313 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 1 Sep 2014 15:36:13 +0200 Subject: [PATCH 0039/1191] introduce possibility to remove project --- .../com/gooddata/project/ProjectService.java | 14 ++++++++++ .../gooddata/project/ProjectServiceIT.java | 28 +++++++++++++++---- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 5e91d4b5c..3292bd11a 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -134,4 +134,18 @@ public Project getProjectById(String id) { notEmpty(id, "id"); return getProjectByUri(Project.PROJECT_TEMPLATE.expand(id).toString()); } + + /** + * Removes given project + * @param project project to be removed + * @throws com.gooddata.GoodDataException when project can't be deleted + */ + public void removeProject(final Project project) { + notNull(project, "project"); + try { + restTemplate.delete(project.getSelfLink()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to delete project " + project.getId(), e); + } + } } diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index fdd608382..b2bdc146d 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -1,5 +1,10 @@ package com.gooddata.project; +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.verifyThatRequest; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; @@ -8,15 +13,10 @@ import org.junit.Before; import org.junit.Test; -import static net.jadler.Jadler.onRequest; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; - public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final String PROJECT_URI = "/gdc/projects/123"; + private static final String PROJECT_URI = "/gdc/projects/PROJECT_ID"; private Project loading; private Project enabled; @@ -105,4 +105,20 @@ public void shouldFailWhenCantCreateProject() throws Exception { gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); } + @Test + public void shouldRemoveProject() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(PROJECT_URI) + .respond() + .withStatus(202); + + gd.getProjectService().removeProject(enabled); + + verifyThatRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(PROJECT_URI) + .receivedOnce(); + } + } \ No newline at end of file From 5a8519096843e85b035eb0aa8342bb95d02ac62a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 3 Sep 2014 10:56:06 +0200 Subject: [PATCH 0040/1191] use TEMPLATE constant consistently --- src/main/java/com/gooddata/project/Project.java | 6 +++--- src/main/java/com/gooddata/project/ProjectService.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index b2b1c5079..b3271e149 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -28,8 +28,8 @@ public class Project { public static final String PROJECTS_URI = "/gdc/account/profile/{id}/projects"; - public static final String PROJECT_URI = Projects.URI + "/{id}"; - public static final UriTemplate PROJECT_TEMPLATE = new UriTemplate(PROJECT_URI); + public static final String URI = Projects.URI + "/{id}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); private static final Set PREPARING_STATES = new HashSet<>(asList("PREPARING", "PREPARED", "LOADING")); @JsonProperty("content") @@ -65,7 +65,7 @@ public void setProjectTemplate(String uri) { @JsonIgnore public String getId() { - return PROJECT_TEMPLATE.match(getSelfLink()).get("id"); + return TEMPLATE.match(getSelfLink()).get("id"); } @JsonIgnore diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 3292bd11a..eeedef894 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -132,7 +132,7 @@ public Project getProjectByUri(final String uri) { */ public Project getProjectById(String id) { notEmpty(id, "id"); - return getProjectByUri(Project.PROJECT_TEMPLATE.expand(id).toString()); + return getProjectByUri(Project.TEMPLATE.expand(id).toString()); } /** From 0b39c4ec29ed4b1474703a0adb03ea109ac3e140 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 3 Sep 2014 13:30:17 +0200 Subject: [PATCH 0041/1191] add posibility to choose if the directory given should be included in zip --- src/main/java/com/gooddata/ZipUtils.java | 19 +++++++++++++++---- src/test/java/com/gooddata/ZipUtilsTest.java | 19 ++++++++++++++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/ZipUtils.java b/src/main/java/com/gooddata/ZipUtils.java index c9d8bf94a..efe0f9c61 100644 --- a/src/main/java/com/gooddata/ZipUtils.java +++ b/src/main/java/com/gooddata/ZipUtils.java @@ -19,21 +19,32 @@ public abstract class ZipUtils { /** * This method compresses the input file to zip format. If the given file is a directory, it recursively - * packs the directory into the output. + * packs the directory into the output. Not including give directory itself * * @param file file to be zipped * @param output stream where the output will be written */ public static void zip(File file, OutputStream output) throws IOException { + zip(file, output, false); + } + + /** + * This method compresses the input file to zip format. If the given file is a directory, it recursively + * packs the directory into the output. + * + * @param file file to be zipped + * @param output stream where the output will be written + * @param includeRoot if root dir should be included + */ + public static void zip(File file, OutputStream output, boolean includeRoot) throws IOException { notNull(file, "file"); notNull(output, "output"); try (ZipOutputStream zos = new ZipOutputStream(output)) { - final Path rootPath = file.getParentFile().toPath(); if (file.isDirectory()) { - zipDir(rootPath, file, zos); + zipDir(includeRoot ? file.getParentFile().toPath() : file.toPath(), file, zos); } else { - zipFile(rootPath, file, zos); + zipFile(file.getParentFile().toPath(), file, zos); } } diff --git a/src/test/java/com/gooddata/ZipUtilsTest.java b/src/test/java/com/gooddata/ZipUtilsTest.java index ee0dd3f21..ff6619645 100644 --- a/src/test/java/com/gooddata/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/ZipUtilsTest.java @@ -38,7 +38,7 @@ public void shouldZipDir() throws Exception { toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(toZipDir, output); + ZipUtils.zip(toZipDir, output, true); output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); @@ -47,4 +47,21 @@ public void shouldZipDir() throws Exception { } } } + + @Test + public void shouldZipDirWithoutRoot() throws Exception { + File toZipDir = temporaryFolder.newFolder("toZip"); + File toZipFile = toZipDir.toPath().resolve("a/b/someFile.zip").toFile(); + toZipFile.getParentFile().mkdirs(); + toZipFile.createNewFile(); + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + ZipUtils.zip(toZipDir, output); + output.close(); + try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { + ZipEntry entry = zipInputStream.getNextEntry(); + assertNotNull(entry); + assertEquals("a/b/someFile.zip", entry.getName()); + } + } + } } \ No newline at end of file From 130bca6d74d30d5538b0bfebc0732a074accc05f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 9 Jun 2014 00:47:06 +0200 Subject: [PATCH 0042/1191] add no null elements array validation --- src/main/java/com/gooddata/Validate.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/com/gooddata/Validate.java b/src/main/java/com/gooddata/Validate.java index 60562823d..8a313f69c 100644 --- a/src/main/java/com/gooddata/Validate.java +++ b/src/main/java/com/gooddata/Validate.java @@ -59,4 +59,14 @@ public static T noNullElements(T collection, String argum return collection; } + public static T[] noNullElements(T[] array, String argument) { + notNull(array, argument); + for (int i = 0; i Date: Mon, 9 Jun 2014 00:54:05 +0200 Subject: [PATCH 0043/1191] add utility method for translating md obj array to uri array --- src/main/java/com/gooddata/md/Obj.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index f6423acda..87904cfe8 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -7,6 +7,8 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.springframework.web.util.UriTemplate; +import static com.gooddata.Validate.noNullElements; + /** * Metadata object (common part) */ @@ -87,4 +89,19 @@ public Integer getUnlisted() { return meta.getUnlisted(); } + /** + * Get list of URIs of the given {@link Obj}s + * @param objs metadata objects + * @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 Date: Mon, 9 Jun 2014 00:54:57 +0200 Subject: [PATCH 0044/1191] add report public constructor with report definition vararg --- src/main/java/com/gooddata/md/report/Report.java | 9 +++++++-- src/test/java/com/gooddata/Example.java | 2 +- src/test/java/com/gooddata/md/report/ReportTest.java | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 3eb92e402..e7da0753b 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -36,9 +36,14 @@ private Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content this.content = content; } - public Report(String title, String definition, String domain) { + /* Just for serialization test */ + Report(String title, String domain, String... definitions) { super(new Meta(title)); - content = new Content(asList(definition), asList(domain)); + content = new Content(asList(definitions), asList(domain)); + } + + public Report(String title, ReportDefinition... definitions) { + this(title, null, uris(definitions)); } @JsonIgnore diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index bae67dc05..387f0d2c8 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -65,7 +65,7 @@ public static void main(String... args) { asList(new GridElement(m.getUri(), "Age Sum")) ); definition = md.createObj(project, definition); - final Report report = md.createObj(project, new Report(definition.getTitle(), definition.getUri(), null)); + final Report report = md.createObj(project, new Report(definition.getTitle(), definition)); final DatasetService datasetService = gd.getDatasetService(); final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index dd5573517..215fbd1aa 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -32,7 +32,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { - final Report report = new Report("Beers Consumed This Week", DEFINITION, DOMAIN); + final Report report = new Report("Beers Consumed This Week", DOMAIN, DEFINITION); assertThat(report, serializesToJson("/md/report/report-input.json")); } From fbd755596491ae9fc6f9a5bf4c8eb7020083b3f4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 9 Jun 2014 01:05:20 +0200 Subject: [PATCH 0045/1191] change method name returning a single result to getObjUri --- README.md | 2 +- src/main/java/com/gooddata/md/MetadataService.java | 2 +- src/test/java/com/gooddata/Example.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ed9438964..a4290b1aa 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ Query, create and update project metadata - attributes, facts, metrics, reports, ```java MetadataService md = gd.getMetadataService(); -String factUri = md.findObjUri(project, Fact.class, Restriction.title("myfact")); +String factUri = md.getObjUri(project, Fact.class, Restriction.title("myfact")); Metric m = md.createObj(project, new Metric("My Sum", "SELECT SUM([" + factUri + "])", "#,##0")); diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index c60f1ceb5..7b330979d 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -121,7 +121,7 @@ public T getObjById(Project project, String id, Class cls) { * @throws com.gooddata.md.ObjNotFoundException if metadata object not found * @throws com.gooddata.md.NonUniqueObjException if more than one object corresponds to search restrictions */ - public String findObjUri(Project project, Class cls, Restriction... restrictions) { + public String getObjUri(Project project, Class cls, Restriction... restrictions) { final Collection results = findUris(project, cls, restrictions); if (results == null || results.isEmpty()) { throw new ObjNotFoundException(cls); diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 387f0d2c8..a29ac4b5c 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -52,8 +52,8 @@ public static void main(String... args) { final MetadataService md = gd.getMetadataService(); - final String factUri = md.findObjUri(project, Fact.class, Restriction.title("Person Age")); - final String attrUri = md.findObjUri(project, Attribute.class, Restriction.title("Department")); + final String factUri = md.getObjUri(project, Fact.class, Restriction.title("Person Age")); + final String attrUri = md.getObjUri(project, Attribute.class, Restriction.title("Department")); final Attribute attr = md.getObjByUri(attrUri, Attribute.class); final Metric m = md.createObj(project, new Metric("Age Sum", "SELECT SUM([" + factUri + "])", "#,##0")); From aad7e76db4673a316daa3896b92fce01ade9d888 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 9 Jun 2014 01:16:18 +0200 Subject: [PATCH 0046/1191] refactor Obj as interface --- .../java/com/gooddata/md/AbstractObj.java | 103 +++++++++++++++++ src/main/java/com/gooddata/md/Attribute.java | 2 +- .../java/com/gooddata/md/DisplayForm.java | 2 +- src/main/java/com/gooddata/md/Fact.java | 2 +- src/main/java/com/gooddata/md/Metric.java | 2 +- src/main/java/com/gooddata/md/Obj.java | 104 +----------------- src/main/java/com/gooddata/md/Queryable.java | 2 +- .../java/com/gooddata/md/report/Report.java | 4 +- .../gooddata/md/report/ReportDefinition.java | 4 +- src/test/java/com/gooddata/md/ObjTest.java | 4 +- 10 files changed, 120 insertions(+), 109 deletions(-) create mode 100644 src/main/java/com/gooddata/md/AbstractObj.java diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java new file mode 100644 index 000000000..f5eb2bfc1 --- /dev/null +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -0,0 +1,103 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonProperty; + +import static com.gooddata.Validate.noNullElements; + +/** + * Metadata object (common part) + */ +public abstract class AbstractObj implements Obj { + + @JsonProperty("meta") + protected final Meta meta; + + protected AbstractObj(@JsonProperty("meta") Meta meta) { + this.meta = meta; + } + + @JsonIgnore + public String getAuthor() { + return meta.getAuthor(); + } + + @JsonIgnore + public String getContributor() { + return meta.getContributor(); + } + + @JsonIgnore + public String getCreated() { + return meta.getCreated(); + } + + @JsonIgnore + public String getSummary() { + return meta.getSummary(); + } + + @JsonIgnore + public String getTitle() { + return meta.getTitle(); + } + + @JsonIgnore + public String getUpdated() { + return meta.getUpdated(); + } + + @JsonIgnore + public String getCategory() { + return meta.getCategory(); + } + + @JsonIgnore + public String getTags() { + return meta.getTags(); + } + + @JsonIgnore + public String getUri() { + return meta.getUri(); + } + + @JsonIgnore + public String getDeprecated() { + return meta.getDeprecated(); + } + + @JsonIgnore + public String getIdentifier() { + return meta.getIdentifier(); + } + + @JsonIgnore + public Integer getLocked() { + return meta.getLocked(); + } + + @JsonIgnore + public Integer getUnlisted() { + return meta.getUnlisted(); + } + + /** + * Get list of URIs of the given {@link Obj}s + * @param objs metadata objects + * @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 String[] uris(T... objs) { - noNullElements(objs, "objs"); - final String[] uris = new String[objs.length]; - for (int i=0; i Date: Mon, 9 Jun 2014 01:17:29 +0200 Subject: [PATCH 0047/1191] add getObj() method returning Obj instance by restrictions --- .../java/com/gooddata/md/MetadataService.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 7b330979d..a46056907 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -131,6 +131,27 @@ public String getObjUri(Project project, Class cls, Res return results.iterator().next(); } + /** + * Get metadata object by restrictions like identifier, title or summary. + * + * @param project project where to search for the object + * @param cls class of the resulting object + * @param restrictions query restrictions + * @param type of the object to be returned + * @return metadata object + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.md.NonUniqueObjException if more than one object corresponds to search restrictions + */ + public T getObj(Project project, Class cls, Restriction... restrictions) { + final Collection results = findUris(project, cls, restrictions); + if (results == null || results.isEmpty()) { + throw new ObjNotFoundException(cls); + } else if (results.size() != 1) { + throw new NonUniqueObjException(cls, results); + } + return getObjByUri(results.iterator().next(), cls); + } + /** * Find metadata by restrictions like identifier, title or summary. * From 6ded483ee6840f06a4493e3cd31ffd1d86cca811 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 9 Jun 2014 19:03:50 +0200 Subject: [PATCH 0048/1191] add: Attribute.getDefaultDisplayForm() --- src/main/java/com/gooddata/md/Attribute.java | 5 +++++ src/test/java/com/gooddata/md/AttributeTest.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index 8165f4639..c3f0c7320 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -55,6 +55,11 @@ public Collection getForeignKeys() { return content.getFk(); } + @JsonIgnore + public DisplayForm getDefaultDisplayForm() { + return getDisplayForms().iterator().next(); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content { diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index c52e781c9..7437e55af 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -34,6 +34,13 @@ public void shouldDeserialize() throws Exception { assertThat(displayForm.getExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]")); assertThat(displayForm.getLdmExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]")); + final DisplayForm defaultDisplayForm = attribute.getDefaultDisplayForm(); + assertThat(defaultDisplayForm, is(notNullValue())); + + assertThat(defaultDisplayForm.getFormOf(), is("/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID")); + assertThat(defaultDisplayForm.getExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]")); + assertThat(defaultDisplayForm.getLdmExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]")); + final Collection primaryKeys = attribute.getPrimaryKeys(); assertThat(primaryKeys, is(Matchers.notNullValue())); assertThat(primaryKeys, hasSize(1)); From 9b4da7fb7094225723e4208b538aab871e861445 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 4 Sep 2014 17:06:15 +0200 Subject: [PATCH 0049/1191] update readme --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index a4290b1aa..70774cd0d 100644 --- a/README.md +++ b/README.md @@ -53,6 +53,9 @@ Query, create and update project metadata - attributes, facts, metrics, reports, MetadataService md = gd.getMetadataService(); String factUri = md.getObjUri(project, Fact.class, Restriction.title("myfact")); +Metric m = new Metric("my sum", "SELECT SUM([" + factUri + "])", "#,##0"); +Metric metric = md.createObj(project, m); +Attribute attr = md.getObj(project, Attribute.class, Restriction.title("myattr")); Metric m = md.createObj(project, new Metric("My Sum", "SELECT SUM([" + factUri + "])", "#,##0")); From 54f498dea2438cd1af85c8ee0a8767036c6d23de Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Sep 2014 13:33:03 +0200 Subject: [PATCH 0050/1191] [maven-release-plugin] prepare release gooddata-java-0.9.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7e46f83fe..0171a9e4c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.8.1-SNAPSHOT + 0.9.0 ${project.artifactId} GoodData Java SDK From 915bf27c416cc08dc1ed1e17b8e1bf7c41d29689 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Sep 2014 13:33:03 +0200 Subject: [PATCH 0051/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0171a9e4c..1ee1881ad 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.9.0 + 0.9.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 8bb42fa50b5845b0517b1aab4c13d0276078050a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Sep 2014 13:37:47 +0200 Subject: [PATCH 0052/1191] update version to 0.9.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae41d452d..c5278aa80 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.8.0 + 0.9.0 ``` From ec852b244ba7d67108c6d1d1348f1203e2063ebe Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Sep 2014 14:17:51 +0200 Subject: [PATCH 0053/1191] update readme --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c5278aa80..416000db3 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,10 @@ [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) +The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. +The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 +and currently the SDK is transitioned to be an official GoodData project. + ## Usage The *GoodData Java SDK* is available in Maven Central Repository, to use it from Maven add to `pom.xml`: @@ -105,18 +109,16 @@ WarehouseService warehouseService = gd.getWarehouseService(); Warehouse warehouse = warehouseService.createWarehouse(new Warehouse("title", "authToken", "description")); String jdbc = warehouse.getJdbcConnectionString(); -warehouse.setTitle("another Title"); -warehouse = warehouseService.updateWarehouse(warehouse); - Collection warehouseList = warehouseService.listInstances(); warehouseService.removeWarehouse(warehouse); ``` ### Dataload processes API -Manage dataload processes - create, update, list, delete, and process executions - execute, get logs, ... +Manage dataload processes - create, update, list, delete, and process executions - execute, get logs,... ```java ProcessService processService = gd.getProcessService(); -Process process = processService.createProcess(project, new Process('name', 'GRAPH'), new File('path/to/processdatadir')).get(); +Process process = processService.createProcess(project, new Process("name", "GRAPH"), new File("path/to/processdatadir")).get(); + ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten"); ``` From cd546853ebcb748f5c5e34439903e10099ead115 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Sep 2014 15:04:23 +0200 Subject: [PATCH 0054/1191] add gooddata constructor with port and make constructor with protocol pacakge protected close: #47 --- src/main/java/com/gooddata/GoodData.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 1b39448dc..9087a7cc5 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -86,6 +86,18 @@ public GoodData(String hostname, String login, String password) { this(hostname, login, password, PORT, PROTOCOL); } + /** + * Create instance configured to communicate with GoodData Platform running on given host and port using given user's + * credentials. + * + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param login GoodData user's login + * @param password GoodData user's password + */ + public GoodData(String hostname, String login, String password, int port) { + this(hostname, login, password, port, PROTOCOL); + } + /** * Create instance configured to communicate with GoodData Platform running on given host, port and protocol using @@ -97,7 +109,7 @@ public GoodData(String hostname, String login, String password) { * @param port GoodData Platform's API port (e.g. 443) * @param protocol GoodData Platform's API protocol (e.g. https) */ - public GoodData(String hostname, String login, String password, int port, String protocol) { + GoodData(String hostname, String login, String password, int port, String protocol) { notEmpty(hostname, "hostname"); notEmpty(login, "login"); notEmpty(password, "password"); From 2aa984ecb2c81ce1ce596622c8afb2f2f5ba54b3 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 21 Aug 2014 09:55:51 +0200 Subject: [PATCH 0055/1191] introduce contribution guide --- CONTRIBUTE.md | 33 +++++++++++++++++++++++++++++++++ README.md | 5 +++++ 2 files changed, 38 insertions(+) create mode 100644 CONTRIBUTE.md diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md new file mode 100644 index 000000000..4ee02edac --- /dev/null +++ b/CONTRIBUTE.md @@ -0,0 +1,33 @@ +# GoodData Java SDK - Contribution guide + +Below are few rules, recommendations and best practices, we try to follow when developing GoodData Java SDK. + +## Design + +### Structure +* Create packages for API parts containing dtos and services related to API part. +* Don't create single implementation interfaces for services. + +### DTOs +* All DTOs which can be updated should be mutable. Please keep mutable only the fields which are subject of change, the rest should be immutable. +* Create method named `String getUri()` to provide link to self. +* introduce constants +```java +public static final String URI = "/gdc/someresource/{resource-id}"; +public static final UriTemplate TEMPLATE = new UriTemplate(URI); +``` +* Consider the visibility - use _package protected_ when dto is not intended for SDK user use, but is needed in related service. + +### Services +* When programming client for some polling return [FutureResult](src/main/java/com/gooddata/FutureResult.java) to enable user asynchronous call. +* Create custom [GoodDataException](src/main/java/com/gooddata/GoodDataException.java) when you feel the case is specific enough. +* Prefer dtos as arguments instead of Strings or primitives. +* methods prefered naming: + * `get*()` (i.e. `get(Project project)` or `getByUri(String uri)`) instead of `find*()` + * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` + +## Best practices +* test all DTOs using [json-unit](https://github.com/lukas-krecan/JsonUnit) +* write integration tests for services using [jadler](https://github.com/jadler-mocking/jadler/wiki) +* javadoc everything public +* when you need some utility code, look for handy utilities in used libraries first (i.e. spring has its StreamUtils, FileCopyUtils, ...), then when you decide to create new utility class, do it using _abstract utility class pattern_ diff --git a/README.md b/README.md index c39eb567d..6f4d8a84f 100644 --- a/README.md +++ b/README.md @@ -117,3 +117,8 @@ Process process = processService.createProcess(project, new Process('name', 'GRA ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten"); ``` + +##Contribute +Missing functionality? Found a BUG? + +Please create us an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTE.md). From 873f62fe01a33ccd07bdd5b33ad78ab154647239 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 23 Sep 2014 00:42:23 +0200 Subject: [PATCH 0056/1191] update readme and example --- README.md | 19 ++++++------ src/test/java/com/gooddata/Example.java | 40 ++++++++++++++++++------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 416000db3..77575fc3e 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ Create and update the project model, execute MAQL DDL,... ```java ModelService modelService = gd.getModelService(); -ModelDiff diff = modelService.getProjectModelDiff(project, new InputStreamReader(getClass().getResourceAsStream("/model.json"))).get(); +ModelDiff diff = modelService.getProjectModelDiff(project, + new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); modelService.updateProjectModel(project, diff); modelService.updateProjectModel(project, "MAQL DDL EXPRESSION"); @@ -56,21 +57,19 @@ Query, create and update project metadata - attributes, facts, metrics, reports, ```java MetadataService md = gd.getMetadataService(); -String factUri = md.getObjUri(project, Fact.class, Restriction.title("myfact")); -Metric m = new Metric("my sum", "SELECT SUM([" + factUri + "])", "#,##0"); -Metric metric = md.createObj(project, m); -Attribute attr = md.getObj(project, Attribute.class, Restriction.title("myattr")); +String fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); +Metric m = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); -Metric m = md.createObj(project, new Metric("My Sum", "SELECT SUM([" + factUri + "])", "#,##0")); +Attribute attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); ReportDefinition definition = GridReportDefinitionContent.create( - "my report", + "Department avg shoe size", asList("metricGroup"), - asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_DISPLAY_FORM_ID")), - asList(new GridElement(m.getUri(), "My Sum")) + asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), + asList(new GridElement(m.getUri(), "Avg shoe size")) ); definition = md.createObj(project, definition); -Report report = md.createObj(project, new Report(definition.getTitle(), definition.getUri(), null)); +Report report = md.createObj(project, new Report(definition.getTitle(), definition)); ``` ### Dataset API diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index a29ac4b5c..ca3b290f5 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -7,11 +7,11 @@ import com.gooddata.account.AccountService; import com.gooddata.dataset.DatasetManifest; import com.gooddata.dataset.DatasetService; +import com.gooddata.gdc.DataStoreService; import com.gooddata.md.Attribute; import com.gooddata.md.Fact; import com.gooddata.md.MetadataService; import com.gooddata.md.Metric; -import com.gooddata.md.Restriction; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; @@ -24,57 +24,77 @@ import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collection; +import static com.gooddata.md.Restriction.identifier; import static java.util.Arrays.asList; public class Example { - public static void main(String... args) { + public static void main(String... args) throws FileNotFoundException { final GoodData gd = new GoodData("roman@gooddata.com", "Roman1"); + final AccountService accountService = gd.getAccountService(); final Account current = accountService.getCurrent(); System.out.println(current.getId()); + final ProjectService projectService = gd.getProjectService(); + final Collection projects = projectService.getProjects(); System.out.println(projects); final Project project = projectService.createProject(new Project("sparkling3", "pgroup2")).get(); System.out.println(project.getSelfLink()); + final ModelService modelService = gd.getModelService(); + final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, new InputStreamReader(Example.class.getResourceAsStream("/person.json"))).get(); modelService.updateProjectModel(project, projectModelDiff); + final MetadataService md = gd.getMetadataService(); - final String factUri = md.getObjUri(project, Fact.class, Restriction.title("Person Age")); - final String attrUri = md.getObjUri(project, Attribute.class, Restriction.title("Department")); - final Attribute attr = md.getObjByUri(attrUri, Attribute.class); + String fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); + Metric m = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); - final Metric m = md.createObj(project, new Metric("Age Sum", "SELECT SUM([" + factUri + "])", "#,##0")); + Attribute attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); ReportDefinition definition = GridReportDefinitionContent.create( - "my report", + "Department avg shoe size", asList("metricGroup"), - asList(new AttributeInGrid(attr.getDisplayForms().iterator().next().getUri())), - asList(new GridElement(m.getUri(), "Age Sum")) + asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), + asList(new GridElement(m.getUri(), "Avg shoe size")) ); definition = md.createObj(project, definition); - final Report report = md.createObj(project, new Report(definition.getTitle(), definition)); + Report report = md.createObj(project, new Report(definition.getTitle(), definition)); + final DatasetService datasetService = gd.getDatasetService(); + final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); datasetService.loadDataset(project, manifest, Example.class.getResourceAsStream("/person.csv")).get(); + final ReportService reportService = gd.getReportService(); + final String exportUri = reportService.exportReport(definition, ReportExportFormat.CSV); System.out.println(exportUri); + + DataStoreService dataStoreService = gd.getDataStoreService(); + + dataStoreService.upload("/dir/file.txt", new FileInputStream("file.txt")); + InputStream stream = dataStoreService.download("/dir/file.txt"); + dataStoreService.delete("/dir/file.txt"); + gd.logout(); } From e24fba3720ce6dd29a356867af82c933f30da2e8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Sep 2014 00:11:59 +0200 Subject: [PATCH 0057/1191] fix README - Warehouse and Processes example --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 77575fc3e..ccdfac9ae 100644 --- a/README.md +++ b/README.md @@ -105,10 +105,10 @@ dataStoreService.delete("/dir/file.txt"); Manage warehouses - create, update, list and delete. ```java WarehouseService warehouseService = gd.getWarehouseService(); -Warehouse warehouse = warehouseService.createWarehouse(new Warehouse("title", "authToken", "description")); +Warehouse warehouse = warehouseService.createWarehouse(new Warehouse("title", "authToken", "description")).get(); String jdbc = warehouse.getJdbcConnectionString(); -Collection warehouseList = warehouseService.listInstances(); +Collection warehouseList = warehouseService.listWarehouses(); warehouseService.removeWarehouse(warehouse); ``` @@ -116,8 +116,8 @@ warehouseService.removeWarehouse(warehouse); Manage dataload processes - create, update, list, delete, and process executions - execute, get logs,... ```java ProcessService processService = gd.getProcessService(); -Process process = processService.createProcess(project, new Process("name", "GRAPH"), new File("path/to/processdatadir")).get(); +Process process = processService.createProcess(project, new Process("name", "GRAPH"), new File("path/to/processdatadir")); ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); -processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten"); +processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten")); ``` From 7951d379b974968dd2f39340e3a0ed0590dd2c9f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 5 Oct 2014 21:49:12 +0200 Subject: [PATCH 0058/1191] add polling to ReportService.exportReport() close: #46 --- README.md | 2 +- .../com/gooddata/report/ReportException.java | 16 ++++++ .../com/gooddata/report/ReportService.java | 40 +++++++++------ src/test/java/com/gooddata/Example.java | 4 +- .../com/gooddata/report/ReportServiceIT.java | 49 +++++++++++++++++++ 5 files changed, 93 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/gooddata/report/ReportException.java create mode 100644 src/test/java/com/gooddata/report/ReportServiceIT.java diff --git a/README.md b/README.md index ccdfac9ae..bdf7677eb 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ Execute and export reports. ```java ReportService reportService = gd.getReportService(); -String imgUri = reportService.exportReport(reportDef, ReportExportFormat.PNG); +reportService.exportReport(definition, PNG, new FileOutputStream("report.png")); ``` ### DataStore API diff --git a/src/main/java/com/gooddata/report/ReportException.java b/src/main/java/com/gooddata/report/ReportException.java new file mode 100644 index 000000000..8fd9b827d --- /dev/null +++ b/src/main/java/com/gooddata/report/ReportException.java @@ -0,0 +1,16 @@ +package com.gooddata.report; + +import com.gooddata.GoodDataException; + +/** + * Exception during report export + */ +public class ReportException extends GoodDataException { + public ReportException(String message) { + super(message); + } + + public ReportException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 90514095c..0b67059a9 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -4,7 +4,9 @@ package com.gooddata.report; import com.gooddata.AbstractService; +import com.gooddata.FutureResult; import com.gooddata.GoodDataException; +import com.gooddata.PollHandler; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import org.codehaus.jackson.JsonNode; @@ -12,8 +14,6 @@ import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.FileCopyUtils; -import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -36,22 +36,32 @@ public ReportService(final RestTemplate restTemplate) { super(restTemplate); } - public String exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format) { + public FutureResult exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format, + final OutputStream output) { + notNull(output, "output"); notNull(reportDefinition, "reportDefinition"); notNull(format, "format"); final JsonNode execResult = executeReport(reportDefinition.getUri()); - return exportReport(execResult, format); - } - - public void exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format, - final OutputStream output) { - notNull(output, "output"); - final String uri = exportReport(reportDefinition, format); - try { - restTemplate.execute(uri, GET, noopRequestCallback, new OutputStreamResponseExtractor(output)); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to export report", e); - } + final String uri = exportReport(execResult, format); + return new FutureResult<>(this, new PollHandler(uri, Void.class) { + @Override + protected boolean isFinished(ClientHttpResponse response) throws IOException { + switch (response.getStatusCode()) { + case OK: return true; + case ACCEPTED: return false; + case NO_CONTENT: throw new ReportException("Report contains no data"); + default: throw new ReportException("Unable to export report, unknown HTTP response code: " + response.getStatusCode()); + } + } + @Override + protected void onFinish() { + try { + restTemplate.execute(uri, GET, noopRequestCallback, new OutputStreamResponseExtractor(output)); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to export report", e); + } + } + }); } private JsonNode executeReport(final String reportDefinitionUri) { diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index ca3b290f5..ae3372d69 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -26,6 +26,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Collection; @@ -85,8 +86,7 @@ public static void main(String... args) throws FileNotFoundException { final ReportService reportService = gd.getReportService(); - final String exportUri = reportService.exportReport(definition, ReportExportFormat.CSV); - System.out.println(exportUri); + reportService.exportReport(definition, ReportExportFormat.CSV, new FileOutputStream("report.csv")); DataStoreService dataStoreService = gd.getDataStoreService(); diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java new file mode 100644 index 000000000..0b42ff3d2 --- /dev/null +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -0,0 +1,49 @@ +package com.gooddata.report; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.gdc.UriResponse; +import com.gooddata.md.report.ReportDefinition; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; + +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class ReportServiceIT extends AbstractGoodDataIT { + + private static final String URI = ReportService.EXPORTING_URI + "/123"; + private static final String RESPONSE = "abc"; + + @Test + public void shouldExportReport() throws Exception { + onRequest() + .havingPathEqualTo(ReportRequest.URI) + .havingMethodEqualTo("POST") + .respond() + .withBody("{}"); + onRequest() + .havingPathEqualTo(ReportService.EXPORTING_URI) + .havingMethodEqualTo("POST") + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new UriResponse("http://localhost:" + port() + URI))); + onRequest() + .havingPathEqualTo(URI) + .havingMethodEqualTo("GET") + .respond() + .withStatus(202) + .thenRespond() + .withStatus(200) + .withBody(RESPONSE) + ; + + final ReportDefinition rd = MAPPER.readValue(readResource("/md/report/gridReportDefinition.json"), ReportDefinition.class); + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); + assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); + } +} \ No newline at end of file From a9e8f0acb915a5ccfac870338bf4ef6a8fbe9bce Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 5 Oct 2014 22:11:58 +0200 Subject: [PATCH 0059/1191] use hamcrest asserts --- src/test/java/com/gooddata/ZipUtilsTest.java | 18 ++++++++++-------- .../java/com/gooddata/account/AccountTest.java | 2 +- .../processes/ProcessExecutionDetailTest.java | 11 ++++++----- .../processes/ProcessExecutionTaskTest.java | 2 +- .../processes/ProcessExecutionTest.java | 2 +- .../dataload/processes/ProcessServiceIT.java | 10 +++++----- .../dataload/processes/ProcessTest.java | 2 +- .../dataload/processes/ProcessesTest.java | 2 +- .../gooddata/dataset/DatasetManifestTest.java | 2 +- .../com/gooddata/dataset/DatasetsTest.java | 2 +- .../com/gooddata/dataset/FailStatusTest.java | 2 +- .../gooddata/dataset/PullTaskStatusTest.java | 2 +- .../com/gooddata/dataset/PullTaskTest.java | 2 +- .../java/com/gooddata/dataset/PullTest.java | 2 +- .../java/com/gooddata/gdc/AsyncTaskTest.java | 5 +++-- .../java/com/gooddata/gdc/GdcServiceIT.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 2 +- .../java/com/gooddata/gdc/LinkEntriesTest.java | 2 +- .../java/com/gooddata/gdc/UriResponseTest.java | 3 +-- .../gooddata/md/AttributeDisplayFormTest.java | 2 +- .../java/com/gooddata/md/AttributeTest.java | 2 +- .../java/com/gooddata/md/DisplayFormTest.java | 2 +- src/test/java/com/gooddata/md/EntryTest.java | 3 +-- .../java/com/gooddata/md/ExpressionTest.java | 2 +- src/test/java/com/gooddata/md/FactTest.java | 3 +-- src/test/java/com/gooddata/md/KeyTest.java | 2 +- src/test/java/com/gooddata/md/MetaTest.java | 2 +- .../com/gooddata/md/MetadataServiceTest.java | 2 +- src/test/java/com/gooddata/md/MetricTest.java | 2 +- src/test/java/com/gooddata/md/ObjTest.java | 2 +- src/test/java/com/gooddata/md/QueryTest.java | 2 +- .../md/report/AttributeInGridTest.java | 2 +- .../gooddata/md/report/GridElementTest.java | 2 +- .../GridReportDefinitionContentTest.java | 2 +- .../java/com/gooddata/md/report/GridTest.java | 2 +- .../OneNumberReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionTest.java | 2 +- .../com/gooddata/md/report/ReportTest.java | 2 +- .../com/gooddata/model/DiffRequestTest.java | 5 +++-- .../com/gooddata/model/MaqlDdlLinksTest.java | 2 +- .../gooddata/model/MaqlDdlTaskStatusTest.java | 11 +++++------ .../java/com/gooddata/model/MaqlDdlTest.java | 7 ++++--- .../com/gooddata/project/ProjectServiceIT.java | 2 +- .../java/com/gooddata/project/ProjectTest.java | 2 +- .../com/gooddata/report/ReportRequestTest.java | 2 +- .../com/gooddata/report/ReportServiceIT.java | 2 +- .../gooddata/warehouse/WarehouseServiceIT.java | 12 ++++++------ .../gooddata/warehouse/WarehouseTaskTest.java | 2 +- .../com/gooddata/warehouse/WarehouseTest.java | 3 +-- .../com/gooddata/warehouse/WarehousesTest.java | 5 +++-- 51 files changed, 87 insertions(+), 85 deletions(-) diff --git a/src/test/java/com/gooddata/ZipUtilsTest.java b/src/test/java/com/gooddata/ZipUtilsTest.java index ff6619645..adb21f025 100644 --- a/src/test/java/com/gooddata/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/ZipUtilsTest.java @@ -1,7 +1,5 @@ package com.gooddata; -import static org.junit.Assert.*; - import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; @@ -12,6 +10,10 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + public class ZipUtilsTest { @Rule @@ -25,8 +27,8 @@ public void shouldZipSingleFile() throws Exception { output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); - assertNotNull(entry); - assertEquals("someFile.zip", entry.getName()); + assertThat(entry, notNullValue()); + assertThat(entry.getName(), is("someFile.zip")); } } } @@ -42,8 +44,8 @@ public void shouldZipDir() throws Exception { output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); - assertNotNull(entry); - assertEquals("toZip/a/b/someFile.zip", entry.getName()); + assertThat(entry, notNullValue()); + assertThat(entry.getName(), is("toZip/a/b/someFile.zip")); } } } @@ -59,8 +61,8 @@ public void shouldZipDirWithoutRoot() throws Exception { output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); - assertNotNull(entry); - assertEquals("a/b/someFile.zip", entry.getName()); + assertThat(entry, notNullValue()); + assertThat(entry.getName(), is("a/b/someFile.zip")); } } } diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 0c9049559..472845d02 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -6,7 +6,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class AccountTest { diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 1978c78ea..7326c109b 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,11 +1,12 @@ package com.gooddata.dataload.processes; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; - import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.Is.is; + public class ProcessExecutionDetailTest { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -14,13 +15,13 @@ public class ProcessExecutionDetailTest { public void testDeserialization() throws Exception { final ProcessExecutionDetail executionDetail = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/executionDetail.json"), ProcessExecutionDetail.class); - assertNotNull(executionDetail); + assertThat(executionDetail, notNullValue()); assertThat(executionDetail.getStatus(), is("ERROR")); assertThat(executionDetail.getCreated(), is("2014-02-24T19:00:35.999Z")); assertThat(executionDetail.getStarted(), is("2014-02-24T19:00:39.155Z")); assertThat(executionDetail.getUpdated(), is("2014-02-24T19:26:13.197Z")); assertThat(executionDetail.getFinished(), is("2014-02-24T19:26:13.060Z")); - assertNotNull(executionDetail.getError()); + assertThat(executionDetail.getError(), notNullValue()); assertThat(executionDetail.getError().getErrorCode(), is("executor.error")); assertThat(executionDetail.getError().getFormattedMessage(), is("Error message with some placeholders for parameters - like this one.")); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index 3069fc484..b21d8ec29 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index f420006f5..a57e4ab7d 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; import static com.gooddata.JsonMatchers.serializesToJson; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 8a966a2a4..4313b0ab4 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -3,10 +3,10 @@ import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.verifyThatRequest; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.gooddata.AbstractGoodDataIT; import com.gooddata.FutureResult; @@ -57,7 +57,7 @@ public void shouldCreateProcess() throws Exception { File file = temporaryFolder.newFile("test.groovy"); final Process process = gd.getProcessService().createProcess(project, new Process("testProcess", "GROOVY"), file); - assertNotNull(process); + assertThat(process, notNullValue()); assertThat(process.getExecutables(), hasSize(1)); assertThat(process.getExecutables().iterator().next(), is("test.groovy")); @@ -79,7 +79,7 @@ public void shouldListProcesses() throws Exception { .withStatus(200); final Collection processes = gd.getProcessService().listProcesses(project); - assertNotNull(processes); + assertThat(processes, notNullValue()); assertThat(processes, hasSize(1)); } @@ -93,7 +93,7 @@ public void shouldGetProcess() throws Exception { .withStatus(200); final Process process = gd.getProcessService().getProcessById(project, PROCESS_ID); - assertNotNull(process); + assertThat(process, notNullValue()); assertThat(process.getName(), is("testProcess")); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java index 24ac29e6a..4c3aeab5b 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java @@ -4,7 +4,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java index 11cc0d617..f4348221c 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java @@ -3,7 +3,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 526c80bec..4fd68e4d3 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -13,7 +13,7 @@ import static java.util.Collections.singletonMap; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class DatasetManifestTest { diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index 6db471e6d..39bbc8a8b 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -9,7 +9,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class DatasetsTest { @Test diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index f0589bb16..efb2f56b5 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class FailStatusTest { diff --git a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java index f5a2f3e47..9c56039bb 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java @@ -6,7 +6,7 @@ import java.io.InputStream; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class PullTaskStatusTest { diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index ae4ec7c88..38a493772 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -6,7 +6,7 @@ import java.io.InputStream; import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class PullTaskTest { diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java index eaa0d7bf5..88ed9b0ba 100644 --- a/src/test/java/com/gooddata/dataset/PullTest.java +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -3,7 +3,7 @@ import org.junit.Test; import static com.gooddata.JsonMatchers.serializesToJson; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class PullTest { diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index 7abb362b0..a7ff7eea8 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -8,7 +8,8 @@ import java.io.InputStream; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; public class AsyncTaskTest { @@ -17,6 +18,6 @@ public void testDeserialization() throws Exception { final InputStream is = getClass().getResourceAsStream("/gdc/asyncTask.json"); final AsyncTask asyncTask = new ObjectMapper().readValue(is, AsyncTask.class); - assertEquals("POLL-URI", asyncTask.getUri()); + assertThat(asyncTask.getUri(), is("POLL-URI")); } } diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index ee384fc30..f2c9ee878 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -6,7 +6,7 @@ import static net.jadler.Jadler.onRequest; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class GdcServiceIT extends AbstractGoodDataIT { diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 8596e3604..2509253a9 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -7,7 +7,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class GdcTest { diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index 89494ffa9..0f910efca 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -11,7 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class LinkEntriesTest { diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index df5f89854..4c29af464 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -4,7 +4,6 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Assert; import org.junit.Test; import java.io.InputStream; @@ -27,6 +26,6 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { - Assert.assertThat(new UriResponse("URI"), serializesToJson("/gdc/uriResponse.json")); + assertThat(new UriResponse("URI"), serializesToJson("/gdc/uriResponse.json")); } } \ 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 8f9fab9a6..b1978bc90 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -8,7 +8,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class AttributeDisplayFormTest { diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 7437e55af..0ee383fde 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -11,7 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class AttributeTest { diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index 9c1319a1e..dcb65dcfd 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -11,7 +11,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class DisplayFormTest { diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 71dec8bf8..60b813fe8 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -4,7 +4,6 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Assert; import org.junit.Test; import static com.gooddata.JsonMatchers.serializesToJson; @@ -52,7 +51,7 @@ public void testSerialization() throws Exception { final Entry entry = new Entry(LINK, TITLE, SUMMARY, CATEGORY, AUTHOR, CONTRIBUTOR, DEPRECATED, IDENTIFIER, TAGS, CREATED, UPDATED, LOCKED, UNLISTED); - Assert.assertThat(entry, serializesToJson("/md/entry.json")); + assertThat(entry, serializesToJson("/md/entry.json")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index f8bcaab6b..da5f142ec 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ExpressionTest { diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index b8a99fb60..5f63a033d 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -4,7 +4,6 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Assert; import org.junit.Test; import static com.gooddata.JsonMatchers.serializesToJson; @@ -26,7 +25,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col"); - Assert.assertThat(fact, serializesToJson("/md/fact-input.json")); + assertThat(fact, serializesToJson("/md/fact-input.json")); } } \ 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 ebe2a68b4..40930a20b 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class KeyTest { diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index a9d0f367e..5d71dd02e 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -9,7 +9,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class MetaTest { diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index b92e04d19..3546225bb 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -17,7 +17,7 @@ import static java.lang.String.format; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 05261cdbe..4eb0cfcb1 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -9,7 +9,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class MetricTest { diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 59a75ac75..0f8b4b644 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -12,7 +12,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ObjTest { diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index 78815f264..68f49b5da 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class QueryTest { diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 4af78055a..f0db2352d 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -16,7 +16,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.isOneOf; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class AttributeInGridTest { diff --git a/src/test/java/com/gooddata/md/report/GridElementTest.java b/src/test/java/com/gooddata/md/report/GridElementTest.java index 5c6f348fd..f52580b08 100644 --- a/src/test/java/com/gooddata/md/report/GridElementTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementTest.java @@ -11,7 +11,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class GridElementTest { diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index 4abc361aa..9165d2ec5 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -12,7 +12,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class GridReportDefinitionContentTest { diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index d289d6692..b5ff94ae4 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -17,7 +17,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class GridTest { diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 0ce9cf555..ed0d692f8 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -12,7 +12,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class OneNumberReportDefinitionContentTest { diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index e698a2972..31157e099 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -12,7 +12,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ReportDefinitionContentTest { diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 6ce1ff6dd..6c9233786 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -12,7 +12,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ReportDefinitionTest { diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 215fbd1aa..86c78e026 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -10,7 +10,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ReportTest { diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index a0991bb4d..04337fdba 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -6,7 +6,8 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; public class DiffRequestTest { @@ -15,6 +16,6 @@ public class DiffRequestTest { @Test public void testSerialization() throws Exception { String valueAsString = mapper.writeValueAsString(new DiffRequest("{\"projectModel\":\"xxx\"}")); - assertEquals("{\"diffRequest\":{\"targetModel\":{\"projectModel\":\"xxx\"}}}", valueAsString); + assertThat(valueAsString, is("{\"diffRequest\":{\"targetModel\":{\"projectModel\":\"xxx\"}}}")); } } diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index 0b5db4c9a..c7b239ccc 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -10,7 +10,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class MaqlDdlLinksTest { diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index 2e26b46b0..e78b0b0d1 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -9,8 +9,7 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class MaqlDdlTaskStatusTest { @@ -19,15 +18,15 @@ public class MaqlDdlTaskStatusTest { @Test public void testDeser() throws Exception { final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), MaqlDdlTaskStatus.class); - assertEquals("OK", status.getStatus()); - assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getPollUri()); + assertThat(status.getStatus(), is("OK")); + assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); } @Test public void testDeserMessages() throws Exception { final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), MaqlDdlTaskStatus.class); - assertEquals("ERROR", status.getStatus()); - assertEquals("/gdc/md/PROJECT_ID/tasks/TASK_ID/status", status.getPollUri()); + assertThat(status.getStatus(), is("ERROR")); + assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); assertThat(status.getMessages(), hasSize(1)); final GdcError error = status.getMessages().iterator().next(); assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index 814aca162..bfc51f551 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -6,14 +6,15 @@ import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; -import static org.junit.Assert.assertEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; public class MaqlDdlTest { @Test public void testSerialization() throws Exception { - assertEquals("{\"manage\":{\"maql\":\"maqlddl\"}}", - new ObjectMapper().writeValueAsString(new MaqlDdl("maqlddl"))); + assertThat(new ObjectMapper().writeValueAsString(new MaqlDdl("maqlddl")), + is("{\"manage\":{\"maql\":\"maqlddl\"}}")); } } diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index b2bdc146d..72f4c4c69 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -3,7 +3,7 @@ import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.verifyThatRequest; import static org.hamcrest.Matchers.*; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 3658bd9ef..447fef682 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ProjectTest { diff --git a/src/test/java/com/gooddata/report/ReportRequestTest.java b/src/test/java/com/gooddata/report/ReportRequestTest.java index 73ecb69cc..f7bf25ba6 100644 --- a/src/test/java/com/gooddata/report/ReportRequestTest.java +++ b/src/test/java/com/gooddata/report/ReportRequestTest.java @@ -6,7 +6,7 @@ import com.gooddata.JsonMatchers; import org.junit.Test; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ReportRequestTest { diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 0b42ff3d2..d90611c71 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -11,7 +11,7 @@ import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; import static org.hamcrest.Matchers.is; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; public class ReportServiceIT extends AbstractGoodDataIT { diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 998da0578..991aaa9a9 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -3,10 +3,10 @@ import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; import static net.jadler.Jadler.verifyThatRequest; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import com.gooddata.AbstractGoodDataIT; import org.hamcrest.BaseMatcher; @@ -63,7 +63,7 @@ public void shouldCreateWarehouse() throws Exception { .withStatus(200); final Warehouse created = gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); - assertNotNull(created); + assertThat(created, notNullValue()); assertThat(created.getTitle(), is(TITLE)); assertThat(created.getJdbcConnectionString(), is("jdbc:dss://localhost:" + port() + WAREHOUSE_URI)); } @@ -78,7 +78,7 @@ public void shouldListWarehouses() throws Exception { .withStatus(200); final Collection list = gd.getWarehouseService().listWarehouses(); - assertNotNull(list); + assertThat(list, notNullValue()); assertThat(list, hasSize(2)); } @@ -108,7 +108,7 @@ public void shouldGetWarehouse() throws Exception { .withStatus(200); final Warehouse warehouse = gd.getWarehouseService().getWarehouseById(WAREHOUSE_ID); - assertNotNull(warehouse); + assertThat(warehouse, notNullValue()); assertThat(warehouse.getTitle(), is(TITLE)); } @@ -133,7 +133,7 @@ public void shouldUpdateWarehouse() throws Exception { .withStatus(200); final Warehouse updated = gd.getWarehouseService().updateWarehouse(toUpdate); - assertNotNull(updated); + assertThat(updated, notNullValue()); assertThat(updated.getTitle(), is(updatedTitle)); verifyThatRequest() diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 6d397f7aa..9af0cc9ca 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -1,7 +1,7 @@ package com.gooddata.warehouse; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 6b1ebee7f..e088ca3ff 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -3,8 +3,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; +import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index 6715eaa40..96f848ac2 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -1,8 +1,9 @@ package com.gooddata.warehouse; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.*; +import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; import org.junit.Test; @@ -16,7 +17,7 @@ public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouses.json"); final Warehouses warehouses = new ObjectMapper().readValue(stream, Warehouses.class); - assertNotNull(warehouses.getItems()); + assertThat(warehouses.getItems(), notNullValue()); assertThat(warehouses.getItems(), hasSize(2)); assertThat(warehouses.getItems().get(0).getTitle(), is("Storage")); } From 38d367263183d45ffc02a4c827e8905df3220482 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 5 Oct 2014 22:20:10 +0200 Subject: [PATCH 0060/1191] remove pointless verifications --- .../dataload/processes/ProcessServiceIT.java | 54 ++++++---------- .../gooddata/project/ProjectServiceIT.java | 15 ++--- .../warehouse/WarehouseServiceIT.java | 61 +++++-------------- 3 files changed, 40 insertions(+), 90 deletions(-) diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 4313b0ab4..53c6203c8 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -1,13 +1,5 @@ package com.gooddata.dataload.processes; -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.verifyThatRequest; -import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.MatcherAssert.assertThat; - import com.gooddata.AbstractGoodDataIT; import com.gooddata.FutureResult; import com.gooddata.project.Project; @@ -21,6 +13,13 @@ import java.io.File; import java.util.Collection; +import static net.jadler.Jadler.onRequest; +import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; public class ProcessServiceIT extends AbstractGoodDataIT { @@ -51,22 +50,14 @@ public void shouldCreateProcess() throws Exception { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(PROCESSES_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/process.json")) .withStatus(201); File file = temporaryFolder.newFile("test.groovy"); final Process process = gd.getProcessService().createProcess(project, new Process("testProcess", "GROOVY"), file); assertThat(process, notNullValue()); - assertThat(process.getExecutables(), hasSize(1)); - assertThat(process.getExecutables().iterator().next(), is("test.groovy")); - - // TODO jadler misses possibility to verify multipart -// verifyThatRequest() -// .havingMethodEqualTo("POST") -// .havingPathEqualTo(Processes.URI) -// .receivedOnce(); - + assertThat(process.getExecutables(), contains("test.groovy")); } @Test @@ -74,7 +65,7 @@ public void shouldListProcesses() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESSES_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/processes.json")) .withStatus(200); @@ -88,7 +79,7 @@ public void shouldGetProcess() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESS_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/process.json")) .withStatus(200); @@ -102,15 +93,10 @@ public void shouldRemoveProcess() throws Exception { onRequest() .havingMethodEqualTo("DELETE") .havingPathEqualTo(PROCESS_PATH) - .respond() + .respond() .withStatus(204); gd.getProcessService().removeProcess(process); - - verifyThatRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(PROCESS_PATH) - .receivedOnce(); } @Test @@ -121,13 +107,13 @@ public void shouldGetProcessSource() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESS_SOURCE_PATH) - .respond() + .respond() .withHeader("Location", processDownloadLink) .withStatus(303); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(processDownloadLink) - .respond() + .respond() .withBody(processSource) .withStatus(200); @@ -144,7 +130,7 @@ public void shouldGetExecutionLog() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(logDownloadLink) - .respond() + .respond() .withBody(log) .withStatus(200); @@ -160,7 +146,7 @@ public void shouldExecuteProcess() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_DETAIL_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/executionDetail-success.json")) .withStatus(200); @@ -176,7 +162,7 @@ public void shouldThrowOnExecuteProcessError() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_DETAIL_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/executionDetail.json")) .withStatus(200); @@ -187,16 +173,16 @@ private void mockExecutionRequests() { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(EXECUTIONS_PATH) - .respond() + .respond() .withBody(readResource("/dataload/processes/executionTask.json")) .withHeader("Location", EXECUTION_PATH) .withStatus(201); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_PATH) - .respond() + .respond() .withStatus(202) - .thenRespond() + .thenRespond() .withStatus(204); } } diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 72f4c4c69..62a47d196 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -1,10 +1,5 @@ package com.gooddata.project; -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.verifyThatRequest; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.MatcherAssert.assertThat; - import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; @@ -13,6 +8,11 @@ import org.junit.Before; import org.junit.Test; +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -114,11 +114,6 @@ public void shouldRemoveProject() throws Exception { .withStatus(202); gd.getProjectService().removeProject(enabled); - - verifyThatRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(PROJECT_URI) - .receivedOnce(); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 991aaa9a9..5300b7923 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,22 +1,18 @@ package com.gooddata.warehouse; -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.port; -import static net.jadler.Jadler.verifyThatRequest; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.MatcherAssert.assertThat; - import com.gooddata.AbstractGoodDataIT; -import org.hamcrest.BaseMatcher; -import org.hamcrest.Description; import org.junit.Before; import org.junit.Test; -import java.io.IOException; import java.util.Collection; +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; + public class WarehouseServiceIT extends AbstractGoodDataIT { @@ -44,13 +40,13 @@ public void shouldCreateWarehouse() throws Exception { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(Warehouses.URI) - .respond() + .respond() .withBody(readResource(TASK_POLL)) .withStatus(202); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(pollingTask.getPollLink()) - .respond() + .respond() .withStatus(202) .thenRespond() .withBody(readResource(TASK_DONE)) @@ -58,7 +54,7 @@ public void shouldCreateWarehouse() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(finishedTask.getWarehouseLink()) - .respond() + .respond() .withBody(readResource(WAREHOUSE)) .withStatus(200); @@ -73,7 +69,7 @@ public void shouldListWarehouses() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(Warehouses.URI) - .respond() + .respond() .withBody(readResource("/warehouse/warehouses.json")) .withStatus(200); @@ -87,15 +83,10 @@ public void shouldRemoveWarehouse() throws Exception { onRequest() .havingMethodEqualTo("DELETE") .havingPathEqualTo(WAREHOUSE_URI) - .respond() + .respond() .withStatus(204); gd.getWarehouseService().removeWarehouse(warehouse); - - verifyThatRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(WAREHOUSE_URI) - .receivedOnce(); } @Test @@ -103,7 +94,7 @@ public void shouldGetWarehouse() throws Exception { onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .respond() .withBody(readResource(WAREHOUSE)) .withStatus(200); @@ -123,39 +114,17 @@ public void shouldUpdateWarehouse() throws Exception { onRequest() .havingMethodEqualTo("PUT") .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .respond() .withStatus(204); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .respond() .withBody(MAPPER.writeValueAsString(toUpdate)) .withStatus(200); final Warehouse updated = gd.getWarehouseService().updateWarehouse(toUpdate); assertThat(updated, notNullValue()); assertThat(updated.getTitle(), is(updatedTitle)); - - verifyThatRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(warehouse.getSelfLink()) - .havingBody(new BaseMatcher() { - @Override - public boolean matches(Object o) { - try { - Warehouse instance = MAPPER.readValue((String) o, Warehouse.class); - return updatedTitle.equals(instance.getTitle()); - } catch (IOException e) { - return false; - } - } - - - @Override - public void describeTo(Description description) { - description.appendText("Warehouse not changed"); - } - }) - .receivedOnce(); } } From f39f14075f618e4a72cba6bd019a52baba3410d9 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 5 Oct 2014 23:34:03 +0200 Subject: [PATCH 0061/1191] replace junit with testng --- pom.xml | 14 +++++-- .../java/com/gooddata/AbstractGoodDataIT.java | 16 ++++---- src/test/java/com/gooddata/ZipUtilsTest.java | 39 +++++++++++++------ .../com/gooddata/account/AccountTest.java | 2 +- .../processes/ProcessExecutionDetailTest.java | 2 +- .../processes/ProcessExecutionTaskTest.java | 2 +- .../processes/ProcessExecutionTest.java | 2 +- .../dataload/processes/ProcessServiceIT.java | 17 ++++---- .../dataload/processes/ProcessTest.java | 2 +- .../dataload/processes/ProcessesTest.java | 2 +- .../gooddata/dataset/DatasetManifestTest.java | 2 +- .../com/gooddata/dataset/DatasetsTest.java | 2 +- .../com/gooddata/dataset/FailStatusTest.java | 2 +- .../gooddata/dataset/PullTaskStatusTest.java | 2 +- .../com/gooddata/dataset/PullTaskTest.java | 2 +- .../java/com/gooddata/dataset/PullTest.java | 2 +- .../java/com/gooddata/gdc/AsyncTaskTest.java | 2 +- .../com/gooddata/gdc/ErrorStructureTest.java | 2 +- .../java/com/gooddata/gdc/GdcErrorTest.java | 2 +- .../java/com/gooddata/gdc/GdcServiceIT.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 2 +- .../com/gooddata/gdc/LinkEntriesTest.java | 2 +- .../com/gooddata/gdc/UriResponseTest.java | 2 +- .../gooddata/md/AttributeDisplayFormTest.java | 2 +- .../java/com/gooddata/md/AttributeTest.java | 2 +- .../java/com/gooddata/md/DisplayFormTest.java | 2 +- src/test/java/com/gooddata/md/EntryTest.java | 2 +- .../java/com/gooddata/md/ExpressionTest.java | 2 +- src/test/java/com/gooddata/md/FactTest.java | 2 +- src/test/java/com/gooddata/md/KeyTest.java | 2 +- src/test/java/com/gooddata/md/MetaTest.java | 2 +- .../com/gooddata/md/MetadataServiceTest.java | 24 ++++++------ src/test/java/com/gooddata/md/MetricTest.java | 2 +- src/test/java/com/gooddata/md/ObjTest.java | 2 +- src/test/java/com/gooddata/md/QueryTest.java | 2 +- .../java/com/gooddata/md/RestrictionTest.java | 2 +- .../md/report/AttributeInGridTest.java | 2 +- .../gooddata/md/report/GridElementTest.java | 2 +- .../GridReportDefinitionContentTest.java | 2 +- .../java/com/gooddata/md/report/GridTest.java | 2 +- .../OneNumberReportDefinitionContentTest.java | 2 +- .../report/ReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionTest.java | 2 +- .../com/gooddata/md/report/ReportTest.java | 2 +- .../com/gooddata/model/DiffRequestTest.java | 2 +- .../com/gooddata/model/MaqlDdlLinksTest.java | 2 +- .../gooddata/model/MaqlDdlTaskStatusTest.java | 2 +- .../java/com/gooddata/model/MaqlDdlTest.java | 2 +- .../com/gooddata/model/ModelDiffTest.java | 2 +- .../gooddata/project/ProjectServiceIT.java | 12 +++--- .../com/gooddata/project/ProjectTest.java | 2 +- .../gooddata/report/ReportRequestTest.java | 2 +- .../com/gooddata/report/ReportServiceIT.java | 2 +- .../warehouse/WarehouseServiceIT.java | 6 +-- .../gooddata/warehouse/WarehouseTaskTest.java | 2 +- .../com/gooddata/warehouse/WarehouseTest.java | 2 +- .../gooddata/warehouse/WarehousesTest.java | 2 +- 57 files changed, 122 insertions(+), 106 deletions(-) diff --git a/pom.xml b/pom.xml index 1ee1881ad..45a0d738c 100644 --- a/pom.xml +++ b/pom.xml @@ -156,17 +156,23 @@ - junit - junit - 4.8.1 + org.testng + testng + 6.8.8 test org.mockito - mockito-all + mockito-core 1.9.5 test + + org.hamcrest + hamcrest-core + 1.3 + test + org.hamcrest hamcrest-library diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index e520a204f..d9684ccb3 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -6,22 +6,20 @@ import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.After; -import org.junit.Before; - -import static com.gooddata.Validate.notNull; -import static net.jadler.Jadler.closeJadler; -import static net.jadler.Jadler.initJadler; -import static net.jadler.Jadler.port; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; import java.io.InputStream; +import static com.gooddata.Validate.notNull; +import static net.jadler.Jadler.*; + public abstract class AbstractGoodDataIT { protected static final ObjectMapper MAPPER = new ObjectMapper(); protected GoodData gd; - @Before + @BeforeMethod public void commonSetUp() { initJadler().that().respondsWithDefaultContentType("application/json"); gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http") { @@ -33,7 +31,7 @@ protected HttpClient createHttpClient(final String login, final String password, }; } - @After + @AfterMethod public void tearDown() { closeJadler(); } diff --git a/src/test/java/com/gooddata/ZipUtilsTest.java b/src/test/java/com/gooddata/ZipUtilsTest.java index adb21f025..e9b5591f7 100644 --- a/src/test/java/com/gooddata/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/ZipUtilsTest.java @@ -1,12 +1,15 @@ package com.gooddata; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.apache.commons.io.FileUtils; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -16,12 +19,22 @@ public class ZipUtilsTest { - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); + private Path temporaryFolder; + + @BeforeClass + public void setUp() throws Exception { + temporaryFolder = Files.createTempDirectory("zip"); + } + + @AfterClass + public void tearDown() throws Exception { + FileUtils.deleteQuietly(temporaryFolder.toFile()); + } @Test public void shouldZipSingleFile() throws Exception { - final File file = temporaryFolder.newFile("someFile.zip"); + final File file = temporaryFolder.resolve("someFile.zip").toFile(); + file.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(file, output); output.close(); @@ -35,12 +48,13 @@ public void shouldZipSingleFile() throws Exception { @Test public void shouldZipDir() throws Exception { - File toZipDir = temporaryFolder.newFolder("toZip"); - File toZipFile = toZipDir.toPath().resolve("a/b/someFile.zip").toFile(); + Path toZipDir = temporaryFolder.resolve("toZip"); + toZipDir.toFile().mkdirs(); + File toZipFile = toZipDir.resolve("a/b/someFile.zip").toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(toZipDir, output, true); + ZipUtils.zip(toZipDir.toFile(), output, true); output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); @@ -52,12 +66,13 @@ public void shouldZipDir() throws Exception { @Test public void shouldZipDirWithoutRoot() throws Exception { - File toZipDir = temporaryFolder.newFolder("toZip"); - File toZipFile = toZipDir.toPath().resolve("a/b/someFile.zip").toFile(); + Path toZipDir = temporaryFolder.resolve("toZip"); + toZipDir.toFile().mkdirs(); + File toZipFile = toZipDir.resolve("a/b/someFile.zip").toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(toZipDir, output); + ZipUtils.zip(toZipDir.toFile(), output); output.close(); try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { ZipEntry entry = zipInputStream.getNextEntry(); diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 472845d02..905fad64c 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -1,7 +1,7 @@ package com.gooddata.account; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 7326c109b..1974590c4 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index b21d8ec29..c1f854526 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -4,7 +4,7 @@ import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; public class ProcessExecutionTaskTest { diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index a57e4ab7d..ef1988f95 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -4,7 +4,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 53c6203c8..492ec4d05 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -4,10 +4,8 @@ import com.gooddata.FutureResult; import com.gooddata.project.Project; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import java.io.ByteArrayOutputStream; import java.io.File; @@ -34,15 +32,15 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private Project project; - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); private Process process; - @Before + private File file; + + @BeforeClass public void setUp() throws Exception { project = MAPPER.readValue(readResource("/project/project.json"), Project.class); process = MAPPER.readValue(readResource("/dataload/processes/process.json"), Process.class); - + file = File.createTempFile("test", ".groovy"); } @Test @@ -54,7 +52,6 @@ public void shouldCreateProcess() throws Exception { .withBody(readResource("/dataload/processes/process.json")) .withStatus(201); - File file = temporaryFolder.newFile("test.groovy"); final Process process = gd.getProcessService().createProcess(project, new Process("testProcess", "GROOVY"), file); assertThat(process, notNullValue()); assertThat(process.getExecutables(), contains("test.groovy")); @@ -156,7 +153,7 @@ public void shouldExecuteProcess() throws Exception { assertJsonEquals(MAPPER.readValue(readResource("/dataload/processes/executionDetail-success.json"), ProcessExecutionDetail.class), executionDetail); } - @Test(expected = ProcessExecutionException.class) + @Test(expectedExceptions = ProcessExecutionException.class) public void shouldThrowOnExecuteProcessError() throws Exception { mockExecutionRequests(); onRequest() diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java index 4c3aeab5b..b90a90770 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessTest.java @@ -7,7 +7,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; public class ProcessTest { diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java index f4348221c..e47b980b7 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java @@ -6,7 +6,7 @@ import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; public class ProcessesTest { diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 4fd68e4d3..1936de50c 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -4,7 +4,7 @@ package com.gooddata.dataset; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index 39bbc8a8b..ce5b5e100 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataset; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collection; diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index efb2f56b5..24a326322 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -2,7 +2,7 @@ import com.gooddata.gdc.ErrorStructure; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java index 9c56039bb..9a4dfc15a 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataset; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index 38a493772..e9bf7d021 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataset; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java index 88ed9b0ba..4ebce51bf 100644 --- a/src/test/java/com/gooddata/dataset/PullTest.java +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index a7ff7eea8..3ddf31524 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -4,7 +4,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index ca6b71cce..7e11cc274 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -1,7 +1,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java index 620875829..6acdf4b24 100644 --- a/src/test/java/com/gooddata/gdc/GdcErrorTest.java +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -4,7 +4,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index f2c9ee878..fc46baf5e 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -1,7 +1,7 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; -import org.junit.Test; +import org.testng.annotations.Test; import static net.jadler.Jadler.onRequest; import static org.hamcrest.Matchers.is; diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 2509253a9..9784452b4 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -1,7 +1,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index 0f910efca..dc0dda0c3 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -4,7 +4,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index 4c29af464..fda26115a 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -4,7 +4,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index b1978bc90..4f7ed76eb 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -1,7 +1,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 0ee383fde..16fa22e38 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -2,7 +2,7 @@ import org.codehaus.jackson.map.ObjectMapper; import org.hamcrest.Matchers; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collection; diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index dcb65dcfd..d065b5ebf 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 60b813fe8..40e65a130 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index da5f142ec..1fc90352b 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index 5f63a033d..5df9141a4 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/KeyTest.java b/src/test/java/com/gooddata/md/KeyTest.java index 40930a20b..26d4e4d57 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 5d71dd02e..4566e72d4 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 3546225bb..bfcd4d34c 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -6,8 +6,8 @@ import com.gooddata.GoodDataRestException; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; -import org.junit.Before; -import org.junit.Test; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; @@ -34,20 +34,20 @@ public class MetadataServiceTest { private MetadataService service; - @Before + @BeforeMethod public void setUp() throws Exception { MockitoAnnotations.initMocks(this); service = new MetadataService(restTemplate); when(project.getId()).thenReturn(PROJECT_ID); } - @Test(expected = ObjCreateException.class) + @Test(expectedExceptions = ObjCreateException.class) public void testCreateObjNullResponse() throws Exception { final Obj obj = mock(Obj.class); service.createObj(project, obj); } - @Test(expected = ObjCreateException.class) + @Test(expectedExceptions = ObjCreateException.class) @SuppressWarnings("unchecked") public void testCreateObjGDRestException() throws Exception { final Obj obj = mock(Obj.class); @@ -56,7 +56,7 @@ public void testCreateObjGDRestException() throws Exception { service.createObj(project, obj); } - @Test(expected = ObjCreateException.class) + @Test(expectedExceptions = ObjCreateException.class) public void testCreateObjRestClientException() throws Exception { final Obj obj = mock(Obj.class); when(restTemplate.postForObject(Obj.URI, obj, UriResponse.class, PROJECT_ID)) @@ -78,17 +78,17 @@ public void testCreateObj() throws Exception { assertThat(result, is(notNullValue())); } - @Test(expected = IllegalArgumentException.class) + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByUriNullUri() throws Exception { service.getObjByUri(null, Obj.class); } - @Test(expected = IllegalArgumentException.class) + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByUriNullCls() throws Exception { service.getObjByUri(URI, null); } - @Test(expected = ObjNotFoundException.class) + @Test(expectedExceptions = ObjNotFoundException.class) public void testGetObjByUriNotFound() throws Exception { final GoodDataRestException restException = mock(GoodDataRestException.class); when(restException.getStatusCode()).thenReturn(HttpStatus.NOT_FOUND.value()); @@ -106,17 +106,17 @@ public void testGetObjByUri() throws Exception { assertThat(result, is(resultObj)); } - @Test(expected = IllegalArgumentException.class) + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByIdNullProject() throws Exception { service.getObjById(null, ID, Obj.class); } - @Test(expected = IllegalArgumentException.class) + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByIdNullId() throws Exception { service.getObjById(project, null, Obj.class); } - @Test(expected = IllegalArgumentException.class) + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByIdNullCls() throws Exception { service.getObjById(project, ID, null); } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 4eb0cfcb1..1add67f48 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 0f8b4b644..f5d018393 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -5,7 +5,7 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index 68f49b5da..81b5f92ac 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -4,7 +4,7 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/com/gooddata/md/RestrictionTest.java b/src/test/java/com/gooddata/md/RestrictionTest.java index dc3a0eb96..5a993b7e6 100644 --- a/src/test/java/com/gooddata/md/RestrictionTest.java +++ b/src/test/java/com/gooddata/md/RestrictionTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index f0db2352d..14e52558f 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collection; diff --git a/src/test/java/com/gooddata/md/report/GridElementTest.java b/src/test/java/com/gooddata/md/report/GridElementTest.java index f52580b08..21e48edfc 100644 --- a/src/test/java/com/gooddata/md/report/GridElementTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index 9165d2ec5..6460225f0 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collections; diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index b5ff94ae4..edc0e9399 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.util.Collection; import java.util.Collections; diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index ed0d692f8..337a6dbb2 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collections; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index 31157e099..a0cceca06 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collections; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 6c9233786..e2fcdbb1c 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collections; diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 86c78e026..97d48b914 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -4,7 +4,7 @@ package com.gooddata.md.report; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index 04337fdba..9967f48c9 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -4,7 +4,7 @@ package com.gooddata.model; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index c7b239ccc..f1a53ba9e 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -4,7 +4,7 @@ package com.gooddata.model; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index e78b0b0d1..216343e30 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -5,7 +5,7 @@ import com.gooddata.gdc.GdcError; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index bfc51f551..e50565c31 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -4,7 +4,7 @@ package com.gooddata.model; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 14e5539b2..4ba47af5f 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -4,7 +4,7 @@ package com.gooddata.model; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; import java.util.Collections; diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 62a47d196..04bf79811 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -5,8 +5,8 @@ import com.gooddata.GoodDataRestException; import com.gooddata.gdc.UriResponse; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Before; -import org.junit.Test; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; @@ -22,7 +22,7 @@ public class ProjectServiceIT extends AbstractGoodDataIT { private Project enabled; private Project deleted; - @Before + @BeforeClass public void setUp() throws Exception { loading = MAPPER.readValue(readResource("/project/project-loading.json"), Project.class); enabled = MAPPER.readValue(readResource("/project/project.json"), Project.class); @@ -54,7 +54,7 @@ public void shouldCreateProject() throws Exception { assertThat(project.getTitle(), is("TITLE")); } - @Test(expected = GoodDataException.class) + @Test(expectedExceptions = GoodDataException.class) public void shouldFailWhenPostFails() throws Exception { onRequest() .havingMethodEqualTo("POST") @@ -65,7 +65,7 @@ public void shouldFailWhenPostFails() throws Exception { gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); } - @Test(expected = GoodDataRestException.class) // todo previous method returns GoodDataException + @Test(expectedExceptions = GoodDataRestException.class) // todo previous method returns GoodDataException public void shouldFailWhenPollFails() throws Exception { onRequest() .havingMethodEqualTo("POST") @@ -85,7 +85,7 @@ public void shouldFailWhenPollFails() throws Exception { } - @Test(expected = GoodDataException.class) + @Test(expectedExceptions = GoodDataException.class) public void shouldFailWhenCantCreateProject() throws Exception { onRequest() .havingMethodEqualTo("POST") diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 447fef682..433154520 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,7 +1,7 @@ package com.gooddata.project; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; diff --git a/src/test/java/com/gooddata/report/ReportRequestTest.java b/src/test/java/com/gooddata/report/ReportRequestTest.java index f7bf25ba6..ac9f88a2a 100644 --- a/src/test/java/com/gooddata/report/ReportRequestTest.java +++ b/src/test/java/com/gooddata/report/ReportRequestTest.java @@ -4,7 +4,7 @@ package com.gooddata.report; import com.gooddata.JsonMatchers; -import org.junit.Test; +import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index d90611c71..390e684b3 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -3,7 +3,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.ByteArrayOutputStream; import java.nio.charset.StandardCharsets; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 5300b7923..496f6d7a5 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,8 +1,8 @@ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataIT; -import org.junit.Before; -import org.junit.Test; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; import java.util.Collection; @@ -28,7 +28,7 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { private WarehouseTask finishedTask; private Warehouse warehouse; - @Before + @BeforeClass public void setUp() throws Exception { pollingTask = MAPPER.readValue(readResource(TASK_POLL), WarehouseTask.class); finishedTask = MAPPER.readValue(readResource(TASK_DONE), WarehouseTask.class); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 9af0cc9ca..1abe45473 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -4,7 +4,7 @@ import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index e088ca3ff..404e07c47 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -6,7 +6,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index 96f848ac2..7deb80a30 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -6,7 +6,7 @@ import static org.hamcrest.MatcherAssert.*; import org.codehaus.jackson.map.ObjectMapper; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.InputStream; From 0d65fa4c8cb48f9912dc1f0ea90de0455f4b961e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 5 Oct 2014 23:40:23 +0200 Subject: [PATCH 0062/1191] fix some findbugs warnings - make a constant final - make an inner class static - return copy of array --- src/main/java/com/gooddata/AbstractService.java | 4 ++-- src/main/java/com/gooddata/gdc/ErrorStructure.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 97a87a4b1..a5136eddc 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -30,7 +30,7 @@ */ public abstract class AbstractService { - public static Integer WAIT_BEFORE_RETRY_IN_MILLIS = 5 * 1000; + public static final Integer WAIT_BEFORE_RETRY_IN_MILLIS = 5 * 1000; protected final RestTemplate restTemplate; @@ -108,7 +108,7 @@ protected final T extractData(ClientHttpResponse response, Class cls) thr return new HttpMessageConverterExtractor<>(cls, restTemplate.getMessageConverters()).extractData(response); } - private class ReusableClientHttpResponse implements ClientHttpResponse { + private static class ReusableClientHttpResponse implements ClientHttpResponse { private byte[] body; private final HttpStatus statusCode; diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 7f3b2a7f6..0cc33199a 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -6,6 +6,7 @@ import org.codehaus.jackson.annotate.JsonProperty; import static com.gooddata.Validate.notNull; +import static java.util.Arrays.copyOf; /** * Error structure (for embedding). @@ -42,7 +43,7 @@ public String getMessage() { } public String[] getParameters() { - return parameters; + return parameters == null ? null : copyOf(parameters, parameters.length); } public String getComponent() { From 5f5e09487e6e6d4c15b6291a9b212eafe3d43943 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Sep 2014 02:26:32 +0200 Subject: [PATCH 0063/1191] make PollHandler an interface - introduce SimplePollHadler for services having same poll and final result - introduce AbstractPollHandler and AbstractPollHandlerBase classes for services which need more poll customizations - removed ugly instanceof operator in former PollHandler class --- .../com/gooddata/AbstractPollHandler.java | 40 +++++++++ .../com/gooddata/AbstractPollHandlerBase.java | 69 +++++++++++++++ src/main/java/com/gooddata/PollHandler.java | 84 ++----------------- .../java/com/gooddata/SimplePollHandler.java | 27 ++++++ .../dataload/processes/ProcessService.java | 12 +-- .../com/gooddata/dataset/DatasetService.java | 4 +- .../java/com/gooddata/model/ModelService.java | 6 +- .../com/gooddata/project/ProjectService.java | 4 +- .../com/gooddata/report/ReportService.java | 5 +- .../gooddata/warehouse/WarehouseService.java | 8 +- 10 files changed, 162 insertions(+), 97 deletions(-) create mode 100644 src/main/java/com/gooddata/AbstractPollHandler.java create mode 100644 src/main/java/com/gooddata/AbstractPollHandlerBase.java create mode 100644 src/main/java/com/gooddata/SimplePollHandler.java diff --git a/src/main/java/com/gooddata/AbstractPollHandler.java b/src/main/java/com/gooddata/AbstractPollHandler.java new file mode 100644 index 000000000..ed82185b3 --- /dev/null +++ b/src/main/java/com/gooddata/AbstractPollHandler.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import org.springframework.http.client.ClientHttpResponse; + +import static com.gooddata.Validate.notNull; + +/** + * For internal usage by services employing polling.

+ * Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and + * may override {@link #onFinish()} and {@link #handlePollResult(Object)} methods. + * + * @param

polling type + * @param result type + * + * @see com.gooddata.FutureResult + */ +public abstract class AbstractPollHandler extends AbstractPollHandlerBase { + + private final String pollingUri; + + /** + * Creates a new instance of polling handler + * @param pollingUri URI for polling + * @param pollClass class of the polling object (or {@link Void}) + * @param resultClass class of the result (or {@link Void}) + */ + public AbstractPollHandler(final String pollingUri, final Class

pollClass, Class resultClass) { + super(pollClass, resultClass); + this.pollingUri = notNull(pollingUri, "pollingUri"); + } + + @Override + public final String getPollingUri() { + return pollingUri; + } + +} diff --git a/src/main/java/com/gooddata/AbstractPollHandlerBase.java b/src/main/java/com/gooddata/AbstractPollHandlerBase.java new file mode 100644 index 000000000..c63d9234e --- /dev/null +++ b/src/main/java/com/gooddata/AbstractPollHandlerBase.java @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +import static com.gooddata.Validate.notNull; + +/** + * For internal usage by services employing polling.

+ * + * @param

polling type + * @param result type + * + * @see com.gooddata.FutureResult + */ +public abstract class AbstractPollHandlerBase implements PollHandler { + protected final Class

pollClass; + protected final Class resultClass; + private boolean done = false; + private R result; + + protected AbstractPollHandlerBase(Class

pollClass, Class resultClass) { + this.pollClass = notNull(pollClass, "pollClass"); + this.resultClass = notNull(resultClass, "resultClass"); + } + + @Override + public final Class getResultClass() { + return resultClass; + } + + @Override + public final Class

getPollClass() { + return pollClass; + } + + protected PollHandler setResult(R result) { + this.result = result; + this.done = true; + onFinish(); + return this; + } + + @Override + public final boolean isDone() { + return done; + } + + @Override + public final R getResult() { + return result; + } + + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + return HttpStatus.OK.equals(response.getStatusCode()); + } + + /** + * Method called after polling is successfully finished (default no-op) + */ + protected void onFinish() { + } +} diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index 350729200..f5e33e09d 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -3,92 +3,38 @@ */ package com.gooddata; -import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; -import static com.gooddata.Validate.notNull; - /** * For internal usage by services employing polling.

- * Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and - * may override {@link #onFinish()} and {@link #handlePollResult(Object)} methods. - * * @param

polling type * @param result type * * @see com.gooddata.FutureResult */ -public class PollHandler { - - private final String pollingUri; - - private final Class

pollClass; - private final Class resultClass; - - private boolean done = false; - - private R result; - - /** - * Creates a new instance of polling handler - * @param pollingUri URI for polling - * @param pollAndResultClass class of the polling object and result (or {@link Void}) - */ - @SuppressWarnings("unchecked") - public PollHandler(final String pollingUri, final Class pollAndResultClass) { - this(pollingUri, pollAndResultClass, pollAndResultClass); - } - - /** - * Creates a new instance of polling handler - * @param pollingUri URI for polling - * @param pollClass class of the polling object (or {@link Void}) - * @param resultClass class of the result (or {@link Void}) - */ - public PollHandler(final String pollingUri, final Class

pollClass, Class resultClass) { - this.pollingUri = notNull(pollingUri, "pollingUri"); - this.pollClass = notNull(pollClass, "pollClass"); - this.resultClass = notNull(resultClass, "resultClass"); - } +public interface PollHandler { /** * Get URI used for polling * * @return URI string */ - final String getPollingUri() { - return pollingUri; - } + String getPollingUri(); - final Class getResultClass() { - return resultClass; - } + Class getResultClass(); - final Class

getPollClass() { - return pollClass; - } + Class

getPollClass(); - protected PollHandler setResult(R result) { - this.result = result; - this.done = true; - onFinish(); - return this; - } - - final boolean isDone() { - return done; - } + boolean isDone(); /** * Return result of polling * * @return result */ - protected final R getResult() { - return result; - } + R getResult(); /** * Check if polling should finish @@ -97,21 +43,7 @@ protected final R getResult() { * @return true if polling should finish * @throws IOException */ - protected boolean isFinished(final ClientHttpResponse response) throws IOException { - return HttpStatus.OK.equals(response.getStatusCode()); - } - - /** - * Method called after polling is successfully finished (default no-op) - */ - protected void onFinish() { - } + boolean isFinished(ClientHttpResponse response) throws IOException; - protected void handlePollResult(P pollResult) { - if (resultClass.equals(pollClass)) { - setResult(resultClass.cast(pollResult)); - } else { - throw new IllegalStateException("Please override handlePollResult method when you want different type of polling and result class"); - } - } + void handlePollResult(P pollResult); } diff --git a/src/main/java/com/gooddata/SimplePollHandler.java b/src/main/java/com/gooddata/SimplePollHandler.java new file mode 100644 index 000000000..40f18f529 --- /dev/null +++ b/src/main/java/com/gooddata/SimplePollHandler.java @@ -0,0 +1,27 @@ +package com.gooddata; + +/** + * For internal usage by services employing polling.

+ * A simple poll handler using same type for polling and result. + * + * @param polling and result type + * + * @see com.gooddata.FutureResult + */ +public class SimplePollHandler extends AbstractPollHandler { + /** + * Creates a new instance of polling handler + * + * @param pollingUri URI for polling + * @param pollAndResultClass class of the polling object and result (or {@link Void}) + */ + @SuppressWarnings("unchecked") + public SimplePollHandler(String pollingUri, Class pollAndResultClass) { + super(pollingUri, pollAndResultClass, pollAndResultClass); + } + + @Override + public void handlePollResult(T pollResult) { + setResult(pollResult); + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 2c0a1d7d7..83370eecd 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -5,10 +5,10 @@ import static java.util.Collections.emptyList; import com.gooddata.AbstractService; +import com.gooddata.AbstractPollHandler; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.PollHandler; import com.gooddata.ZipUtils; import com.gooddata.account.AccountService; import com.gooddata.project.Project; @@ -19,18 +19,14 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.FileCopyUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.Collection; @@ -207,14 +203,14 @@ public FutureResult executeProcess(ProcessExecution exec final String detailLink = executionTask.getDetailLink(); - return new FutureResult<>(this, new PollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { + return new FutureResult<>(this, new AbstractPollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { @Override - protected boolean isFinished(ClientHttpResponse response) throws IOException { + public boolean isFinished(ClientHttpResponse response) throws IOException { return HttpStatus.NO_CONTENT.equals(response.getStatusCode()); } @Override - protected void handlePollResult(Void pollResult) { + public void handlePollResult(Void pollResult) { ProcessExecutionDetail executionDetail; try { executionDetail = restTemplate.getForObject(detailLink, ProcessExecutionDetail.class); diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index daac0582a..78f543277 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -7,7 +7,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.PollHandler; +import com.gooddata.SimplePollHandler; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; @@ -94,7 +94,7 @@ public FutureResult loadDataset(final Project project, final DatasetManife final PullTask pullTask = restTemplate .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - return new FutureResult<>(this, new PollHandler(pullTask.getUri(), Void.class) { + return new FutureResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 145b7c02b..6052decf2 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -6,7 +6,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataRestException; -import com.gooddata.PollHandler; +import com.gooddata.SimplePollHandler; import com.gooddata.gdc.AsyncTask; import com.gooddata.project.Project; import org.springframework.http.client.ClientHttpResponse; @@ -35,7 +35,7 @@ public FutureResult getProjectModelDiff(Project project, DiffRequest try { final AsyncTask asyncTask = restTemplate .postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); - return new FutureResult<>(this, new PollHandler(asyncTask.getUri(), ModelDiff.class)); + return new FutureResult<>(this, new SimplePollHandler(asyncTask.getUri(), ModelDiff.class)); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); } @@ -72,7 +72,7 @@ public FutureResult updateProjectModel(Project project, String maqlDdl) { try { final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), MaqlDdlLinks.class, project.getId()); - return new FutureResult<>(this, new PollHandler(linkEntries.getStatusLink(), Void.class) { + return new FutureResult<>(this, new SimplePollHandler(linkEntries.getStatusLink(), Void.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { final boolean finished = super.isFinished(response); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index eeedef894..a84d41b7a 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -7,7 +7,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.PollHandler; +import com.gooddata.SimplePollHandler; import com.gooddata.account.AccountService; import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; @@ -84,7 +84,7 @@ public FutureResult createProject(Project project) { throw new GoodDataException("Empty response when project POSTed to API"); } - return new FutureResult<>(this, new PollHandler(uri.getUri(), Project.class) { + return new FutureResult<>(this, new SimplePollHandler(uri.getUri(), Project.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 0b67059a9..bf01eb2ad 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -7,6 +7,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.PollHandler; +import com.gooddata.SimplePollHandler; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import org.codehaus.jackson.JsonNode; @@ -43,9 +44,9 @@ public FutureResult exportReport(final ReportDefinition reportDefinition, notNull(format, "format"); final JsonNode execResult = executeReport(reportDefinition.getUri()); final String uri = exportReport(execResult, format); - return new FutureResult<>(this, new PollHandler(uri, Void.class) { + return new FutureResult<>(this, new SimplePollHandler(uri, Void.class) { @Override - protected boolean isFinished(ClientHttpResponse response) throws IOException { + public boolean isFinished(ClientHttpResponse response) throws IOException { switch (response.getStatusCode()) { case OK: return true; case ACCEPTED: return false; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 0f84cbfdf..e7c382360 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -4,11 +4,11 @@ import static com.gooddata.Validate.notNull; import static java.util.Collections.emptyList; +import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.PollHandler; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; @@ -59,10 +59,10 @@ public FutureResult createWarehouse(Warehouse warehouse) { throw new GoodDataException("Empty response when Warehouse POSTed to API"); } - return new FutureResult<>(this, new PollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { + return new FutureResult<>(this, new AbstractPollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { @Override - protected boolean isFinished(ClientHttpResponse response) throws IOException { + public boolean isFinished(ClientHttpResponse response) throws IOException { return HttpStatus.CREATED.equals(response.getStatusCode()); } @@ -74,7 +74,7 @@ protected void onFinish() { } @Override - protected void handlePollResult(WarehouseTask pollResult) { + public void handlePollResult(WarehouseTask pollResult) { try { final Warehouse warehouse = restTemplate.getForObject(pollResult.getWarehouseLink(), Warehouse.class); setResult(setWarehouseConnection(warehouse)); From 8a108dee1c8dfd2d8031c251421640a766d76e35 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Sep 2014 20:59:00 +0200 Subject: [PATCH 0064/1191] fix model service - change updateProjectModel(Project, ModelDiff) to execute MAQL script from given ModelDiff with the least side-effects - make getProjectModelDiff(Project, DiffRequest) private as it is not usable for the user - add tests Closes: #20 --- README.md | 4 +- src/main/java/com/gooddata/gdc/AsyncTask.java | 20 ++- .../com/gooddata/model/MaqlDdlTaskStatus.java | 5 + .../java/com/gooddata/model/ModelDiff.java | 9 ++ .../java/com/gooddata/model/ModelService.java | 124 ++++++++++++++---- src/test/java/com/gooddata/Example.java | 2 +- .../java/com/gooddata/gdc/AsyncTaskTest.java | 12 +- .../com/gooddata/model/MaqlDdlLinksTest.java | 2 +- .../gooddata/model/MaqlDdlTaskStatusTest.java | 9 ++ .../com/gooddata/model/ModelDiffTest.java | 20 ++- .../com/gooddata/model/ModelServiceIT.java | 73 +++++++++++ src/test/resources/model/maqlDdlLinks.json | 2 +- 12 files changed, 232 insertions(+), 50 deletions(-) create mode 100644 src/test/java/com/gooddata/model/ModelServiceIT.java diff --git a/README.md b/README.md index bdf7677eb..17b821579 100644 --- a/README.md +++ b/README.md @@ -45,9 +45,9 @@ Create and update the project model, execute MAQL DDL,... ModelService modelService = gd.getModelService(); ModelDiff diff = modelService.getProjectModelDiff(project, new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); -modelService.updateProjectModel(project, diff); +modelService.updateProjectModel(project, diff).get(); -modelService.updateProjectModel(project, "MAQL DDL EXPRESSION"); +modelService.updateProjectModel(project, "MAQL DDL EXPRESSION").get(); ``` ### Metadata API diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java index 1c34b51b3..137ddcdba 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -4,6 +4,7 @@ package com.gooddata.gdc; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -20,6 +21,7 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class AsyncTask { + @JsonProperty private Link link; @JsonCreator @@ -27,16 +29,26 @@ private AsyncTask(@JsonProperty("link") Link link) { this.link = link; } + public AsyncTask(final String uri) { + this.link = new Link(uri); + } + + @JsonIgnore public String getUri() { - return link.pollUri; + return link.getPoll(); } private static class Link { - private String pollUri; + + private final String poll; @JsonCreator - private Link(@JsonProperty("poll") String pollUri) { - this.pollUri = pollUri; + private Link(@JsonProperty("poll") String poll) { + this.poll = poll; + } + + public String getPoll() { + return poll; } } diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java index 1e88c2275..43bf593b2 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java @@ -12,6 +12,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.Collection; +import java.util.Collections; /** * MAQL DDL asynchronous task status. @@ -39,6 +40,10 @@ private MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty(" this.messages = messages; } + MaqlDdlTaskStatus(String status, String pollUri) { + this(status, pollUri, Collections.emptyList()); + } + public String getStatus() { return status; } diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index e480d716a..53b917bba 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -12,6 +12,7 @@ import java.util.Collections; import java.util.List; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.unmodifiableList; @@ -35,6 +36,10 @@ public class ModelDiff { this.updateScripts = updateScripts == null ? Collections.emptyList() : updateScripts; } + ModelDiff(UpdateScript... updateScripts) { + this(asList(updateScripts)); + } + /** * Returns several variants of MAQL DDL evolution scripts that should be executed to update the source model to the * target state. Individual variants differ in their side-effects (truncation of loaded data, drops of related objects...) @@ -109,6 +114,10 @@ static class UpdateScript { this.cascadeDrops = cascadeDrops; } + UpdateScript(boolean preserveData, boolean cascadeDrops, String... maqlChunks) { + this(asList(maqlChunks), preserveData, cascadeDrops); + } + public List getMaqlChunks() { return maqlChunks; } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 6052decf2..ffb15159e 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -6,6 +6,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataRestException; +import com.gooddata.AbstractPollHandlerBase; import com.gooddata.SimplePollHandler; import com.gooddata.gdc.AsyncTask; import com.gooddata.project.Project; @@ -16,9 +17,13 @@ import java.io.IOException; import java.io.Reader; +import java.util.Collection; +import java.util.LinkedList; -import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.noNullElements; import static com.gooddata.Validate.notNull; +import static com.gooddata.model.ModelDiff.UpdateScript; +import static java.util.Arrays.asList; /** * Service for manipulating with project model @@ -29,7 +34,7 @@ public ModelService(RestTemplate restTemplate) { super(restTemplate); } - public FutureResult getProjectModelDiff(Project project, DiffRequest diffRequest) { + private FutureResult getProjectModelDiff(Project project, DiffRequest diffRequest) { notNull(project, "project"); notNull(diffRequest, "diffRequest"); try { @@ -57,38 +62,99 @@ public FutureResult getProjectModelDiff(Project project, Reader targe } } - public void updateProjectModel(Project project, ModelDiff projectModelDiff) { - notNull(project, "project"); - notNull(projectModelDiff, "projectModelDiff"); + /** + * Update project model with the MAQL script from given ModelDiff with the least side-effects + * (see {@link ModelDiff#getUpdateMaql()}). + * + * @param project project to be updated + * @param modelDiff difference of model to be applied into the project + * @return poll result + */ + public FutureResult updateProjectModel(Project project, ModelDiff modelDiff) { + notNull(modelDiff, "modelDiff"); + return updateProjectModel(project, modelDiff.getUpdateMaql()); + } - for (String maql : projectModelDiff.getUpdateMaql()) { - updateProjectModel(project, maql); - } + /** + * Update project model with the given update script (MAQL). + * + * @param project project to be updated + * @param updateScript update script to be executed in the project + * @return poll result + */ + public FutureResult updateProjectModel(Project project, UpdateScript updateScript) { + notNull(updateScript, "updateScript"); + return updateProjectModel(project, updateScript.getMaqlChunks()); + } + + /** + * Update project model with the given update script(s) (MAQL). + * @param project project to be updated + * @param maqlDdl update script to be executed in the project + * @return poll result + */ + public FutureResult updateProjectModel(final Project project, final String... maqlDdl) { + return updateProjectModel(project, asList(maqlDdl)); } - public FutureResult updateProjectModel(Project project, String maqlDdl) { + /** + * Update project model with the given update script(s) (MAQL). + * @param project project to be updated + * @param maqlDdl update script to be executed in the project + * @return poll result + */ + public FutureResult updateProjectModel(final Project project, final Collection maqlDdl) { notNull(project, "project"); - notEmpty(maqlDdl, "maqlDdl"); - try { - final MaqlDdlLinks linkEntries = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlDdl), - MaqlDdlLinks.class, project.getId()); - return new FutureResult<>(this, new SimplePollHandler(linkEntries.getStatusLink(), Void.class) { - @Override - public boolean isFinished(final ClientHttpResponse response) throws IOException { - final boolean finished = super.isFinished(response); - if (finished) { - final MaqlDdlTaskStatus maqlDdlTaskStatus = extractData(response, MaqlDdlTaskStatus.class); - if (!maqlDdlTaskStatus.isSuccess()) { - throw new ModelException( - "Unable to update project model: " + maqlDdlTaskStatus.getMessages()); - } - } - return finished; - } - }); - } catch (GoodDataRestException | RestClientException e) { - throw new ModelException("Unable to update project model", e); + noNullElements(maqlDdl, "maqlDdl"); + if (maqlDdl.isEmpty()) { + throw new IllegalArgumentException("MAQL DDL string(s) should be given"); } + return new FutureResult<>(this, new AbstractPollHandlerBase(MaqlDdlLinks.class, Void.class) { + + private final String projectId = project.getId(); + private final LinkedList maqlChunks = new LinkedList<>(maqlDdl); + private String pollUri; + + { + executeNextMaqlChunk(); + } + + @Override + public String getPollingUri() { + return pollUri; + } + + private boolean executeNextMaqlChunk() { + if (maqlChunks.isEmpty()) { + return true; + } + try { + final MaqlDdlLinks links = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlChunks.poll()), + MaqlDdlLinks.class, projectId); + this.pollUri = links.getStatusLink(); + } catch (GoodDataRestException | RestClientException e) { + throw new ModelException("Unable to update project model", e); + } + return false; + } + + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + if (!super.isFinished(response)) { + return false; + } + final MaqlDdlTaskStatus maqlDdlTaskStatus = extractData(response, MaqlDdlTaskStatus.class); + if (!maqlDdlTaskStatus.isSuccess()) { + throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); + } + return executeNextMaqlChunk(); + } + + @Override + public void handlePollResult(MaqlDdlLinks pollResult) { + setResult(null); + } + }); } } diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index ae3372d69..0a96f042d 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -58,7 +58,7 @@ public static void main(String... args) throws FileNotFoundException { final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, new InputStreamReader(Example.class.getResourceAsStream("/person.json"))).get(); - modelService.updateProjectModel(project, projectModelDiff); + modelService.updateProjectModel(project, projectModelDiff).get(); final MetadataService md = gd.getMetadataService(); diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index 3ddf31524..fd82c8cea 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -13,11 +13,21 @@ public class AsyncTaskTest { + private static final ObjectMapper MAPPER = new ObjectMapper(); + @Test public void testDeserialization() throws Exception { final InputStream is = getClass().getResourceAsStream("/gdc/asyncTask.json"); - final AsyncTask asyncTask = new ObjectMapper().readValue(is, AsyncTask.class); + final AsyncTask asyncTask = MAPPER.readValue(is, AsyncTask.class); assertThat(asyncTask.getUri(), is("POLL-URI")); } + + @Test + public void testSerialization() throws Exception { + final String json = MAPPER.writeValueAsString(new AsyncTask("foo")); + final AsyncTask asyncTask = MAPPER.readValue(json, AsyncTask.class); + + assertThat(asyncTask.getUri(), is("foo")); + } } diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index f1a53ba9e..059bb84d8 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -20,6 +20,6 @@ public void testDeserialization() throws Exception { final MaqlDdlLinks maqlDdlLinks = new ObjectMapper().readValue(stream, MaqlDdlLinks.class); assertThat(maqlDdlLinks, is(notNullValue())); - assertThat(maqlDdlLinks.getStatusLink(), is("URI")); + assertThat(maqlDdlLinks.getStatusLink(), is("/gdc/md/PROJECT_ID/tasks/123/status")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java index 216343e30..6c4d1fca4 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java @@ -31,4 +31,13 @@ public void testDeserMessages() throws Exception { final GdcError error = status.getMessages().iterator().next(); assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); } + + @Test + public void testSerialize() throws Exception { + final String json = MAPPER.writeValueAsString(new MaqlDdlTaskStatus("OK", "foo")); + final MaqlDdlTaskStatus status = MAPPER.readValue(json, MaqlDdlTaskStatus.class); + assertThat(status.getStatus(), is("OK")); + assertThat(status.getPollUri(), is("foo")); + + } } diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 4ba47af5f..0cb56693b 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -10,8 +10,6 @@ import java.util.Collections; import static com.gooddata.model.ModelDiff.UpdateScript; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -23,7 +21,7 @@ public class ModelDiffTest { @Test public void testGetUpdateMaqls() throws Exception { - final ModelDiff diff = new ModelDiff(singletonList(new UpdateScript(asList("maql1", "maql2"), true, false))); + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, "maql1", "maql2")); assertThat(diff.getUpdateMaql(), hasSize(2)); assertThat(diff.getUpdateMaql(), contains("maql1", "maql2")); @@ -31,9 +29,9 @@ public void testGetUpdateMaqls() throws Exception { @Test public void testGetUpdateMaqlsReturnsBest() throws Exception { - final ModelDiff diff = new ModelDiff(asList( - new UpdateScript(asList("maql1"), false, false), - new UpdateScript(asList("maql2"), true, false)) + final ModelDiff diff = new ModelDiff( + new UpdateScript(false, false, "maql1"), + new UpdateScript(true, false, "maql2") ); assertThat(diff.getUpdateMaql(), hasSize(1)); @@ -42,9 +40,9 @@ public void testGetUpdateMaqlsReturnsBest() throws Exception { @Test public void testGetUpdateMaqlsReturnsNotWorst() throws Exception { - final ModelDiff diff = new ModelDiff(asList( - new UpdateScript(asList("maql1"), false, true), - new UpdateScript(asList("maql2"), false, false)) + final ModelDiff diff = new ModelDiff( + new UpdateScript(false, true, "maql1"), + new UpdateScript(false, false, "maql2") ); assertThat(diff.getUpdateMaql(), hasSize(1)); @@ -53,7 +51,7 @@ public void testGetUpdateMaqlsReturnsNotWorst() throws Exception { @Test public void testGetUpdateMaqlsNoPreserveData() throws Exception { - final ModelDiff diff = new ModelDiff(singletonList(new UpdateScript(asList("maql"), false, false))); + final ModelDiff diff = new ModelDiff(new UpdateScript(false, false, "maql")); assertThat(diff.getUpdateMaql(), hasSize(1)); assertThat(diff.getUpdateMaql().get(0), equalTo("maql")); @@ -68,7 +66,7 @@ public void testGetUpdateMaqlsNoUpdateScript() throws Exception { @Test public void testGetUpdateMaqlsNoMaqlInUpdateScript() throws Exception { - final ModelDiff diff = new ModelDiff(asList(new UpdateScript(Collections.emptyList(), true, false))); + final ModelDiff diff = new ModelDiff(new UpdateScript(Collections.emptyList(), true, false)); assertThat(diff.getUpdateMaql(), hasSize(0)); } diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java new file mode 100644 index 000000000..436847b47 --- /dev/null +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -0,0 +1,73 @@ +package com.gooddata.model; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.gdc.AsyncTask; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import static com.gooddata.model.ModelDiff.UpdateScript; +import static net.jadler.Jadler.onRequest; + +public class ModelServiceIT extends AbstractGoodDataIT { + + private static final String DIFF_URI = "/gdc/projects/PROJECT_ID/model/diff"; + private static final String DIFF_POLL_URI = DIFF_URI + "/123"; + private static final String LDM_MANAGE2 = "/gdc/md/PROJECT_ID/ldm/manage2"; + private static final String STATUS_URI = "/gdc/md/PROJECT_ID/tasks/123/status"; + + private Project project; + + @BeforeClass + public void setUp() throws Exception { + project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + } + + @Test + public void shouldCreateDiff() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(DIFF_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(DIFF_POLL_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))) + .thenRespond() + .withStatus(200) + .withBody(readResource("/model/modelDiff.json")) + ; + + gd.getModelService().getProjectModelDiff(project, "xxx").get(); + } + + @Test + public void shouldUpdateModel() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(LDM_MANAGE2) + .respond() + .withStatus(202) + .withBody(readResource("/model/maqlDdlLinks.json")); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new MaqlDdlTaskStatus("RUNNING", STATUS_URI))) + .thenRespond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new MaqlDdlTaskStatus("OK", STATUS_URI))) + ; + + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, + "synchronize {dataset.person} preserve data", + "synchronize {dataset.person} preserve data" + )); + gd.getModelService().updateProjectModel(project, diff).get(); + } +} \ No newline at end of file diff --git a/src/test/resources/model/maqlDdlLinks.json b/src/test/resources/model/maqlDdlLinks.json index c406691fd..f31df45ad 100644 --- a/src/test/resources/model/maqlDdlLinks.json +++ b/src/test/resources/model/maqlDdlLinks.json @@ -1,7 +1,7 @@ { "entries" : [ { - "link" : "URI", + "link" : "/gdc/md/PROJECT_ID/tasks/123/status", "category" : "tasks-status" } ] From 40dae45e5acd6d686c849cf2f0ffde51de42c7e1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 6 Oct 2014 19:17:56 +0200 Subject: [PATCH 0065/1191] add execution detail links getters --- .../dataload/processes/ProcessExecutionDetail.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index 72398093d..3c4f34540 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -23,6 +23,8 @@ public class ProcessExecutionDetail { private static final String LOG_LINK = "log"; + private static final String SELF_LINK = "self"; + private static final String EXECUTION_LINK = "poll"; private static final String STATUS_OK = "OK"; private final String status; @@ -77,6 +79,16 @@ public String getLogLink() { return links != null ? links.get(LOG_LINK) : null; } + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK) : null; + } + + @JsonIgnore + public String getExecutionLink() { + return links != null ? links.get(EXECUTION_LINK) : null; + } + @JsonIgnore public boolean isSuccess() { return STATUS_OK.equals(status); From 7aada4af95cf1fbf5a09e09cf79165f608453144 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 6 Oct 2014 19:21:19 +0200 Subject: [PATCH 0066/1191] improve getProcessSource javadoc --- .../java/com/gooddata/dataload/processes/ProcessService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 2c0a1d7d7..5bab235a9 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -154,7 +154,8 @@ public void removeProcess(Process process) { } /** - * Get process source data + * Get process source data. Source data are fetched as zip and written to given stream. + * * @param process process to fetch data of * @param outputStream stream where to write fetched data */ From b88e9fd1085076b640e76f136912f2ae23a95b8b Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 8 Sep 2014 09:53:06 +0200 Subject: [PATCH 0067/1191] rename getSelfLink to getUri --- .../java/com/gooddata/account/Account.java | 4 +- .../gooddata/dataload/processes/Process.java | 6 +-- .../dataload/processes/ProcessService.java | 8 +--- .../java/com/gooddata/project/Project.java | 4 +- .../com/gooddata/project/ProjectService.java | 2 +- .../com/gooddata/warehouse/Warehouse.java | 4 +- .../gooddata/warehouse/WarehouseService.java | 12 +++--- src/test/java/com/gooddata/Example.java | 2 +- .../com/gooddata/account/AccountTest.java | 2 +- .../com/gooddata/project/ProjectTest.java | 2 +- .../warehouse/WarehouseServiceIT.java | 38 ++++++++++++++++--- 11 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 120da932b..3f3a82916 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -60,7 +60,7 @@ public String getLastName() { } @JsonIgnore - public String getSelfLink() { + public String getUri() { return links.getSelf(); } @@ -71,7 +71,7 @@ public String getProjectsLink() { @JsonIgnore public String getId() { - return TEMPLATE.match(getSelfLink()).get("id"); + return TEMPLATE.match(getUri()).get("id"); } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/dataload/processes/Process.java b/src/main/java/com/gooddata/dataload/processes/Process.java index d2e04a0f4..2a1448bc6 100644 --- a/src/main/java/com/gooddata/dataload/processes/Process.java +++ b/src/main/java/com/gooddata/dataload/processes/Process.java @@ -71,13 +71,13 @@ public Set getExecutables() { } @JsonIgnore - public String getSelfLink() { + public String getUri() { return links != null ? links.get(SELF_LINK) : null; } @JsonIgnore public String getId() { - return TEMPLATE.match(getSelfLink()).get("processId"); + return TEMPLATE.match(getUri()).get("processId"); } @JsonIgnore @@ -87,6 +87,6 @@ public String getExecutionsLink() { @JsonIgnore public String getSourceLink() { - return getSelfLink() != null ? getSelfLink() + "/source" : null; + return getUri() != null ? getUri() + "/source" : null; } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 2c0a1d7d7..3c06428e9 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -19,18 +19,14 @@ import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.FileCopyUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.io.File; -import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.util.Collection; @@ -147,9 +143,9 @@ public Collection listUserProcesses() { public void removeProcess(Process process) { notNull(process, "process"); try { - restTemplate.delete(process.getSelfLink()); + restTemplate.delete(process.getUri()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to remove process " + process.getSelfLink(), e); + throw new GoodDataException("Unable to remove process " + process.getUri(), e); } } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index b3271e149..809dab41a 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -65,7 +65,7 @@ public void setProjectTemplate(String uri) { @JsonIgnore public String getId() { - return TEMPLATE.match(getSelfLink()).get("id"); + return TEMPLATE.match(getUri()).get("id"); } @JsonIgnore @@ -129,7 +129,7 @@ public String getUpdated() { } @JsonIgnore - public String getSelfLink() { + public String getUri() { return links.getSelf(); } diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index eeedef894..7e404c04a 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -143,7 +143,7 @@ public Project getProjectById(String id) { public void removeProject(final Project project) { notNull(project, "project"); try { - restTemplate.delete(project.getSelfLink()); + restTemplate.delete(project.getUri()); } catch (GoodDataRestException | RestClientException e) { throw new GoodDataException("Unable to delete project " + project.getId(), e); } diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index efdd3b521..828680c3b 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -127,13 +127,13 @@ public String getJdbcConnectionString() { } @JsonIgnore - public String getSelfLink() { + public String getUri() { return links != null ? links.get(SELF_LINK): null; } @JsonIgnore public String getId() { - return TEMPLATE.match(getSelfLink()).get(ID_PARAM); + return TEMPLATE.match(getUri()).get(ID_PARAM); } @JsonIgnore diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 0f84cbfdf..5d1944c59 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -69,7 +69,7 @@ protected boolean isFinished(ClientHttpResponse response) throws IOException { @Override protected void onFinish() { if (!getResult().isEnabled()) { - throw new GoodDataException("Created warehouse, uri: " + getResult().getSelfLink() + " is not enabled!"); + throw new GoodDataException("Created warehouse, uri: " + getResult().getUri() + " is not enabled!"); } } @@ -93,9 +93,9 @@ protected void handlePollResult(WarehouseTask pollResult) { public void removeWarehouse(Warehouse warehouse) { notNull(warehouse, "warehouse"); try { - restTemplate.delete(warehouse.getSelfLink()); + restTemplate.delete(warehouse.getUri()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to delete Warehouse, uri: " + warehouse.getSelfLink(), e); + throw new GoodDataException("Unable to delete Warehouse, uri: " + warehouse.getUri(), e); } } @@ -162,12 +162,12 @@ public Collection listWarehouses() { public Warehouse updateWarehouse(Warehouse toUpdate) { notNull(toUpdate, "warehouse to update"); try { - restTemplate.put(toUpdate.getSelfLink(), toUpdate); + restTemplate.put(toUpdate.getUri(), toUpdate); } catch (GoodDataRestException | RestClientException e) { - throw new GoodDataException("Unable to update Warehouse, uri: " + toUpdate.getSelfLink()); + throw new GoodDataException("Unable to update Warehouse, uri: " + toUpdate.getUri()); } - return getWarehouseByUri(toUpdate.getSelfLink()); + return getWarehouseByUri(toUpdate.getUri()); } private Warehouse setWarehouseConnection(Warehouse warehouse) { diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index ae3372d69..a6b26f08d 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -51,7 +51,7 @@ public static void main(String... args) throws FileNotFoundException { System.out.println(projects); final Project project = projectService.createProject(new Project("sparkling3", "pgroup2")).get(); - System.out.println(project.getSelfLink()); + System.out.println(project.getUri()); final ModelService modelService = gd.getModelService(); diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 905fad64c..35a886e35 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -19,7 +19,7 @@ public void testDeserialize() throws Exception { assertThat(account.getFirstName(), is("Blah")); assertThat(account.getLastName(), is("Muhehe")); assertThat(account.getId(), is("ID")); - assertThat(account.getSelfLink(), is("/gdc/account/profile/ID")); + assertThat(account.getUri(), is("/gdc/account/profile/ID")); assertThat(account.getProjectsLink(), is("/gdc/account/profile/ID/projects")); } diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 433154520..aa1daa6ac 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -33,7 +33,7 @@ public void testDeserialize() throws Exception { assertThat(project.getUpdated(), is("2014-04-11 11:43:47")); assertThat(project.getLdmThumbnailLink(), is("/gdc/projects/PROJECT_ID/ldm?thumbnail=1")); - assertThat(project.getSelfLink(), is("/gdc/projects/PROJECT_ID")); + assertThat(project.getUri(), is("/gdc/projects/PROJECT_ID")); assertThat(project.getClearCachesLink(), is("/gdc/projects/PROJECT_ID/clearCaches")); assertThat(project.getInvitationsLink(), is("/gdc/projects/PROJECT_ID/invitations")); assertThat(project.getUsersLink(), is("/gdc/projects/PROJECT_ID/users?link=1")); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 496f6d7a5..910ca6b62 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,13 +1,17 @@ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataIT; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import java.io.IOException; import java.util.Collection; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; +import static net.jadler.Jadler.verifyThatRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; @@ -93,8 +97,8 @@ public void shouldRemoveWarehouse() throws Exception { public void shouldGetWarehouse() throws Exception { onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .havingPathEqualTo(warehouse.getUri()) + .respond() .withBody(readResource(WAREHOUSE)) .withStatus(200); @@ -113,18 +117,40 @@ public void shouldUpdateWarehouse() throws Exception { onRequest() .havingMethodEqualTo("PUT") - .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .havingPathEqualTo(warehouse.getUri()) + .respond() .withStatus(204); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(warehouse.getSelfLink()) - .respond() + .havingPathEqualTo(warehouse.getUri()) + .respond() .withBody(MAPPER.writeValueAsString(toUpdate)) .withStatus(200); final Warehouse updated = gd.getWarehouseService().updateWarehouse(toUpdate); assertThat(updated, notNullValue()); assertThat(updated.getTitle(), is(updatedTitle)); + + verifyThatRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(warehouse.getUri()) + .havingBody(new BaseMatcher() { + @Override + public boolean matches(Object o) { + try { + Warehouse instance = MAPPER.readValue((String) o, Warehouse.class); + return updatedTitle.equals(instance.getTitle()); + } catch (IOException e) { + return false; + } + } + + + @Override + public void describeTo(Description description) { + description.appendText("Warehouse not changed"); + } + }) + .receivedOnce(); } } From a5d9d5f75fe0842250ae4c2939e8c8f0c5d91f20 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 7 Oct 2014 17:46:38 +0200 Subject: [PATCH 0068/1191] fix error parameters, they are not only strings --- src/main/java/com/gooddata/gdc/ErrorStructure.java | 6 +++--- .../java/com/gooddata/gdc/ErrorStructureTest.java | 11 +++++++---- src/test/java/com/gooddata/gdc/GdcErrorTest.java | 4 ++-- src/test/resources/gdc/errorStructure.json | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 0cc33199a..da6e4b15e 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -15,7 +15,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) public class ErrorStructure { protected final String message; - protected final String[] parameters; + protected final Object[] parameters; protected final String component; protected final String errorClass; protected final String errorCode; @@ -25,7 +25,7 @@ public class ErrorStructure { @JsonCreator protected ErrorStructure(@JsonProperty("errorClass") String errorClass, @JsonProperty("component") String component, - @JsonProperty("parameters") String[] parameters, @JsonProperty("message") String message, + @JsonProperty("parameters") Object[] parameters, @JsonProperty("message") String message, @JsonProperty("errorCode") String errorCode, @JsonProperty("errorId") String errorId, @JsonProperty("trace") String trace, @JsonProperty("requestId") String requestId) { this.errorClass = errorClass; @@ -42,7 +42,7 @@ public String getMessage() { return message; } - public String[] getParameters() { + public Object[] getParameters() { return parameters == null ? null : copyOf(parameters, parameters.length); } diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index 7e11cc274..d595edcbb 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -19,15 +19,18 @@ public void testDeserialization() throws Exception { assertThat(errStructure, is(notNullValue())); assertThat(errStructure.getErrorClass(), is("CLASS")); assertThat(errStructure.getTrace(), is("TRACE")); - assertThat(errStructure.getMessage(), is("MSG")); + assertThat(errStructure.getMessage(), is("MSG %s %s %d")); assertThat(errStructure.getComponent(), is("COMPONENT")); assertThat(errStructure.getErrorId(), is("ID")); assertThat(errStructure.getErrorCode(), is("CODE")); assertThat(errStructure.getRequestId(), is("REQ")); assertThat(errStructure.getParameters(), is(notNullValue())); - assertThat(errStructure.getParameters().length, is(2)); - assertThat(errStructure.getParameters()[0], is("PARAM1")); - assertThat(errStructure.getParameters()[1], is("PARAM2")); + assertThat(errStructure.getParameters().length, is(3)); + assertThat(errStructure.getParameters()[0].toString(), is("PARAM1")); + assertThat(errStructure.getParameters()[1].toString(), is("PARAM2")); + assertThat(errStructure.getParameters()[2].toString(), is("3")); + + assertThat(errStructure.getFormattedMessage(), is("MSG PARAM1 PARAM2 3")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java index 6acdf4b24..55f85df78 100644 --- a/src/test/java/com/gooddata/gdc/GdcErrorTest.java +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -30,7 +30,7 @@ public void testDeserialization() throws Exception { assertThat(err.getParameters(), is(notNullValue())); assertThat(err.getParameters().length, is(2)); - assertThat(err.getParameters()[0], is("PARAM1")); - assertThat(err.getParameters()[1], is("PARAM2")); + assertThat(err.getParameters()[0].toString(), is("PARAM1")); + assertThat(err.getParameters()[1].toString(), is("PARAM2")); } } \ No newline at end of file diff --git a/src/test/resources/gdc/errorStructure.json b/src/test/resources/gdc/errorStructure.json index 8945cb088..a750ca7b0 100644 --- a/src/test/resources/gdc/errorStructure.json +++ b/src/test/resources/gdc/errorStructure.json @@ -1,10 +1,10 @@ { "errorClass": "CLASS", "trace": "TRACE", - "message": "MSG", + "message": "MSG %s %s %d", "component": "COMPONENT", "errorId": "ID", "errorCode": "CODE", "requestId": "REQ", - "parameters": [ "PARAM1", "PARAM2" ] + "parameters": [ "PARAM1", "PARAM2", 3 ] } From 1a616553d085de0297f1218d20b33963c8a049f1 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 29 May 2014 11:18:56 +0200 Subject: [PATCH 0069/1191] add support for relative upload paths in DataStoreService the link to uploads in Gdc, can be relative when the host is the same as gdcHost, added fallback to complete the relative path with gdcHost uri --- src/main/java/com/gooddata/GoodData.java | 2 +- .../com/gooddata/gdc/DataStoreService.java | 37 +++++++++- .../com/gooddata/gdc/DataStoreServiceIT.java | 53 +++++++++++++++ .../gooddata/gdc/DataStoreServiceTest.java | 67 +++++++++++++++++++ .../java/com/gooddata/gdc/GdcServiceIT.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 2 +- src/test/resources/gdc/gdc.json | 2 +- 7 files changed, 158 insertions(+), 7 deletions(-) create mode 100644 src/test/java/com/gooddata/gdc/DataStoreServiceIT.java create mode 100644 src/test/java/com/gooddata/gdc/DataStoreServiceTest.java diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 096077fa7..5ea2edcbb 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -70,7 +70,7 @@ public GoodData(String hostname, String login, String password, int port, String metadataService = new MetadataService(restTemplate); modelService = new ModelService(restTemplate); gdcService = new GdcService(restTemplate); - dataStoreService = new DataStoreService(httpClientBuilder, gdcService, login, password); + dataStoreService = new DataStoreService(httpClientBuilder, gdcService, new HttpHost(hostname, port, protocol).toURI(), login, password); datasetService = new DatasetService(restTemplate, dataStoreService); reportService = new ReportService(restTemplate); } diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 6d6184235..e87866461 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -16,22 +16,35 @@ import static com.gooddata.Validate.notNull; /** + * Uploads, downloads, deletes, ... at datastore */ public class DataStoreService { private final Sardine sardine; private final GdcService gdcService; + private final URI gdcUri; private UriPrefixer prefixer; - public DataStoreService(HttpClientBuilder httClientBuilder, GdcService gdcService, String user, String pass) { + + /** + * Creates new DataStoreService + * @param httClientBuilder httpClientBuilder to build datastore connection + * @param gdcService used to obtain datastore URI + * @param gdcUri complete GDC URI used to prefix possibly relative datastore path + * @param user datastore user + * @param pass datastore password + */ + public DataStoreService(HttpClientBuilder httClientBuilder, GdcService gdcService, String gdcUri, String user, String pass) { this.gdcService = notNull(gdcService, "gdcService"); + this.gdcUri = URI.create(notEmpty(gdcUri, "gdcUri")); sardine = new SardineImpl(httClientBuilder, user, pass); } private UriPrefixer getPrefixer() { if (prefixer == null) { - final String webDAVUri = gdcService.getGdc().getUserStagingLink(); - prefixer = new UriPrefixer(webDAVUri); + final String uriString = gdcService.getGdc().getUserStagingLink(); + final URI uri = URI.create(uriString); + prefixer = new UriPrefixer(uri.isAbsolute() ? uri : gdcUri.resolve(uriString)); sardine.enablePreemptiveAuthentication(prefixer.getDefaultUri().getHost()); } return prefixer; @@ -41,8 +54,15 @@ private URI getUri(String uri) { return getPrefixer().mergeUris(uri); } + /** + * Uploads given stream to given datastore path + * @param path path where to upload to + * @param stream stream to upload + * @throws com.gooddata.gdc.DataStoreException in case upload failed + */ public void upload(String path, InputStream stream) { notEmpty(path, "path"); + notNull(stream, "stream"); upload(getUri(path), stream); } @@ -54,6 +74,12 @@ private void upload(URI url, InputStream stream) { } } + /** + * Download given path and return data as stream + * @param path path from where to download + * @return download stream + * @throws com.gooddata.gdc.DataStoreException in case download failed + */ public InputStream download(String path) { notEmpty(path, "path"); final URI uri = getUri(path); @@ -64,6 +90,11 @@ public InputStream download(String path) { } } + /** + * Delete given path from datastore. + * @param path path to delete + * @throws com.gooddata.gdc.DataStoreException in case delete failed + */ public void delete(String path) { notEmpty(path, "path"); final URI uri = getUri(path); diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java new file mode 100644 index 000000000..91a755171 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -0,0 +1,53 @@ +package com.gooddata.gdc; + +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static net.jadler.Jadler.verifyThatRequest; + +import com.gooddata.AbstractGoodDataIT; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.IOException; + +public class DataStoreServiceIT extends AbstractGoodDataIT { + + + @Test + public void testUpload() throws Exception { + onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").respond().withStatus(201); + mockGdc("http://localhost:" + port()); + gd.getDataStoreService().upload("/test", new ByteArrayInputStream("test".getBytes())); + verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").receivedOnce(); + } + + @Test + public void testUploadRelativePath() throws Exception { + testUploadRelative("/uploads"); + } + + @Test + public void testUploadRelativePathNoSlash() throws Exception { + testUploadRelative("uploads"); + } + + private void testUploadRelative(String path) throws IOException { + onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").respond().withStatus(201); + mockGdc(path); + gd.getDataStoreService().upload("/test", new ByteArrayInputStream("test".getBytes())); + verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").receivedOnce(); + } + + private void mockGdc(String path) throws IOException { + final String gdcBody = IOUtils.toString(getClass().getResourceAsStream("/gdc/gdc.json")).replaceAll("\\{STAGING_LINK\\}", path); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .respond() + .withBody(gdcBody) + .withStatus(200); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java b/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java new file mode 100644 index 000000000..c64b8fd6b --- /dev/null +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java @@ -0,0 +1,67 @@ +package com.gooddata.gdc; + +import org.apache.http.impl.client.HttpClientBuilder; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.util.Arrays; + +import static net.jadler.Jadler.closeJadler; +import static net.jadler.Jadler.initJadler; +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static net.jadler.Jadler.verifyThatRequest; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class DataStoreServiceTest { + + private DataStoreService storeService; + private GdcService gdcService; + + @Before + public void setUp() { + initJadler(); + + gdcService = mock(GdcService.class); + storeService = new DataStoreService(HttpClientBuilder.create(), gdcService, "http://localhost:"+port(), "user", "pass"); + } + + @After + public void tearDown() { + closeJadler(); + } + + @Test + public void testUpload() throws Exception { + final Gdc gdc = mock(Gdc.class); + when(gdc.getUserStagingLink()).thenReturn("http://localhost:"+port()); + when(gdcService.getGdc()).thenReturn(gdc); + onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").respond().withStatus(201); + storeService.upload("/test", new ByteArrayInputStream("test".getBytes())); + verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").receivedOnce(); + } + + @Test + public void testUploadRelativePath() throws Exception { + testUploadRelative("/uploads"); + } + + @Test + public void testUploadRelativePathNoSlash() throws Exception { + testUploadRelative("uploads"); + } + + private void testUploadRelative(String path) { + final Gdc gdc = mock(Gdc.class); + when(gdc.getUserStagingLink()).thenReturn(path); + when(gdcService.getGdc()).thenReturn(gdc); + onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").respond().withStatus(201); + storeService.upload("/test", new ByteArrayInputStream("test".getBytes())); + verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").receivedOnce(); + } + + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index e6b91cd06..17108741b 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -21,6 +21,6 @@ public void shouldReturnGdc() throws Exception { final Gdc gdc = gd.getGdcService().getGdc(); assertThat(gdc, is(notNullValue())); - assertThat(gdc.getUserStagingLink(), is("https://STAGING")); + assertThat(gdc.getUserStagingLink(), is("{STAGING_LINK}")); } } diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 8596e3604..f2e5e26d2 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -29,6 +29,6 @@ public void deserialize() throws Exception { assertThat(gdc.getToolLink(), is("/gdc/tool")); assertThat(gdc.getTemplatesLink(), is("/gdc/templates")); assertThat(gdc.getReleaseInfoLink(), is("/gdc/releaseInfo")); - assertThat(gdc.getUserStagingLink(), is("https://STAGING")); + assertThat(gdc.getUserStagingLink(), is("{STAGING_LINK}")); } } \ No newline at end of file diff --git a/src/test/resources/gdc/gdc.json b/src/test/resources/gdc/gdc.json index 289953e5c..209e6b8c6 100644 --- a/src/test/resources/gdc/gdc.json +++ b/src/test/resources/gdc/gdc.json @@ -76,7 +76,7 @@ "category" : "releaseInfo" }, { - "link" : "https://STAGING", + "link" : "{STAGING_LINK}", "summary" : "User data staging area.", "title" : "user-uploads", "category" : "uploads" From be1c4350a9b9e1d79abf0bbd6b0841fdb47ae31f Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 6 Oct 2014 19:31:40 +0200 Subject: [PATCH 0070/1191] fix improper messages --- .../java/com/gooddata/dataload/processes/ProcessExecution.java | 3 ++- .../java/com/gooddata/dataload/processes/ProcessService.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index a10f33d57..9ede2c6ad 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -9,6 +9,7 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.springframework.util.CollectionUtils; +import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -44,7 +45,7 @@ public ProcessExecution(Process process, String executable, Map if (!CollectionUtils.isEmpty(process.getExecutables()) && !process.getExecutables().contains(executable)) { - throw new IllegalArgumentException("Executable " + executable + " not found in process executables."); + throw new IllegalArgumentException("Executable " + executable + " not found in process executables " + process.getExecutables()); } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 5bab235a9..55ab6abc1 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -270,7 +270,7 @@ private Process postProcess(Process process, File processData, URI postUri) { try { return restTemplate.postForObject(postUri, parts, Process.class); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to create dataload process.", e); + throw new GoodDataException("Unable to post dataload process.", e); } finally { deleteTempFile(tempFile); } From 7ca36d94015514411230071d34fc5d513cf58e56 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 18 Oct 2014 00:12:22 +0200 Subject: [PATCH 0071/1191] rename defaultUri to uriPrefix --- src/main/java/com/gooddata/UriPrefixer.java | 40 ++++++++++++++++--- .../com/gooddata/gdc/DataStoreService.java | 2 +- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 44c39538e..0c814700d 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -10,31 +10,61 @@ import static com.gooddata.Validate.notEmpty; import static com.gooddata.Validate.notNull; +/** + * Used internally by GoodData SDK to hold and set URI prefix (hostname and port) of all requests. + */ public class UriPrefixer { - private final URI defaultUri; + private final URI uriPrefix; + /** + * Construct URI prefixer using given URI prefix (just hostname and port is used) + * + * @param uriPrefix the URI prefix + */ public UriPrefixer(URI uriPrefix) { - this.defaultUri = notNull(uriPrefix, "uriPrefix"); + this.uriPrefix = notNull(uriPrefix, "uriPrefix"); } + /** + * Construct URI prefixer using given URI prefix (just hostname and port is used) + * + * @param uriPrefix the URI prefix string + */ public UriPrefixer(String uriPrefix) { this(URI.create(uriPrefix)); } - public URI getDefaultUri() { - return defaultUri; + /** + * Get the URI prefix + * + * @return the URI prefix + */ + public URI getUriPrefix() { + return uriPrefix; } + /** + * Return merged URI prefix (hostname and port) with the given URI (path, query, and fragment URI parts) + * + * @param uri the URI its parts (path, query, and fragment) will be merged with URI prefix + * @return the merged URI + */ public URI mergeUris(URI uri) { notNull(uri, "uri"); - return UriComponentsBuilder.fromUri(defaultUri) + return UriComponentsBuilder.fromUri(uriPrefix) .path(uri.getRawPath()) .query(uri.getRawQuery()) .fragment(uri.getRawFragment()) .build().toUri(); } + /** + * Return merged URI prefix (hostname and port) with the given URI string (path, query, and fragment URI parts) + * + * @param uri the URI string its parts (path, query, and fragment) will be merged with URI prefix + * @return the merged URI + */ public URI mergeUris(String uri) { notEmpty(uri, "uri"); return mergeUris(URI.create(uri)); diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index e87866461..fca0af6bb 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -45,7 +45,7 @@ private UriPrefixer getPrefixer() { final String uriString = gdcService.getGdc().getUserStagingLink(); final URI uri = URI.create(uriString); prefixer = new UriPrefixer(uri.isAbsolute() ? uri : gdcUri.resolve(uriString)); - sardine.enablePreemptiveAuthentication(prefixer.getDefaultUri().getHost()); + sardine.enablePreemptiveAuthentication(prefixer.getUriPrefix().getHost()); } return prefixer; } From 43d5fd065458a16c88053dc62aeec196081e61eb Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 18 Oct 2014 00:12:50 +0200 Subject: [PATCH 0072/1191] add and format some javadocs --- .../com/gooddata/GoodDataRestException.java | 30 +++++++++++++++---- .../HeaderSettingRequestInterceptor.java | 21 +++++++++++++ .../UriPrefixingClientHttpRequestFactory.java | 17 +++++++++-- src/main/java/com/gooddata/Validate.java | 2 +- 4 files changed, 61 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index cc4b01644..05a3c1de5 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -22,9 +22,9 @@ public class GoodDataRestException extends GoodDataException { * Construct a GoodDataRestException with specified details. * * @param statusCode the HTTP status code of the response - * @param requestId the GoodData request ID (from header) - * @param message the detail message - * @param component the GoodData component where error occurred + * @param requestId the GoodData request ID (from header) + * @param message the detail message + * @param component the GoodData component where error occurred * @param errorClass the class of the error */ public GoodDataRestException(int statusCode, String requestId, String message, String component, @@ -40,9 +40,9 @@ public GoodDataRestException(int statusCode, String requestId, String message, S * Construct a GoodDataRestException with specified details. * * @param statusCode the HTTP status code of the response - * @param requestId the GoodData request ID (from header) + * @param requestId the GoodData request ID (from header) * @param statusText the HTTP status text of the response - * @param error the GoodData REST API error structure + * @param error the GoodData REST API error structure */ public GoodDataRestException(int statusCode, String requestId, String statusText, GdcError error) { this(statusCode, @@ -52,18 +52,38 @@ public GoodDataRestException(int statusCode, String requestId, String statusText error != null ? error.getErrorClass() : null); } + /** + * Get the HTTP status code of the problematic REST API call response + * + * @return the HTTP status code of the response + */ public int getStatusCode() { return statusCode; } + /** + * Get the GoodData request ID (from header) of the problematic REST API call response + * + * @return the GoodData request ID (from header) + */ public String getRequestId() { return requestId; } + /** + * Get the GoodData component where error occurred + * + * @return the GoodData component where error occurred + */ public String getComponent() { return component; } + /** + * Get the class of the error + * + * @return the class of the error + */ public String getErrorClass() { return errorClass; } diff --git a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java index 30b220b4a..a8d1bc03e 100644 --- a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java +++ b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java @@ -14,14 +14,35 @@ import static com.gooddata.Validate.notNull; +/** + * Intercepts client-side HTTP requests and sets HTTP headers passed to constructor of this class. + * Implementations of this interface can be registered with the RestTemplate, as to modify the outgoing + * ClientHttpRequest and/or the incoming ClientHttpResponse. + */ class HeaderSettingRequestInterceptor implements ClientHttpRequestInterceptor { private final Map headers; + /** + * Construct interceptor for setting given HTTP headers. + * + * @param headers the map of HTTP header names to header values + */ public HeaderSettingRequestInterceptor(Map headers) { this.headers = notNull(headers, "headers"); } + /** + * Intercept the given request, set headers passed to constructor, and return a response. + * The given {@link org.springframework.http.client.ClientHttpRequestExecution} allows the interceptor + * to pass on the request and response to the next entity in the chain. + * + * @param request the request, containing method, URI, and headers + * @param body the body of the request + * @param execution the request execution + * @return the response + * @throws IOException in case of I/O errors + */ @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { diff --git a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java index 7335144dd..4aaf9a715 100644 --- a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java +++ b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java @@ -14,6 +14,7 @@ import static com.gooddata.Validate.notNull; /** + * Factory for ClientHttpRequest objects. * Sets default URI prefix for Spring REST client which by default requires absolute URI. * UriPrefixingAsyncClientHttpRequestFactory allows you to specify default hostname and port. */ @@ -23,16 +24,26 @@ class UriPrefixingClientHttpRequestFactory implements ClientHttpRequestFactory { private final UriPrefixer prefixer; /** - * Creates na instance + * Create an instance that will wrap the given {@link org.springframework.http.client.ClientHttpRequestFactory} + * and use the given URI for setting hostname and port of all HTTP requests * - * @param factory - * @param uriPrefix + * @param factory the factory to be wrapped + * @param uriPrefix the URI for setting hostname and port of all HTTP requests */ UriPrefixingClientHttpRequestFactory(ClientHttpRequestFactory factory, URI uriPrefix) { this.wrapped = notNull(factory, "factory"); this.prefixer = new UriPrefixer(uriPrefix); } + /** + * Create an instance that will wrap the given {@link org.springframework.http.client.ClientHttpRequestFactory} + * and use the given hostname, port, and protocol for all HTTP requests + * + * @param factory the factory to be wrapped + * @param hostname the hostname for all HTTP requests + * @param port the port for all HTTP requests + * @param protocol the protocol for all HTTP requests + */ UriPrefixingClientHttpRequestFactory(ClientHttpRequestFactory factory, String hostname, int port, String protocol) { this(factory, UriComponentsBuilder.newInstance().scheme(protocol).host(hostname).port(port).build().toUri()); } diff --git a/src/main/java/com/gooddata/Validate.java b/src/main/java/com/gooddata/Validate.java index 8a313f69c..380e904c8 100644 --- a/src/main/java/com/gooddata/Validate.java +++ b/src/main/java/com/gooddata/Validate.java @@ -4,7 +4,7 @@ import java.util.Iterator; /** - * Validation utils + * Argument validation helper methods used internally by GoodData SDK. */ public abstract class Validate { From bae66745b08d41744f9c0463dd0f82eece53b8ba Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 6 Oct 2014 18:58:43 +0200 Subject: [PATCH 0073/1191] rename Process to DataloadProcess --- README.md | 2 +- .../dataload/processes/DataloadProcess.java | 92 +++++++++++++++++++ .../gooddata/dataload/processes/Process.java | 89 +----------------- .../dataload/processes/ProcessExecution.java | 8 +- .../dataload/processes/ProcessService.java | 26 +++--- .../dataload/processes/Processes.java | 6 +- ...cessTest.java => DataloadProcessTest.java} | 8 +- .../processes/ProcessExecutionTest.java | 2 +- .../dataload/processes/ProcessServiceIT.java | 12 +-- 9 files changed, 127 insertions(+), 118 deletions(-) create mode 100644 src/main/java/com/gooddata/dataload/processes/DataloadProcess.java rename src/test/java/com/gooddata/dataload/processes/{ProcessTest.java => DataloadProcessTest.java} (82%) diff --git a/README.md b/README.md index 17b821579..35a65f181 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ warehouseService.removeWarehouse(warehouse); Manage dataload processes - create, update, list, delete, and process executions - execute, get logs,... ```java ProcessService processService = gd.getProcessService(); -Process process = processService.createProcess(project, new Process("name", "GRAPH"), new File("path/to/processdatadir")); +DataloadProcess process = processService.createProcess(project, new DataloadProcess("name", "GRAPH"), new File("path/to/processdatadir")); ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten")); diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java new file mode 100644 index 000000000..66ab3c20a --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -0,0 +1,92 @@ +package com.gooddata.dataload.processes; + +import static com.gooddata.Validate.notEmpty; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +/** + * Dataload process. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("process") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class DataloadProcess { + + public static final String URI = "/gdc/projects/{projectId}/dataload/processes/{processId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + private static final String EXECUTIONS_LINK = "executions"; + + private String name; + private String type; + private Set executables; + private Map links; + + public DataloadProcess(String name, String type) { + this.name = notEmpty(name, "name"); + this.type = notEmpty(type, "type"); + } + + @JsonCreator + private DataloadProcess(@JsonProperty("name") String name, @JsonProperty("type") String type, + @JsonProperty("executables") Set executables, + @JsonProperty("links") Map links) { + this(name, type); + this.executables = executables != null ? Collections.unmodifiableSet(executables) : null; + this.links = links; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public void setName(String name) { + this.name = name; + } + + public void setType(String type) { + this.type = type; + } + + @JsonIgnore + public Set getExecutables() { + return executables; + } + + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK) : null; + } + + @JsonIgnore + public String getId() { + return TEMPLATE.match(getUri()).get("processId"); + } + + @JsonIgnore + public String getExecutionsLink() { + return links != null ? links.get(EXECUTIONS_LINK) : null; + } + + @JsonIgnore + public String getSourceLink() { + return getUri() != null ? getUri() + "/source" : null; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/Process.java b/src/main/java/com/gooddata/dataload/processes/Process.java index 2a1448bc6..f421c086e 100644 --- a/src/main/java/com/gooddata/dataload/processes/Process.java +++ b/src/main/java/com/gooddata/dataload/processes/Process.java @@ -1,92 +1,11 @@ package com.gooddata.dataload.processes; -import static com.gooddata.Validate.notEmpty; - -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; -import org.springframework.web.util.UriTemplate; - -import java.util.Collections; -import java.util.Map; -import java.util.Set; - /** - * Dataload process. + * This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcess} */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("process") -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Process { - - public static final String URI = "/gdc/projects/{projectId}/dataload/processes/{processId}"; - public static final UriTemplate TEMPLATE = new UriTemplate(URI); - - private static final String SELF_LINK = "self"; - private static final String EXECUTIONS_LINK = "executions"; - - private String name; - private String type; - private Set executables; - private Map links; - +@Deprecated +public class Process extends DataloadProcess { public Process(String name, String type) { - this.name = notEmpty(name, "name"); - this.type = notEmpty(type, "type"); - } - - @JsonCreator - private Process(@JsonProperty("name") String name, @JsonProperty("type") String type, - @JsonProperty("executables") Set executables, - @JsonProperty("links") Map links) { - this(name, type); - this.executables = executables != null ? Collections.unmodifiableSet(executables) : null; - this.links = links; - } - - public String getName() { - return name; - } - - public String getType() { - return type; - } - - public void setName(String name) { - this.name = name; - } - - public void setType(String type) { - this.type = type; - } - - @JsonIgnore - public Set getExecutables() { - return executables; - } - - @JsonIgnore - public String getUri() { - return links != null ? links.get(SELF_LINK) : null; - } - - @JsonIgnore - public String getId() { - return TEMPLATE.match(getUri()).get("processId"); - } - - @JsonIgnore - public String getExecutionsLink() { - return links != null ? links.get(EXECUTIONS_LINK) : null; - } - - @JsonIgnore - public String getSourceLink() { - return getUri() != null ? getUri() + "/source" : null; + super(name, type); } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 9ede2c6ad..8d5c5487a 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -9,8 +9,6 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.springframework.util.CollectionUtils; -import java.util.Arrays; -import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -28,15 +26,15 @@ public class ProcessExecution { private final Map params; private final Map hiddenParams; - public ProcessExecution(Process process, String executable) { + public ProcessExecution(DataloadProcess process, String executable) { this(process, executable, new HashMap(), new HashMap()); } - public ProcessExecution(Process process, String executable, Map params) { + public ProcessExecution(DataloadProcess process, String executable, Map params) { this(process, executable, params, new HashMap()); } - public ProcessExecution(Process process, String executable, Map params, Map hiddenParams) { + public ProcessExecution(DataloadProcess process, String executable, Map params, Map hiddenParams) { notNull(process, "process"); this.executionsUri = notEmpty(process.getExecutionsLink(), "process executions link"); this.executable = executable; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 14bd079b6..20491bdc2 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -60,7 +60,7 @@ public ProcessService(RestTemplate restTemplate, AccountService accountService) * @param processData process data to upload * @return created process */ - public Process createProcess(Project project, Process process, File processData) { + public DataloadProcess createProcess(Project project, DataloadProcess process, File processData) { notNull(process, "process"); notNull(processData, "processData"); notNull(project, "project"); @@ -76,7 +76,7 @@ public Process createProcess(Project project, Process process, File processData) * @param processData process data to upload * @return updated process */ - public Process updateProcess(Project project, Process process, File processData) { + public DataloadProcess updateProcess(Project project, DataloadProcess process, File processData) { notNull(process, "process"); notNull(processData, "processData"); notNull(project, "project"); @@ -90,10 +90,10 @@ public Process updateProcess(Project project, Process process, File processData) * @return found process * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist */ - public Process getProcessByUri(String uri) { + public DataloadProcess getProcessByUri(String uri) { notEmpty(uri, "uri"); try { - return restTemplate.getForObject(uri, Process.class); + return restTemplate.getForObject(uri, DataloadProcess.class); } catch (GoodDataRestException e) { if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { throw new ProcessNotFoundException(uri, e); @@ -112,7 +112,7 @@ public Process getProcessByUri(String uri) { * @return found process * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist */ - public Process getProcessById(Project project, String id) { + public DataloadProcess getProcessById(Project project, String id) { notEmpty(id, "id"); notNull(project, "project"); return getProcessByUri(getProcessUri(project, id).toString()); @@ -123,7 +123,7 @@ public Process getProcessById(Project project, String id) { * @param project project of processes * @return list of found processes or empty list */ - public Collection listProcesses(Project project) { + public Collection listProcesses(Project project) { notNull(project, "project"); return listProcesses(getProcessesUri(project)); } @@ -132,7 +132,7 @@ public Collection listProcesses(Project project) { * Get list of current user processes by given user account. * @return list of found processes or empty list */ - public Collection listUserProcesses() { + public Collection listUserProcesses() { return listProcesses(Processes.USER_PROCESSES_TEMPLATE.expand(accountService.getCurrent().getId())); } @@ -140,7 +140,7 @@ public Collection listUserProcesses() { * Delete given process * @param process to delete */ - public void removeProcess(Process process) { + public void removeProcess(DataloadProcess process) { notNull(process, "process"); try { restTemplate.delete(process.getUri()); @@ -155,7 +155,7 @@ public void removeProcess(Process process) { * @param process process to fetch data of * @param outputStream stream where to write fetched data */ - public void getProcessSource(Process process, OutputStream outputStream) { + public void getProcessSource(DataloadProcess process, OutputStream outputStream) { notNull(process, "process"); notNull(outputStream, "outputStream"); try { @@ -228,7 +228,7 @@ public void handlePollResult(Void pollResult) { }); } - private Collection listProcesses(URI uri) { + private Collection listProcesses(URI uri) { try { final Processes processes = restTemplate.getForObject(uri, Processes.class); if (processes == null || processes.getItems() == null) { @@ -241,14 +241,14 @@ private Collection listProcesses(URI uri) { } private static URI getProcessUri(Project project, String id) { - return Process.TEMPLATE.expand(project.getId(), id); + return DataloadProcess.TEMPLATE.expand(project.getId(), id); } private static URI getProcessesUri(Project project) { return Processes.TEMPLATE.expand(project.getId()); } - private Process postProcess(Process process, File processData, URI postUri) { + private DataloadProcess postProcess(DataloadProcess process, File processData, URI postUri) { File tempFile = createTempFile("process", ".zip"); final MultiValueMap parts = new LinkedMultiValueMap<>(2); @@ -264,7 +264,7 @@ private Process postProcess(Process process, File processData, URI postUri) { } try { - return restTemplate.postForObject(postUri, parts, Process.class); + return restTemplate.postForObject(postUri, parts, DataloadProcess.class); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to post dataload process.", e); } finally { diff --git a/src/main/java/com/gooddata/dataload/processes/Processes.java b/src/main/java/com/gooddata/dataload/processes/Processes.java index ecc1cbcf2..8e3bde0f6 100644 --- a/src/main/java/com/gooddata/dataload/processes/Processes.java +++ b/src/main/java/com/gooddata/dataload/processes/Processes.java @@ -24,14 +24,14 @@ class Processes { public static final String USER_PROCESSES_URI = Account.URI + "/dataload/processes"; public static final UriTemplate USER_PROCESSES_TEMPLATE = new UriTemplate(USER_PROCESSES_URI); - private final List items; + private final List items; @JsonCreator - private Processes(@JsonProperty("items") List items) { + private Processes(@JsonProperty("items") List items) { this.items = items; } - Collection getItems() { + Collection getItems() { return items; } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java similarity index 82% rename from src/test/java/com/gooddata/dataload/processes/ProcessTest.java rename to src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index b90a90770..1f86f7370 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -9,13 +9,13 @@ import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; -public class ProcessTest { +public class DataloadProcessTest { @Test public void testDeserialization() throws Exception { - final Process process = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + final DataloadProcess process = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); assertThat(process, is(notNullValue())); assertThat(process.getName(), is("testProcess")); @@ -28,7 +28,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() { - final Process process = new Process("testProcess", "GROOVY"); + final DataloadProcess process = new DataloadProcess("testProcess", "GROOVY"); assertThat(process, serializesToJson("/dataload/processes/process-input.json")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index ef1988f95..d8c4fff0e 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -20,7 +20,7 @@ public void testSerialization() throws Exception { hidden.put("HIDDEN_PARAM1", "SENSITIVE_VALUE1"); hidden.put("HIDDEN_PARAM2", "SENSITIVE_VALUE2"); - final Process process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), Process.class); + final DataloadProcess process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); final ProcessExecution execution = new ProcessExecution(process, "test.groovy", params, hidden); assertThat(execution, serializesToJson("/dataload/processes/execution.json")); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 492ec4d05..3c21cc1d8 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -24,7 +24,7 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); private static final String PROCESSES_PATH = Processes.TEMPLATE.expand("PROJECT_ID").toString(); private static final String PROCESS_ID = "processId"; - private static final String PROCESS_PATH = Process.TEMPLATE.expand("PROJECT_ID", PROCESS_ID).toString(); + private static final String PROCESS_PATH = DataloadProcess.TEMPLATE.expand("PROJECT_ID", PROCESS_ID).toString(); private static final String PROCESS_SOURCE_PATH = PROCESS_PATH + "/source"; private static final String EXECUTIONS_PATH = PROCESS_PATH + "/executions"; private static final String EXECUTION_PATH = EXECUTIONS_PATH + "/executionId"; @@ -32,14 +32,14 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private Project project; - private Process process; + private DataloadProcess process; private File file; @BeforeClass public void setUp() throws Exception { project = MAPPER.readValue(readResource("/project/project.json"), Project.class); - process = MAPPER.readValue(readResource("/dataload/processes/process.json"), Process.class); + process = MAPPER.readValue(readResource("/dataload/processes/process.json"), DataloadProcess.class); file = File.createTempFile("test", ".groovy"); } @@ -52,7 +52,7 @@ public void shouldCreateProcess() throws Exception { .withBody(readResource("/dataload/processes/process.json")) .withStatus(201); - final Process process = gd.getProcessService().createProcess(project, new Process("testProcess", "GROOVY"), file); + final DataloadProcess process = gd.getProcessService().createProcess(project, new DataloadProcess("testProcess", "GROOVY"), file); assertThat(process, notNullValue()); assertThat(process.getExecutables(), contains("test.groovy")); } @@ -66,7 +66,7 @@ public void shouldListProcesses() throws Exception { .withBody(readResource("/dataload/processes/processes.json")) .withStatus(200); - final Collection processes = gd.getProcessService().listProcesses(project); + final Collection processes = gd.getProcessService().listProcesses(project); assertThat(processes, notNullValue()); assertThat(processes, hasSize(1)); } @@ -80,7 +80,7 @@ public void shouldGetProcess() throws Exception { .withBody(readResource("/dataload/processes/process.json")) .withStatus(200); - final Process process = gd.getProcessService().getProcessById(project, PROCESS_ID); + final DataloadProcess process = gd.getProcessService().getProcessById(project, PROCESS_ID); assertThat(process, notNullValue()); assertThat(process.getName(), is("testProcess")); } From 663ff72a20285e4e3ee5d0ae4d2c2275a50fd8d8 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 6 Oct 2014 19:10:00 +0200 Subject: [PATCH 0074/1191] add ProcessType enum --- .../gooddata/dataload/processes/DataloadProcess.java | 5 +++++ .../com/gooddata/dataload/processes/ProcessType.java | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/main/java/com/gooddata/dataload/processes/ProcessType.java diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 66ab3c20a..830d06594 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -1,6 +1,7 @@ package com.gooddata.dataload.processes; import static com.gooddata.Validate.notEmpty; +import static com.gooddata.Validate.notNull; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; @@ -40,6 +41,10 @@ public DataloadProcess(String name, String type) { this.type = notEmpty(type, "type"); } + public DataloadProcess(String name, ProcessType type) { + this(name, notNull(type, "type").toString()); + } + @JsonCreator private DataloadProcess(@JsonProperty("name") String name, @JsonProperty("type") String type, @JsonProperty("executables") Set executables, diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessType.java b/src/main/java/com/gooddata/dataload/processes/ProcessType.java new file mode 100644 index 000000000..b8f9f8ab1 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ProcessType.java @@ -0,0 +1,11 @@ +package com.gooddata.dataload.processes; + +/** + * Represents type of dataload process. Please note that this enumeration must not be complete. + */ +public enum ProcessType { + GRAPH, + RUBY, + JAVASCRIPT, + GROOVY +} From 0a24b4bd87b444fcd9df9b4ceecf4eb744ae61b0 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 18 Oct 2014 01:00:02 +0200 Subject: [PATCH 0075/1191] rename Processes to DataloadProcesses --- .../dataload/processes/DataloadProcesses.java | 40 +++++++++++++++++++ .../gooddata/dataload/processes/Process.java | 2 +- .../dataload/processes/ProcessService.java | 6 +-- .../dataload/processes/Processes.java | 36 ++++------------- ...esTest.java => DataloadProcessesTest.java} | 17 ++++---- .../dataload/processes/ProcessServiceIT.java | 2 +- 6 files changed, 63 insertions(+), 40 deletions(-) create mode 100644 src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java rename src/test/java/com/gooddata/dataload/processes/{ProcessesTest.java => DataloadProcessesTest.java} (64%) diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java new file mode 100644 index 000000000..c44790be8 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataload.processes; + +import com.gooddata.account.Account; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Collection; +import java.util.List; + +/** + * List of dataload processes. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("processes") +@JsonIgnoreProperties(ignoreUnknown = true) +class DataloadProcesses { + public static final String URI = "/gdc/projects/{projectId}/dataload/processes"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + public static final String USER_PROCESSES_URI = Account.URI + "/dataload/processes"; + public static final UriTemplate USER_PROCESSES_TEMPLATE = new UriTemplate(USER_PROCESSES_URI); + + private final List items; + + @JsonCreator + DataloadProcesses(@JsonProperty("items") List items) { + this.items = items; + } + + Collection getItems() { + return items; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/Process.java b/src/main/java/com/gooddata/dataload/processes/Process.java index f421c086e..5e453e535 100644 --- a/src/main/java/com/gooddata/dataload/processes/Process.java +++ b/src/main/java/com/gooddata/dataload/processes/Process.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; /** - * This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcess} + * @deprecated This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcess} */ @Deprecated public class Process extends DataloadProcess { diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 20491bdc2..ecf4fa94a 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -133,7 +133,7 @@ public Collection listProcesses(Project project) { * @return list of found processes or empty list */ public Collection listUserProcesses() { - return listProcesses(Processes.USER_PROCESSES_TEMPLATE.expand(accountService.getCurrent().getId())); + return listProcesses(DataloadProcesses.USER_PROCESSES_TEMPLATE.expand(accountService.getCurrent().getId())); } /** @@ -230,7 +230,7 @@ public void handlePollResult(Void pollResult) { private Collection listProcesses(URI uri) { try { - final Processes processes = restTemplate.getForObject(uri, Processes.class); + final DataloadProcesses processes = restTemplate.getForObject(uri, DataloadProcesses.class); if (processes == null || processes.getItems() == null) { return emptyList(); } @@ -245,7 +245,7 @@ private static URI getProcessUri(Project project, String id) { } private static URI getProcessesUri(Project project) { - return Processes.TEMPLATE.expand(project.getId()); + return DataloadProcesses.TEMPLATE.expand(project.getId()); } private DataloadProcess postProcess(DataloadProcess process, File processData, URI postUri) { diff --git a/src/main/java/com/gooddata/dataload/processes/Processes.java b/src/main/java/com/gooddata/dataload/processes/Processes.java index 8e3bde0f6..21810088f 100644 --- a/src/main/java/com/gooddata/dataload/processes/Processes.java +++ b/src/main/java/com/gooddata/dataload/processes/Processes.java @@ -1,37 +1,17 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; -import com.gooddata.account.Account; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.springframework.web.util.UriTemplate; - -import java.util.Collection; import java.util.List; /** - * List of processes. Deserialization only. + * @deprecated This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcesses} */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("processes") -@JsonIgnoreProperties(ignoreUnknown = true) -class Processes { - public static final String URI = "/gdc/projects/{projectId}/dataload/processes"; - public static final UriTemplate TEMPLATE = new UriTemplate(URI); - - public static final String USER_PROCESSES_URI = Account.URI + "/dataload/processes"; - public static final UriTemplate USER_PROCESSES_TEMPLATE = new UriTemplate(USER_PROCESSES_URI); - - private final List items; - - @JsonCreator - private Processes(@JsonProperty("items") List items) { - this.items = items; - } +@Deprecated +public class Processes extends DataloadProcesses { - Collection getItems() { - return items; + private Processes(List items) { + super(items); } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java similarity index 64% rename from src/test/java/com/gooddata/dataload/processes/ProcessesTest.java rename to src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java index e47b980b7..3a5366b32 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java @@ -1,19 +1,22 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import static org.hamcrest.MatcherAssert.*; - -import org.codehaus.jackson.map.ObjectMapper; -import org.testng.annotations.Test; -public class ProcessesTest { +public class DataloadProcessesTest { @Test public void testDeserialization() throws Exception { - final Processes processes = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), Processes.class); + final DataloadProcesses processes = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), DataloadProcesses.class); assertThat(processes, is(notNullValue())); assertThat(processes.getItems(), hasSize(1)); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 3c21cc1d8..5fcc767dc 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -22,7 +22,7 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final String PROCESSES_PATH = Processes.TEMPLATE.expand("PROJECT_ID").toString(); + private static final String PROCESSES_PATH = DataloadProcesses.TEMPLATE.expand("PROJECT_ID").toString(); private static final String PROCESS_ID = "processId"; private static final String PROCESS_PATH = DataloadProcess.TEMPLATE.expand("PROJECT_ID", PROCESS_ID).toString(); private static final String PROCESS_SOURCE_PATH = PROCESS_PATH + "/source"; From a8c475c90660f3e6fa6b305f3b6747ca7724f329 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 17 Oct 2014 23:52:42 +0200 Subject: [PATCH 0076/1191] fix DataStoreService tests --- .../java/com/gooddata/gdc/DataStoreServiceIT.java | 10 +++++----- .../java/com/gooddata/gdc/DataStoreServiceTest.java | 11 +++++------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 91a755171..9e1fdded9 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -1,16 +1,16 @@ package com.gooddata.gdc; -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.port; -import static net.jadler.Jadler.verifyThatRequest; - import com.gooddata.AbstractGoodDataIT; import org.apache.commons.io.IOUtils; -import org.junit.Test; +import org.testng.annotations.Test; import java.io.ByteArrayInputStream; import java.io.IOException; +import static net.jadler.Jadler.onRequest; +import static net.jadler.Jadler.port; +import static net.jadler.Jadler.verifyThatRequest; + public class DataStoreServiceIT extends AbstractGoodDataIT { diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java b/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java index c64b8fd6b..91321f1f2 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java @@ -1,12 +1,11 @@ package com.gooddata.gdc; import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; import java.io.ByteArrayInputStream; -import java.util.Arrays; import static net.jadler.Jadler.closeJadler; import static net.jadler.Jadler.initJadler; @@ -21,7 +20,7 @@ public class DataStoreServiceTest { private DataStoreService storeService; private GdcService gdcService; - @Before + @BeforeMethod public void setUp() { initJadler(); @@ -29,7 +28,7 @@ public void setUp() { storeService = new DataStoreService(HttpClientBuilder.create(), gdcService, "http://localhost:"+port(), "user", "pass"); } - @After + @AfterMethod public void tearDown() { closeJadler(); } From cce4e795064b08365a0225eb654bf4a22cd300aa Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 21 Oct 2014 00:29:50 +0200 Subject: [PATCH 0077/1191] update CONTRIBUTE and README --- CONTRIBUTE.md | 26 +++++++++++++++----------- README.md | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 4ee02edac..6944b48d2 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -1,33 +1,37 @@ # GoodData Java SDK - Contribution guide -Below are few rules, recommendations and best practices, we try to follow when developing GoodData Java SDK. +Below are few rules, recommendations and best practices we try to follow when developing GoodData Java SDK. ## Design ### Structure -* Create packages for API parts containing dtos and services related to API part. +* Create packages for API parts containing DTOs and services related to API part. * Don't create single implementation interfaces for services. ### DTOs * All DTOs which can be updated should be mutable. Please keep mutable only the fields which are subject of change, the rest should be immutable. * Create method named `String getUri()` to provide link to self. -* introduce constants +* Introduce constants: ```java public static final String URI = "/gdc/someresource/{resource-id}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); ``` -* Consider the visibility - use _package protected_ when dto is not intended for SDK user use, but is needed in related service. +* Consider the visibility - use _package protected_ when DTO is not intended for SDK user, but is needed in related service. ### Services * When programming client for some polling return [FutureResult](src/main/java/com/gooddata/FutureResult.java) to enable user asynchronous call. * Create custom [GoodDataException](src/main/java/com/gooddata/GoodDataException.java) when you feel the case is specific enough. -* Prefer dtos as arguments instead of Strings or primitives. -* methods prefered naming: - * `get*()` (i.e. `get(Project project)` or `getByUri(String uri)`) instead of `find*()` +* Prefer DTOs as arguments instead of Strings or primitives. +* Methods preferred naming: + * `get*()` when searching form single object (throwing exception when no or multiple objects found) + * `find*()` when searching for multiple objects (collection of objects) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` +* Test class naming: + * `*Test` unit tests + * `*IT` integration tests (see AbstractGoodDataIT) ## Best practices -* test all DTOs using [json-unit](https://github.com/lukas-krecan/JsonUnit) -* write integration tests for services using [jadler](https://github.com/jadler-mocking/jadler/wiki) -* javadoc everything public -* when you need some utility code, look for handy utilities in used libraries first (i.e. spring has its StreamUtils, FileCopyUtils, ...), then when you decide to create new utility class, do it using _abstract utility class pattern_ +* Test all DTOs using [json-unit](https://github.com/lukas-krecan/JsonUnit). +* Write integration tests for services using [jadler](https://github.com/jadler-mocking/jadler/wiki). +* Everything public should be documented using _javadoc_. +* When you need some utility code, look for handy utilities in used libraries first (e.g. Spring has its StreamUtils, FileCopyUtils, ...). When you decide to create new utility class, use _abstract utility class pattern_. diff --git a/README.md b/README.md index 6f4d8a84f..91519196a 100644 --- a/README.md +++ b/README.md @@ -121,4 +121,4 @@ processService.getExecutionLog(executionDetail, new FileOutputStream("file/where ##Contribute Missing functionality? Found a BUG? -Please create us an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTE.md). +Please create an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTE.md). From 200ec6e7cd6bb41fc5fc4c93666bb0d3d7cdcc3d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 30 Apr 2014 18:55:07 +0200 Subject: [PATCH 0078/1191] add connectors --- src/main/java/com/gooddata/GoodData.java | 6 + .../com/gooddata/connectors/Connector.java | 17 +++ .../connectors/ConnectorException.java | 17 +++ .../gooddata/connectors/ConnectorProcess.java | 52 ++++++++ .../gooddata/connectors/ConnectorService.java | 124 ++++++++++++++++++ .../com/gooddata/connectors/Integration.java | 75 +++++++++++ .../java/com/gooddata/connectors/Process.java | 30 +++++ .../gooddata/connectors/ProcessExecution.java | 24 ++++ .../com/gooddata/connectors/Settings.java | 18 +++ .../java/com/gooddata/connectors/Status.java | 48 +++++++ .../gooddata/connectors/Zendesk4Process.java | 14 ++ .../gooddata/connectors/Zendesk4Settings.java | 66 ++++++++++ .../com/gooddata/project/ProjectService.java | 11 ++ .../com/gooddata/project/ProjectTemplate.java | 44 +++++++ .../gooddata/project/ProjectTemplates.java | 30 +++++ .../connectors/ConnectorServiceIT.java | 82 ++++++++++++ .../gooddata/connectors/IntegrationTest.java | 24 ++++ .../com/gooddata/connectors/ProcessTest.java | 24 ++++ .../gooddata/project/ProjectServiceIT.java | 14 ++ .../resources/connectors/integration.json | 37 ++++++ .../resources/connectors/process-error.json | 14 ++ .../connectors/process-finished.json | 14 ++ .../connectors/process-scheduled.json | 14 ++ .../connectors/settings-zendesk4.json | 8 ++ .../resources/project/project-templates.json | 9 ++ 25 files changed, 816 insertions(+) create mode 100644 src/main/java/com/gooddata/connectors/Connector.java create mode 100644 src/main/java/com/gooddata/connectors/ConnectorException.java create mode 100644 src/main/java/com/gooddata/connectors/ConnectorProcess.java create mode 100644 src/main/java/com/gooddata/connectors/ConnectorService.java create mode 100644 src/main/java/com/gooddata/connectors/Integration.java create mode 100644 src/main/java/com/gooddata/connectors/Process.java create mode 100644 src/main/java/com/gooddata/connectors/ProcessExecution.java create mode 100644 src/main/java/com/gooddata/connectors/Settings.java create mode 100644 src/main/java/com/gooddata/connectors/Status.java create mode 100644 src/main/java/com/gooddata/connectors/Zendesk4Process.java create mode 100644 src/main/java/com/gooddata/connectors/Zendesk4Settings.java create mode 100644 src/main/java/com/gooddata/project/ProjectTemplate.java create mode 100644 src/main/java/com/gooddata/project/ProjectTemplates.java create mode 100644 src/test/java/com/gooddata/connectors/ConnectorServiceIT.java create mode 100644 src/test/java/com/gooddata/connectors/IntegrationTest.java create mode 100644 src/test/java/com/gooddata/connectors/ProcessTest.java create mode 100644 src/test/resources/connectors/integration.json create mode 100644 src/test/resources/connectors/process-error.json create mode 100644 src/test/resources/connectors/process-finished.json create mode 100644 src/test/resources/connectors/process-scheduled.json create mode 100644 src/test/resources/connectors/settings-zendesk4.json create mode 100644 src/test/resources/project/project-templates.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 7dcf2da0e..dc34081d8 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -4,6 +4,7 @@ package com.gooddata; import com.gooddata.account.AccountService; +import com.gooddata.connectors.ConnectorService; import com.gooddata.dataload.processes.ProcessService; import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; @@ -61,6 +62,7 @@ public class GoodData { private final DataStoreService dataStoreService; private final DatasetService datasetService; private final ReportService reportService; + private final ConnectorService connectorService; private final ProcessService processService; private final WarehouseService warehouseService; @@ -129,6 +131,7 @@ public GoodData(String hostname, String login, String password, int port) { reportService = new ReportService(restTemplate); processService = new ProcessService(restTemplate, accountService); warehouseService = new WarehouseService(restTemplate, hostname, port); + connectorService = new ConnectorService(restTemplate, projectService); } private RestTemplate createRestTemplate(String login, String password, String hostname, HttpClientBuilder builder, @@ -256,4 +259,7 @@ public ProcessService getProcessService() { public WarehouseService getWarehouseService() { return warehouseService; } + public ConnectorService getConnectorService() { + return connectorService; + } } diff --git a/src/main/java/com/gooddata/connectors/Connector.java b/src/main/java/com/gooddata/connectors/Connector.java new file mode 100644 index 000000000..85d4e02a1 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Connector.java @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +/** + * + */ +public enum Connector { + + ZENDESK4; + + public String getName() { + return name().toLowerCase(); + } + +} diff --git a/src/main/java/com/gooddata/connectors/ConnectorException.java b/src/main/java/com/gooddata/connectors/ConnectorException.java new file mode 100644 index 000000000..8c43feb35 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/ConnectorException.java @@ -0,0 +1,17 @@ +package com.gooddata.connectors; + +import com.gooddata.GoodDataException; + +/** + * Connector exception + */ +public class ConnectorException extends GoodDataException { + + public ConnectorException(final String message) { + super(message); + } + + public ConnectorException(final String message, final Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/gooddata/connectors/ConnectorProcess.java b/src/main/java/com/gooddata/connectors/ConnectorProcess.java new file mode 100644 index 000000000..e79a443cc --- /dev/null +++ b/src/main/java/com/gooddata/connectors/ConnectorProcess.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Connector process + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class ConnectorProcess { + + private final Status status; + private final String started; // todo date + private final String finished; // todo date + + @JsonCreator + protected ConnectorProcess(@JsonProperty("status") Status status, @JsonProperty("started") String started, + @JsonProperty("finished") String finished) { + this.status = status; + this.started = started; + this.finished = finished; + } + + public Status getStatus() { + return status; + } + + public String getStarted() { + return started; + } + + public String getFinished() { + return finished; + } + + @JsonIgnore + public boolean isFinished() { + return status != null && status.isFinished(); + } + + @JsonIgnore + public boolean isFailed() { + return status != null && status.isFailed(); + } +} diff --git a/src/main/java/com/gooddata/connectors/ConnectorService.java b/src/main/java/com/gooddata/connectors/ConnectorService.java new file mode 100644 index 000000000..d1249d239 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/ConnectorService.java @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import com.gooddata.AbstractService; +import com.gooddata.FutureResult; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.SimplePollHandler; +import com.gooddata.gdc.UriResponse; +import com.gooddata.project.Project; +import com.gooddata.project.ProjectService; +import com.gooddata.project.ProjectTemplate; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.io.IOException; +import java.util.Collection; + +import static com.gooddata.Validate.notNull; + +/** + * Connector Service + */ +public class ConnectorService extends AbstractService { + + private final ProjectService projectService; + + public ConnectorService(final RestTemplate restTemplate, final ProjectService projectService) { + super(restTemplate); + this.projectService = notNull(projectService, "projectService"); + } + + /** + * Create connector integration with given settings + * @param project project + * @param settings integration settings + * @return created integration + * @throws ConnectorException if integration can't be created + */ + public Integration createIntegration(final Project project, final Settings settings) { + notNull(project, "project"); + notNull(settings, "settings"); + final Collection projectTemplates = projectService.getProjectTemplates(project); + if (projectTemplates == null || projectTemplates.isEmpty()) { + throw new GoodDataException("Project " + project.getId() + " doesn't contain a template reference"); + } + final ProjectTemplate template = notNull(projectTemplates.iterator().next(), "project template"); + final Integration integration = createIntegration(project, settings.getConnector(), new Integration(template.getUrl())); + updateSettings(project, settings); + return integration; + } + + /** + * Create connector integration + * @param project project + * @param connector connector + * @param integration integration + * @return created integration + * @throws ConnectorException if integration can't be created + */ + public Integration createIntegration(final Project project, final Connector connector, final Integration integration) { + notNull(project, "project"); + notNull(connector, "connector"); + notNull(integration, "integration"); + try { + return restTemplate.postForObject(Integration.URL, integration, Integration.class, project.getId(), connector.getName()); + } catch (GoodDataRestException | RestClientException e) { + throw new ConnectorException("Unable to create " + connector + " integration", e); + } + } + + /** + * Update integration settings + * @param project project + * @param settings integration settings + * @throws ConnectorException if settings can't be updated + */ + public void updateSettings(final Project project, final T settings) { + notNull(settings, "settings"); + notNull(project, "project"); + try { + restTemplate.put(Settings.URL, settings, project.getId(), settings.getConnector().getName()); + } catch (GoodDataRestException | RestClientException e) { + throw new ConnectorException("Unable to set " + settings.getConnector() + " settings", e); + } + } + + /** + * Execute connector process + * @param project project + * @param execution process execution + * @return executed process + * @throws ConnectorException if process execution fails + */ + public FutureResult executeProcess(final Project project, final ProcessExecution execution) { + notNull(project, "project"); + notNull(execution, "execution"); + final String connectorName = execution.getConnector().getName(); + try { + final UriResponse response = restTemplate.postForObject(Process.URL, execution, UriResponse.class, project.getId(), connectorName); + return new FutureResult<>(this, new SimplePollHandler(response.getUri(), Process.class) { + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + final Process process = extractData(response, Process.class); + return process.isFinished(); + } + + @Override + public void handlePollResult(final Process pollResult) { + super.handlePollResult(pollResult); + if (pollResult.isFailed()) { + throw new ConnectorException("Unable to execute " + connectorName + " process: " + + pollResult.getStatus().getDescription()); + } + } + }); + } catch (GoodDataRestException | RestClientException e) { + throw new ConnectorException("Unable to execute " + connectorName + " process", e); + } + } +} diff --git a/src/main/java/com/gooddata/connectors/Integration.java b/src/main/java/com/gooddata/connectors/Integration.java new file mode 100644 index 000000000..2b897efcc --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Integration.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import static com.gooddata.Validate.notEmpty; + +/** + * Connectors integration + */ +@JsonTypeName("integration") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Integration { + + public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration"; + + private String projectTemplate; + private boolean active; + private final ConnectorProcess lastFinishedProcess; + private final ConnectorProcess lastSuccessfulProcess; + private final ConnectorProcess runningProcess; + + public Integration(final String projectTemplate) { + this(projectTemplate, true, null, null, null); + } + + @JsonCreator + Integration(@JsonProperty("projectTemplate") String projectTemplate, @JsonProperty("active") boolean active, + @JsonProperty("lastFinishedProcess") ConnectorProcess lastFinishedProcess, + @JsonProperty("lastSuccessfulProcess") ConnectorProcess lastSuccessfulProcess, + @JsonProperty("runningProcess") ConnectorProcess runningProcess) { + this.projectTemplate = notEmpty(projectTemplate, "projectTemplate"); + this.active = active; + this.lastFinishedProcess = lastFinishedProcess; + this.lastSuccessfulProcess = lastSuccessfulProcess; + this.runningProcess = runningProcess; + } + + public String getProjectTemplate() { + return projectTemplate; + } + + public void setProjectTemplate(final String projectTemplate) { + this.projectTemplate = notEmpty(projectTemplate, "projectTemplate"); + } + + public boolean isActive() { + return active; + } + + public void setActive(final boolean active) { + this.active = active; + } + + public ConnectorProcess getLastFinishedProcess() { + return lastFinishedProcess; + } + + public ConnectorProcess getLastSuccessfulProcess() { + return lastSuccessfulProcess; + } + + public ConnectorProcess getRunningProcess() { + return runningProcess; + } +} diff --git a/src/main/java/com/gooddata/connectors/Process.java b/src/main/java/com/gooddata/connectors/Process.java new file mode 100644 index 000000000..075c36516 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Process.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Connector process + */ +@JsonTypeName("process") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Process extends ConnectorProcess { + + public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/processes"; + + @JsonCreator + Process(@JsonProperty("status") Status status, @JsonProperty("started") String started, + @JsonProperty("finished") String finished) { + super(status, started, finished); + } + +} diff --git a/src/main/java/com/gooddata/connectors/ProcessExecution.java b/src/main/java/com/gooddata/connectors/ProcessExecution.java new file mode 100644 index 000000000..dede830f1 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/ProcessExecution.java @@ -0,0 +1,24 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Connector process execution + */ +@JsonTypeName("process") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public interface ProcessExecution { + + @JsonIgnore + Connector getConnector(); + +} diff --git a/src/main/java/com/gooddata/connectors/Settings.java b/src/main/java/com/gooddata/connectors/Settings.java new file mode 100644 index 000000000..6b3f65542 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Settings.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonIgnore; + +/** + * Integration settings + */ +public interface Settings { + + final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; + + @JsonIgnore + Connector getConnector(); + +} diff --git a/src/main/java/com/gooddata/connectors/Status.java b/src/main/java/com/gooddata/connectors/Status.java new file mode 100644 index 000000000..55df42032 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Status.java @@ -0,0 +1,48 @@ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Process status + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Status { + private final String code; + private final String detail; + private final String description; + + @JsonCreator + Status(@JsonProperty("code") String code, @JsonProperty("detail") String detail, + @JsonProperty("description") String description) { + this.code = code; + this.detail = detail; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDetail() { + return detail; + } + + public String getDescription() { + return description; + } + + @JsonIgnore + public boolean isFinished() { + return "SYNCHRONIZED".equalsIgnoreCase(code) || isFailed(); + } + + @JsonIgnore + public boolean isFailed() { + return "ERROR".equalsIgnoreCase(code) || "USER_ERROR".equalsIgnoreCase(code); + } +} diff --git a/src/main/java/com/gooddata/connectors/Zendesk4Process.java b/src/main/java/com/gooddata/connectors/Zendesk4Process.java new file mode 100644 index 000000000..d6ef55c2a --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Zendesk4Process.java @@ -0,0 +1,14 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +/** + * Zendesk4 connector process execution + */ +public class Zendesk4Process implements ProcessExecution { + @Override + public Connector getConnector() { + return Connector.ZENDESK4; + } +} diff --git a/src/main/java/com/gooddata/connectors/Zendesk4Settings.java b/src/main/java/com/gooddata/connectors/Zendesk4Settings.java new file mode 100644 index 000000000..bca893109 --- /dev/null +++ b/src/main/java/com/gooddata/connectors/Zendesk4Settings.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connectors; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import static com.gooddata.Validate.notEmpty; + +/** + * Zendesk 4 connector settings + */ +@JsonTypeName("settings") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Zendesk4Settings implements Settings { + + private String apiUrl; + private final String type; + private final String syncTime; + private final String syncTimeZone; + + public Zendesk4Settings(final String apiUrl) { + this(apiUrl, null, null, null); + } + + @JsonCreator + public Zendesk4Settings(@JsonProperty("apiUrl") String apiUrl, @JsonProperty("type") String type, + @JsonProperty("syncTime") String syncTime, @JsonProperty("syncTimeZone") String syncTimeZone) { + this.apiUrl = notEmpty(apiUrl, "apiUrl"); + this.type = type; + this.syncTime = syncTime; + this.syncTimeZone = syncTimeZone; + } + + public String getApiUrl() { + return apiUrl; + } + + public void setApiUrl(final String apiUrl) { + this.apiUrl = notEmpty(apiUrl, "apiUrl"); + } + + public String getType() { + return type; + } + + public String getSyncTime() { + return syncTime; + } + + public String getSyncTimeZone() { + return syncTimeZone; + } + + @Override + public Connector getConnector() { + return Connector.ZENDESK4; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index fedc510ae..0dd65a20e 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.util.Collection; +import java.util.Collections; import static com.gooddata.Validate.notEmpty; import static com.gooddata.Validate.notNull; @@ -148,4 +149,14 @@ public void removeProject(final Project project) { throw new GoodDataException("Unable to delete project " + project.getId(), e); } } + + public Collection getProjectTemplates(Project project) { + notNull(project, "project"); + try { + final ProjectTemplates templates = restTemplate.getForObject(ProjectTemplate.URI, ProjectTemplates.class, project.getId()); + return templates != null && templates.getTemplatesInfo() != null ? templates.getTemplatesInfo() : Collections.emptyList(); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to get project templates", e); + } + } } diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java new file mode 100644 index 000000000..0b1f24724 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Project template + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class ProjectTemplate { + + public static final String URI = "/gdc/md/{projectId}/templates"; + + private final String url; + private final String urn; + private final String version; + + @JsonCreator + public ProjectTemplate(@JsonProperty("url") String url, @JsonProperty("urn") String urn, + @JsonProperty("version") String version) { + this.url = url; + this.urn = urn; + this.version = version; + } + + public String getUrl() { + return url; + } + + public String getUrn() { + return urn; + } + + public String getVersion() { + return version; + } + +} diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java new file mode 100644 index 000000000..a05c37fcf --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; + +/** + * Project templates + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class ProjectTemplates { + + private final Collection templatesInfo; + + @JsonCreator + ProjectTemplates(@JsonProperty("templatesInfo") Collection templatesInfo) { + this.templatesInfo = templatesInfo; + } + + public Collection getTemplatesInfo() { + return templatesInfo; + } +} diff --git a/src/test/java/com/gooddata/connectors/ConnectorServiceIT.java b/src/test/java/com/gooddata/connectors/ConnectorServiceIT.java new file mode 100644 index 000000000..163090188 --- /dev/null +++ b/src/test/java/com/gooddata/connectors/ConnectorServiceIT.java @@ -0,0 +1,82 @@ +package com.gooddata.connectors; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.GoodDataException; +import com.gooddata.gdc.UriResponse; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class ConnectorServiceIT extends AbstractGoodDataIT { + private Project project; + private ConnectorService connectors; + + @BeforeMethod + public void setUp() throws Exception { + project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + connectors = gd.getConnectorService(); + } + + @Test + public void shouldCreateIntegration() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/templates") + .respond() + .withBody(readResource("/project/project-templates.json")); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") + .respond() + .withBody(readResource("/connectors/integration.json")); + + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/settings") + .respond() + .withStatus(200); + + final Zendesk4Settings settings = new Zendesk4Settings("http://zendesk"); + final Integration integration = connectors.createIntegration(project, settings); + assertThat(integration, notNullValue()); + } + + @Test + public void shouldExecuteProcess() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") + .respond() + .withBody(readResource("/connectors/process-scheduled.json")) + .thenRespond() + .withBody(readResource("/connectors/process-finished.json")) + ; + + final Process process = connectors.executeProcess(project, new Zendesk4Process()).get(); + assertThat(process.getStatus().getCode(), is("SYNCHRONIZED")); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailExecuteProcess() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") + .respond() + .withBody(readResource("/connectors/process-error.json")); + + connectors.executeProcess(project, new Zendesk4Process()).get(); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/connectors/IntegrationTest.java b/src/test/java/com/gooddata/connectors/IntegrationTest.java new file mode 100644 index 000000000..4ad088844 --- /dev/null +++ b/src/test/java/com/gooddata/connectors/IntegrationTest.java @@ -0,0 +1,24 @@ +package com.gooddata.connectors; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +public class IntegrationTest { + + @Test + public void shouldDeserialize() throws Exception { + final Integration integration = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/connectors/integration.json"), Integration.class); + assertThat(integration, is(notNullValue())); + assertThat(integration.isActive(), is(true)); + assertThat(integration.getProjectTemplate(), is("/projectTemplates/template")); + assertThat(integration.getLastFinishedProcess(), is(notNullValue())); + assertThat(integration.getLastSuccessfulProcess(), is(notNullValue())); + assertThat(integration.getRunningProcess(), is(nullValue())); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/connectors/ProcessTest.java b/src/test/java/com/gooddata/connectors/ProcessTest.java new file mode 100644 index 000000000..893608dbd --- /dev/null +++ b/src/test/java/com/gooddata/connectors/ProcessTest.java @@ -0,0 +1,24 @@ +package com.gooddata.connectors; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +public class ProcessTest { + + @Test + public void shouldDeserialize() throws Exception { + final Process process = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/connectors/process-error.json"), Process.class); + assertThat(process, is(notNullValue())); + assertThat(process.getFinished(), is(notNullValue())); + assertThat(process.getStarted(), is(notNullValue())); + assertThat(process.getStatus(), is(notNullValue())); + assertThat(process.getStatus().getCode(), is("ERROR")); + assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); + assertThat(process.getStatus().getDescription(), is("Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com")); + + } +} diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 04bf79811..eaa9e0692 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -10,9 +10,12 @@ import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import java.util.Collection; + public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -116,4 +119,15 @@ public void shouldRemoveProject() throws Exception { gd.getProjectService().removeProject(enabled); } + @Test + public void shouldReturnProjectTemplates() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/templates") + .respond() + .withBody(readResource("/project/project-templates.json")); + + final Collection templates = gd.getProjectService().getProjectTemplates(enabled); + assertThat(templates, is(notNullValue())); + assertThat(templates, hasSize(1)); + } } \ No newline at end of file diff --git a/src/test/resources/connectors/integration.json b/src/test/resources/connectors/integration.json new file mode 100644 index 000000000..2bbce476d --- /dev/null +++ b/src/test/resources/connectors/integration.json @@ -0,0 +1,37 @@ +{ + "integration" : { + "projectTemplate" : "/projectTemplates/template", + "active" : true, + "lastFinishedProcess" : { + "status" : { + "code" : "SYNCHRONIZED", + "detail" : null, + "description" : null + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : "2014-04-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + } + }, + "lastSuccessfulProcess" : { + "status" : { + "code" : "SYNCHRONIZED", + "detail" : null, + "description" : null + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : "2014-04-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + } + }, + "runningProcess" : null, + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration", + "processes" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes", + "configuration" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/settings" + }, + "ui" : { } + } +} diff --git a/src/test/resources/connectors/process-error.json b/src/test/resources/connectors/process-error.json new file mode 100644 index 000000000..d4b3dfb91 --- /dev/null +++ b/src/test/resources/connectors/process-error.json @@ -0,0 +1,14 @@ +{ + "process" : { + "status" : { + "code" : "ERROR", + "detail" : "GDC-INTERNAL-ERROR", + "description" : "Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com" + }, + "started" : "2014-04-29T13:13:41.000Z", + "finished" : "2014-04-29T13:14:14.000Z", + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/EKvjqfYyjiIftojiV1p9" + } + } +} \ No newline at end of file diff --git a/src/test/resources/connectors/process-finished.json b/src/test/resources/connectors/process-finished.json new file mode 100644 index 000000000..4da619af7 --- /dev/null +++ b/src/test/resources/connectors/process-finished.json @@ -0,0 +1,14 @@ +{ + "process" : { + "status" : { + "code" : "SYNCHRONIZED", + "detail" : null, + "description" : null + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : "2014-04-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + } + } +} \ No newline at end of file diff --git a/src/test/resources/connectors/process-scheduled.json b/src/test/resources/connectors/process-scheduled.json new file mode 100644 index 000000000..eae32ffb2 --- /dev/null +++ b/src/test/resources/connectors/process-scheduled.json @@ -0,0 +1,14 @@ +{ + "process" : { + "status" : { + "code" : "SCHEDULED", + "detail" : "", + "description" : "" + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : null, + "links" : { + "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + } + } +} \ No newline at end of file diff --git a/src/test/resources/connectors/settings-zendesk4.json b/src/test/resources/connectors/settings-zendesk4.json new file mode 100644 index 000000000..415a120fe --- /dev/null +++ b/src/test/resources/connectors/settings-zendesk4.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/project/project-templates.json b/src/test/resources/project/project-templates.json new file mode 100644 index 000000000..1a3107fa6 --- /dev/null +++ b/src/test/resources/project/project-templates.json @@ -0,0 +1,9 @@ +{ + "templatesInfo": [ + { + "url": "/projectTemplates/ZendeskAnalytics/11", + "urn": "urn:gooddata:ZendeskAnalytics", + "version": "11" + } + ] +} From fad8c1a55329e0543aa22f9c89c01cb1d50f44c1 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 17 Oct 2014 23:36:53 +0200 Subject: [PATCH 0079/1191] add test-output to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 4de838c23..b854c95e6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target *.i?? -.idea \ No newline at end of file +.idea +test-output From 3490302192a4d94a8f9f4f82f7828725923a6c0f Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 17 Oct 2014 23:39:43 +0200 Subject: [PATCH 0080/1191] unify constructors of UpdateScript --- src/main/java/com/gooddata/model/ModelDiff.java | 17 ++++++++++++----- .../java/com/gooddata/model/ModelDiffTest.java | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index 53b917bba..6e96f7ecc 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -105,17 +105,24 @@ static class UpdateScript { private Boolean preserveData; private Boolean cascadeDrops; + /** + * Create set of MAQL DDL scripts with one variant of side-effects (truncation of loaded data, drops of related objects...). + * + * @param preserveData true if data should be preserved, false if they should be truncated + * @param cascadeDrops true if related objects should be also dropped, false if not + * @param maqlChunks MAQL strings + */ @JsonCreator - UpdateScript(@JsonProperty("maqlDdlChunks") List maqlChunks, - @JsonProperty("preserveData") Boolean preserveData, - @JsonProperty("cascadeDrops") Boolean cascadeDrops) { - this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; + UpdateScript(@JsonProperty("preserveData") Boolean preserveData, + @JsonProperty("cascadeDrops") Boolean cascadeDrops, + @JsonProperty("maqlDdlChunks") List maqlChunks) { this.preserveData = preserveData; this.cascadeDrops = cascadeDrops; + this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; } UpdateScript(boolean preserveData, boolean cascadeDrops, String... maqlChunks) { - this(asList(maqlChunks), preserveData, cascadeDrops); + this(preserveData, cascadeDrops, asList(maqlChunks)); } public List getMaqlChunks() { diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 0cb56693b..72a92aa16 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -66,7 +66,7 @@ public void testGetUpdateMaqlsNoUpdateScript() throws Exception { @Test public void testGetUpdateMaqlsNoMaqlInUpdateScript() throws Exception { - final ModelDiff diff = new ModelDiff(new UpdateScript(Collections.emptyList(), true, false)); + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); assertThat(diff.getUpdateMaql(), hasSize(0)); } From 9b69bc3f1163ac0f72f9fe724942679cc203362e Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 17 Oct 2014 23:40:34 +0200 Subject: [PATCH 0081/1191] add asserts to ModelServiceIT --- src/test/java/com/gooddata/model/ModelServiceIT.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 436847b47..37b0ba108 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -8,6 +8,9 @@ import static com.gooddata.model.ModelDiff.UpdateScript; import static net.jadler.Jadler.onRequest; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; public class ModelServiceIT extends AbstractGoodDataIT { @@ -42,7 +45,10 @@ public void shouldCreateDiff() throws Exception { .withBody(readResource("/model/modelDiff.json")) ; - gd.getModelService().getProjectModelDiff(project, "xxx").get(); + final ModelDiff diff = gd.getModelService().getProjectModelDiff(project, "xxx").get(); + + assertThat(diff, is(notNullValue())); + assertThat(diff.getUpdateMaql().get(0), is("CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee} PRESERVE DATA;")); } @Test @@ -65,8 +71,8 @@ public void shouldUpdateModel() throws Exception { ; final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, - "synchronize {dataset.person} preserve data", - "synchronize {dataset.person} preserve data" + "synchronize {dataset.chunk1} preserve data", + "synchronize {dataset.chunk2} preserve data" )); gd.getModelService().updateProjectModel(project, diff).get(); } From 8058a17f85651a62df2d2acc528f88114846e5bc Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 17 Oct 2014 23:41:44 +0200 Subject: [PATCH 0082/1191] add and improve some javadocs --- .../com/gooddata/AbstractPollHandler.java | 2 +- .../com/gooddata/AbstractPollHandlerBase.java | 2 +- src/main/java/com/gooddata/FutureResult.java | 2 +- src/main/java/com/gooddata/PollHandler.java | 36 ++++++++++++++----- .../java/com/gooddata/SimplePollHandler.java | 2 +- .../java/com/gooddata/model/ModelDiff.java | 29 +++++++++++++++ .../java/com/gooddata/model/ModelService.java | 15 +++++--- 7 files changed, 71 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractPollHandler.java b/src/main/java/com/gooddata/AbstractPollHandler.java index ed82185b3..838b63423 100644 --- a/src/main/java/com/gooddata/AbstractPollHandler.java +++ b/src/main/java/com/gooddata/AbstractPollHandler.java @@ -8,7 +8,7 @@ import static com.gooddata.Validate.notNull; /** - * For internal usage by services employing polling.

+ * For internal use by services employing polling.

* Implementing classes should override {@link #isFinished(ClientHttpResponse)} method and * may override {@link #onFinish()} and {@link #handlePollResult(Object)} methods. * diff --git a/src/main/java/com/gooddata/AbstractPollHandlerBase.java b/src/main/java/com/gooddata/AbstractPollHandlerBase.java index c63d9234e..e36f7aa1e 100644 --- a/src/main/java/com/gooddata/AbstractPollHandlerBase.java +++ b/src/main/java/com/gooddata/AbstractPollHandlerBase.java @@ -11,7 +11,7 @@ import static com.gooddata.Validate.notNull; /** - * For internal usage by services employing polling.

+ * For internal use by services employing polling.

* * @param

polling type * @param result type diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index 22c1b85c5..592af7c6e 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -18,7 +18,7 @@ public final class FutureResult { /** * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

- * For internal usage by services employing polling. + * For internal use by services employing polling. * * @param service this service * @param handler poll handler diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index f5e33e09d..85bf61922 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -8,7 +8,7 @@ import java.io.IOException; /** - * For internal usage by services employing polling.

+ * For internal use by services employing polling.

* @param

polling type * @param result type * @@ -17,33 +17,53 @@ public interface PollHandler { /** - * Get URI used for polling + * Get URI used for polling. * * @return URI string */ String getPollingUri(); + /** + * Get class of result after polling. + * + * @return result class + */ Class getResultClass(); + /** + * Get class of the polling object. + * + * @return polling class + */ Class

getPollClass(); + /** + * Returns true when the polling is done, false otherwise. + * + * @return true when the polling is done, false otherwise + */ boolean isDone(); /** - * Return result of polling + * Return result after polling. * - * @return result + * @return result after polling */ R getResult(); /** - * Check if polling should finish + * Check single polling response if whole polling process should finish. * - * @param response client side http response - * @return true if polling should finish - * @throws IOException + * @param response client side HTTP response + * @return true if polling should finish, false otherwise + * @throws IOException when there's a problem extracting data from response */ boolean isFinished(ClientHttpResponse response) throws IOException; + /** + * Handle result of single polling request. + * + * @param pollResult result of polling request + */ void handlePollResult(P pollResult); } diff --git a/src/main/java/com/gooddata/SimplePollHandler.java b/src/main/java/com/gooddata/SimplePollHandler.java index 40f18f529..d45677721 100644 --- a/src/main/java/com/gooddata/SimplePollHandler.java +++ b/src/main/java/com/gooddata/SimplePollHandler.java @@ -1,7 +1,7 @@ package com.gooddata; /** - * For internal usage by services employing polling.

+ * For internal use by services employing polling.

* A simple poll handler using same type for polling and result. * * @param polling and result type diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index 6e96f7ecc..66d0633e4 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -36,6 +36,10 @@ public class ModelDiff { this.updateScripts = updateScripts == null ? Collections.emptyList() : updateScripts; } + /** + * @param updateScripts several variants of MAQL DDL evolution scripts that should be executed to update + * the source model to the target state + */ ModelDiff(UpdateScript... updateScripts) { this(asList(updateScripts)); } @@ -96,6 +100,9 @@ private UpdateScript getUpdateScriptByFlags(final boolean preserveData, final bo return result; } + /** + * Set of MAQL DDL scripts with one variant of side-effects (truncation of loaded data, drops of related objects...). + */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("updateScript") @JsonIgnoreProperties(ignoreUnknown = true) @@ -121,18 +128,40 @@ static class UpdateScript { this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; } + /** + * Create set of MAQL DDL scripts with one variant of side-effects (truncation of loaded data, drops of related objects...). + * + * @param preserveData true if data should be preserved, false if they should be truncated + * @param cascadeDrops true if related objects should be also dropped, false if not + * @param maqlChunks MAQL strings + */ UpdateScript(boolean preserveData, boolean cascadeDrops, String... maqlChunks) { this(preserveData, cascadeDrops, asList(maqlChunks)); } + /** + * Returns MAQL strings. + * + * @return MAQL strings + */ public List getMaqlChunks() { return maqlChunks; } + /** + * Returns true if data should be preserved, false if they should be truncated. + * + * @return true if data should be preserved, false if they should be truncated + */ public Boolean isPreserveData() { return preserveData; } + /** + * Returns true if related objects should be also dropped, false if not + * + * @return true if related objects should be also dropped, false if not + */ public Boolean isCascadeDrops() { return cascadeDrops; } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index ffb15159e..b6ecf8c9d 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -89,6 +89,7 @@ public FutureResult updateProjectModel(Project project, UpdateScript updat /** * Update project model with the given update script(s) (MAQL). + * * @param project project to be updated * @param maqlDdl update script to be executed in the project * @return poll result @@ -99,6 +100,7 @@ public FutureResult updateProjectModel(final Project project, final String /** * Update project model with the given update script(s) (MAQL). + * * @param project project to be updated * @param maqlDdl update script to be executed in the project * @return poll result @@ -119,11 +121,9 @@ public FutureResult updateProjectModel(final Project project, final Collec executeNextMaqlChunk(); } - @Override - public String getPollingUri() { - return pollUri; - } - + /** + * @return true if polling should finish, false otherwise + */ private boolean executeNextMaqlChunk() { if (maqlChunks.isEmpty()) { return true; @@ -138,6 +138,11 @@ private boolean executeNextMaqlChunk() { return false; } + @Override + public String getPollingUri() { + return pollUri; + } + @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { if (!super.isFinished(response)) { From 20de017a1faf2b6bb7bd7c76f6893f27eb74dbb6 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 25 Oct 2014 15:20:23 +0200 Subject: [PATCH 0083/1191] add encoding for failsafe plugin --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 45a0d738c..80ed7aaf5 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,7 @@ 1.7 UTF-8 + UTF-8 4.3.2 From 5a8e5c80439264f7a087527a4e609e42805d80d1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 29 Oct 2014 18:46:26 +0100 Subject: [PATCH 0084/1191] Add Enums section and formatting changes --- CONTRIBUTE.md | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 6944b48d2..d6b7d2ee3 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -1,37 +1,41 @@ # GoodData Java SDK - Contribution guide -Below are few rules, recommendations and best practices we try to follow when developing GoodData Java SDK. +Below are few **rules, recommendations and best practices** we try to follow when developing the _GoodData Java SDK_. ## Design ### Structure -* Create packages for API parts containing DTOs and services related to API part. +* **Package names** for DTOs and services should be named in the same manner as REST API. * Don't create single implementation interfaces for services. ### DTOs -* All DTOs which can be updated should be mutable. Please keep mutable only the fields which are subject of change, the rest should be immutable. -* Create method named `String getUri()` to provide link to self. -* Introduce constants: +* All DTOs which can be updated should be **mutable**. Please keep mutable only the fields which are subject of change, the rest should be immutable. +* Create method named `String getUri()` to provide **link to self**. +* Introduce **constants**: ```java public static final String URI = "/gdc/someresource/{resource-id}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); ``` -* Consider the visibility - use _package protected_ when DTO is not intended for SDK user, but is needed in related service. +* Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed in related service. + +### Enums +* Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use them when deserializing**. +* Where make sense, use overloaded methods with an enum argument as well as `String` argument. ### Services -* When programming client for some polling return [FutureResult](src/main/java/com/gooddata/FutureResult.java) to enable user asynchronous call. -* Create custom [GoodDataException](src/main/java/com/gooddata/GoodDataException.java) when you feel the case is specific enough. -* Prefer DTOs as arguments instead of Strings or primitives. -* Methods preferred naming: - * `get*()` when searching form single object (throwing exception when no or multiple objects found) - * `find*()` when searching for multiple objects (collection of objects) +* When programming client for some polling return [`FutureResult`](src/main/java/com/gooddata/FutureResult.java)` to enable user asynchronous call. +* Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java)` when you feel the case is specific enough. +* Prefer DTOs to `String` or primitive arguments. +* **Method naming**: + * `get*()` when searching form single object (throwing exception when no or multiple objects are found, never null) + * `find*()` when searching for multiple objects (collection of objects, never null) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` -* Test class naming: +* **Test class naming**: * `*Test` unit tests - * `*IT` integration tests (see AbstractGoodDataIT) + * `*IT` integration tests (see [`AbstractGoodDataIT`](src/test/java/com/gooddata/AbstractGoodDataIT.java)) ## Best practices -* Test all DTOs using [json-unit](https://github.com/lukas-krecan/JsonUnit). -* Write integration tests for services using [jadler](https://github.com/jadler-mocking/jadler/wiki). -* Everything public should be documented using _javadoc_. -* When you need some utility code, look for handy utilities in used libraries first (e.g. Spring has its StreamUtils, FileCopyUtils, ...). When you decide to create new utility class, use _abstract utility class pattern_. +* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. +* Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. +* Everything public should be **documented** using _javadoc_. +* When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. From 29448aed538be85f01c81889d84a92ed843cdaf0 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 29 Oct 2014 19:01:03 +0100 Subject: [PATCH 0085/1191] Update CONTRIBUTE.md --- CONTRIBUTE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index d6b7d2ee3..e815aab77 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -27,8 +27,8 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); * Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java)` when you feel the case is specific enough. * Prefer DTOs to `String` or primitive arguments. * **Method naming**: - * `get*()` when searching form single object (throwing exception when no or multiple objects are found, never null) - * `find*()` when searching for multiple objects (collection of objects, never null) + * `get*()` when searching form single object (throw exception when no or multiple objects are found, never return `null`) + * `find*()` when searching for multiple objects (collection of objects, never return `null`) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` * **Test class naming**: * `*Test` unit tests From 93a97a91022210aa8a8d13a7c1b93715417769e8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 29 Oct 2014 21:12:18 +0100 Subject: [PATCH 0086/1191] Use new Warehouse URI: /gdc/datawarehouse --- .../com/gooddata/warehouse/Warehouse.java | 4 +-- .../com/gooddata/warehouse/WarehouseTask.java | 2 +- .../com/gooddata/warehouse/Warehouses.java | 4 +-- .../warehouse/WarehouseServiceIT.java | 2 +- .../gooddata/warehouse/WarehouseTaskTest.java | 4 +-- .../resources/warehouse/warehouse-create.json | 2 +- src/test/resources/warehouse/warehouse.json | 10 +++---- .../warehouse/warehouseTask-finished.json | 4 +-- .../warehouse/warehouseTask-poll.json | 2 +- src/test/resources/warehouse/warehouses.json | 26 +++++++++---------- 10 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 828680c3b..56ddc12ae 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -17,7 +17,7 @@ * Warehouse */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("dssInstance") +@JsonTypeName("instance") @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Warehouse { @@ -26,7 +26,7 @@ public class Warehouse { public static final String URI = Warehouses.URI + "/{" + ID_PARAM + "}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); - public static final UriTemplate JDBC_CONNECTION_TEMPLATE = new UriTemplate("jdbc:dss://{host}:{port}/gdc/dss/instances/{id}"); + public static final UriTemplate JDBC_CONNECTION_TEMPLATE = new UriTemplate("jdbc:gdc:datawarehouse://{host}:{port}/gdc/datawarehouse/instances/{id}"); private static final String SELF_LINK = "self"; private static final String STATUS_ENABLED = "ENABLED"; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index 8d3b7806f..c8b6f39d3 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -17,7 +17,7 @@ class WarehouseTask { private static final String POLL_LINK = "poll"; - private static final String WAREHOUSE_LINK = "dssInstance"; + private static final String WAREHOUSE_LINK = "instance"; private final Map links; diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index 5a3f144f6..cbf797d73 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -12,11 +12,11 @@ * List of warehouses. Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("dssInstances") +@JsonTypeName("instances") @JsonIgnoreProperties(ignoreUnknown = true) class Warehouses { - static final String URI = "/gdc/dss/instances"; + static final String URI = "/gdc/datawarehouse/instances"; private final List items; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 910ca6b62..c777b2b6c 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -65,7 +65,7 @@ public void shouldCreateWarehouse() throws Exception { final Warehouse created = gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); assertThat(created, notNullValue()); assertThat(created.getTitle(), is(TITLE)); - assertThat(created.getJdbcConnectionString(), is("jdbc:dss://localhost:" + port() + WAREHOUSE_URI)); + assertThat(created.getJdbcConnectionString(), is("jdbc:gdc:datawarehouse://localhost:" + port() + WAREHOUSE_URI)); } @Test diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 1abe45473..bfc496698 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -13,13 +13,13 @@ public class WarehouseTaskTest { @Test public void testDeserializePoll() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-poll.json"); - assertThat(warehouseTask.getPollLink(), is("/gdc/dss/executions/executionId")); + assertThat(warehouseTask.getPollLink(), is("/gdc/datawarehouse/executions/executionId")); } @Test public void testDeserializeInstance() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-finished.json"); - assertThat(warehouseTask.getWarehouseLink(), is("/gdc/dss/instances/instanceId")); + assertThat(warehouseTask.getWarehouseLink(), is("/gdc/datawarehouse/instances/instanceId")); } private WarehouseTask deserialize(String path) throws Exception { diff --git a/src/test/resources/warehouse/warehouse-create.json b/src/test/resources/warehouse/warehouse-create.json index 0546e5f3b..9ac123a17 100644 --- a/src/test/resources/warehouse/warehouse-create.json +++ b/src/test/resources/warehouse/warehouse-create.json @@ -1,5 +1,5 @@ { - "dssInstance": { + "instance": { "title": "New ADS", "authorizationToken": "Your-ADS-Token", "description": "ADS Description" diff --git a/src/test/resources/warehouse/warehouse.json b/src/test/resources/warehouse/warehouse.json index bd2bfe165..bd19dc42a 100644 --- a/src/test/resources/warehouse/warehouse.json +++ b/src/test/resources/warehouse/warehouse.json @@ -1,5 +1,5 @@ { - "dssInstance" : { + "instance" : { "title" : "Test", "description" : "Storage", "status" : "ENABLED", @@ -9,10 +9,10 @@ "createdBy" : "/gdc/account/profile/createdBy", "updatedBy" : "/gdc/account/profile/updatedBy", "links" : { - "self" : "/gdc/dss/instances/instanceId", - "parent" : "/gdc/dss/instances", - "users" : "/gdc/dss/instances/instanceId/users", - "jdbc" : "/gdc/dss/instances/instanceId/jdbc" + "self" : "/gdc/datawarehouse/instances/instanceId", + "parent" : "/gdc/datawarehouse/instances", + "users" : "/gdc/datawarehouse/instances/instanceId/users", + "jdbc" : "/gdc/datawarehouse/instances/instanceId/jdbc" } } } \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouseTask-finished.json b/src/test/resources/warehouse/warehouseTask-finished.json index cbb131bca..a43b37299 100644 --- a/src/test/resources/warehouse/warehouseTask-finished.json +++ b/src/test/resources/warehouse/warehouseTask-finished.json @@ -1,9 +1,9 @@ { "asyncTask": { "links": { - "dssInstance": "/gdc/dss/instances/instanceId", + "instance": "/gdc/datawarehouse/instances/instanceId", "user": "user URI", - "users": "URI of users in DSS Instance" + "users": "URI of users in Instance" } } } \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouseTask-poll.json b/src/test/resources/warehouse/warehouseTask-poll.json index cd26a4eec..3ebc5f4b9 100644 --- a/src/test/resources/warehouse/warehouseTask-poll.json +++ b/src/test/resources/warehouse/warehouseTask-poll.json @@ -1,7 +1,7 @@ { "asyncTask" : { "links" : { - "poll" : "/gdc/dss/executions/executionId" + "poll" : "/gdc/datawarehouse/executions/executionId" } } } \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouses.json b/src/test/resources/warehouse/warehouses.json index 89863b7c3..e616baead 100644 --- a/src/test/resources/warehouse/warehouses.json +++ b/src/test/resources/warehouse/warehouses.json @@ -1,7 +1,7 @@ { - "dssInstances" : { + "instances" : { "items" : [ { - "dssInstance" : { + "instance" : { "title" : "Storage", "description" : "Testing Storage", "status" : "ENABLED", @@ -11,14 +11,14 @@ "createdBy" : "/gdc/account/profile/{profile-id}", "updatedBy" : "/gdc/account/profile/{profile-id}", "links" : { - "self" : "/gdc/dss/instances/{instance-id}", - "parent" : "/gdc/dss/instances", - "users" : "/gdc/dss/instances/{instance-id}/users", - "jdbc" : "/gdc/dss/instances/{instance-id}/jdbc" + "self" : "/gdc/datawarehouse/instances/{instance-id}", + "parent" : "/gdc/datawarehouse/instances", + "users" : "/gdc/datawarehouse/instances/{instance-id}/users", + "jdbc" : "/gdc/datawarehouse/instances/{instance-id}/jdbc" } } }, { - "dssInstance" : { + "instance" : { "title" : "Salesforce", "description" : "Test", "status" : "ENABLED", @@ -28,16 +28,16 @@ "createdBy" : "/gdc/account/profile/{profile-id}", "updatedBy" : "/gdc/account/profile/{profile-id}", "links" : { - "self" : "/gdc/dss/instances/{instance-id}", - "parent" : "/gdc/dss/instances", - "users" : "/gdc/dss/instances/{instance-id}/users", - "jdbc" : "/gdc/dss/instances/{instance-id}/jdbc" + "self" : "/gdc/datawarehouse/instances/{instance-id}", + "parent" : "/gdc/datawarehouse/instances", + "users" : "/gdc/datawarehouse/instances/{instance-id}/users", + "jdbc" : "/gdc/datawarehouse/instances/{instance-id}/jdbc" } } } ], "links" : { - "parent" : "/gdc/dss", - "self" : "/gdc/dss/instances" + "parent" : "/gdc/datawarehouse", + "self" : "/gdc/datawarehouse/instances" } } } \ No newline at end of file From c7c8f131935cd34d309a38df7eee5e40aafa79e7 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Oct 2014 08:08:36 +0100 Subject: [PATCH 0087/1191] fix: description in Warehouse constructor is optional --- src/main/java/com/gooddata/warehouse/Warehouse.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 828680c3b..11d1019c2 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -45,11 +45,14 @@ public class Warehouse { private String warehouseHost; private int warehousePort = 443; + public Warehouse(String title, String authToken) { + this(title, authToken, null); + } public Warehouse(String title, String authToken, String description) { this.title = notNull(title, "title"); this.authorizationToken = notNull(authToken, "authToken"); - this.description = notNull(description, "description"); + this.description = description; } @JsonCreator From 9df03b3d0fc5256c12d25de0d88199f9d3be7d25 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Oct 2014 18:26:11 +0100 Subject: [PATCH 0088/1191] fix JavaDoc errors (to comply with Java 8 JavaDoc parser) --- src/main/java/com/gooddata/GoodData.java | 5 +++-- src/main/java/com/gooddata/ZipUtils.java | 2 ++ src/main/java/com/gooddata/md/AbstractObj.java | 1 + src/main/java/com/gooddata/model/DiffRequest.java | 1 + src/main/java/com/gooddata/model/ModelDiff.java | 5 ++--- src/main/java/com/gooddata/project/ProjectService.java | 5 ++--- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index dc34081d8..b6f1fc336 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -34,10 +34,10 @@ /** * Entry point for GoodData SDK usage. - *

+ *

* Configure connection to GoodData using one of constructors. One can then get initialized service he needs from * the newly constructed instance. This instance can be also used later for logout from GoodData Platform. - *

+ *

* Usage example: *


  *     GoodData gd = new GoodData("roman@gooddata.com", "Roman1");
@@ -95,6 +95,7 @@ public GoodData(String hostname, String login, String password) {
      * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com)
      * @param login    GoodData user's login
      * @param password GoodData user's password
+     * @param port     GoodData Platform's API port (e.g. 443)
      */
     public GoodData(String hostname, String login, String password, int port) {
         this(hostname, login, password, port, PROTOCOL);
diff --git a/src/main/java/com/gooddata/ZipUtils.java b/src/main/java/com/gooddata/ZipUtils.java
index efe0f9c61..0e3594b98 100644
--- a/src/main/java/com/gooddata/ZipUtils.java
+++ b/src/main/java/com/gooddata/ZipUtils.java
@@ -23,6 +23,7 @@ public abstract class ZipUtils {
      *
      * @param file file to be zipped
      * @param output stream where the output will be written
+     * @throws IOException if zip creation fails
      */
     public static void zip(File file, OutputStream output) throws IOException {
         zip(file, output, false);
@@ -35,6 +36,7 @@ public static void zip(File file, OutputStream output) throws IOException {
      * @param file file to be zipped
      * @param output stream where the output will be written
      * @param includeRoot if root dir should be included
+     * @throws IOException if zip creation fails
      */
     public static void zip(File file, OutputStream output, boolean includeRoot) throws IOException {
         notNull(file, "file");
diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java
index f5eb2bfc1..de6902898 100644
--- a/src/main/java/com/gooddata/md/AbstractObj.java
+++ b/src/main/java/com/gooddata/md/AbstractObj.java
@@ -88,6 +88,7 @@ public Integer getUnlisted() {
     /**
      * Get list of URIs of the given {@link Obj}s
      * @param objs metadata objects
+     * @param  Obj type
      * @return list of URIs
      */
     @SafeVarargs
diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java
index df9543b56..4e03a2068 100644
--- a/src/main/java/com/gooddata/model/DiffRequest.java
+++ b/src/main/java/com/gooddata/model/DiffRequest.java
@@ -37,6 +37,7 @@ public DiffRequest(String targetModel) {
 
     /**
      * Returns desired target state of project model
+     * @return desired target state of project model
      */
     public String getTargetModel() {
         return targetModel;
diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java
index 66d0633e4..da41c2042 100644
--- a/src/main/java/com/gooddata/model/ModelDiff.java
+++ b/src/main/java/com/gooddata/model/ModelDiff.java
@@ -47,7 +47,7 @@ public class ModelDiff {
     /**
      * Returns several variants of MAQL DDL evolution scripts that should be executed to update the source model to the
      * target state. Individual variants differ in their side-effects (truncation of loaded data, drops of related objects...)
-     * 

+ *

* Will be empty for empty diff. */ List getUpdateScripts() { @@ -57,7 +57,7 @@ List getUpdateScripts() { /** * Returns MAQL DDL update script that should be executed to update the source model to the * target state. - *

+ *

* It picks the best possible variant by it's side-effects (truncation * of loaded data, drops of related objects). It returns first present variant by order: *

    @@ -66,7 +66,6 @@ List getUpdateScripts() { *
  1. preserve data + cascade drops
  2. *
  3. no preserve data + cascade drops
  4. *
- *

* Returned list will be empty if there are no differences. * * @return MAQL DDL update scripts. Empty list if there are no differences. diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 0dd65a20e..edb18a4bb 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -24,12 +24,11 @@ /** * List projects, create a project, ... - *

- *

+ *

* Usage example: *


  *     ProjectService projectService = gd.getProjectService();
- *     Collection projects = projectService.getProjects();
+ *     Collection<Project> projects = projectService.getProjects();
  *     Project project = projectService.createProject(new Project("my project", "MyToken"));
  * 
*/ From 24024f52d846279255f3549d56df2cb6f4d78051 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 25 Oct 2014 15:12:10 +0200 Subject: [PATCH 0089/1191] connectors tuning add tests, unify package name, add javadocs --- src/main/java/com/gooddata/GoodData.java | 2 +- .../ConnectorException.java | 4 +- .../ConnectorProcess.java | 18 +++- .../ConnectorService.java | 52 ++++++---- .../ConnectorType.java} | 6 +- .../Integration.java | 10 +- .../{connectors => connector}/Process.java | 6 +- .../ProcessExecution.java | 6 +- .../java/com/gooddata/connector/Settings.java | 26 +++++ .../java/com/gooddata/connector/Status.java | 73 ++++++++++++++ .../gooddata/connector/Zendesk4Process.java | 17 ++++ .../Zendesk4Settings.java | 25 +++-- .../com/gooddata/connectors/Settings.java | 18 ---- .../java/com/gooddata/connectors/Status.java | 48 ---------- .../gooddata/connectors/Zendesk4Process.java | 14 --- .../com/gooddata/project/ProjectTemplate.java | 3 +- .../gooddata/project/ProjectTemplates.java | 3 +- .../connector/ConnectorProcessTest.java | 94 +++++++++++++++++++ .../ConnectorServiceIT.java | 17 ++-- .../IntegrationTest.java | 20 +++- .../connector/ProcessExecutionTest.java | 25 +++++ .../ProcessTest.java | 13 ++- .../com/gooddata/connector/StatusTest.java | 67 +++++++++++++ .../connector/Zendesk4SettingsTest.java | 59 ++++++++++++ .../gooddata/project/ProjectTemplateTest.java | 25 +++++ .../project/ProjectTemplatesTest.java | 25 +++++ .../connector/connector-process.json | 12 +++ .../resources/connector/integration-in.json | 6 ++ src/test/resources/connector/integration.json | 37 ++++++++ .../process-error.json | 2 +- .../process-finished.json | 2 +- src/test/resources/connector/process-in.json | 3 + .../process-scheduled.json | 2 +- .../settings-zendesk4.json | 0 .../resources/connectors/integration.json | 37 -------- .../resources/project/project-template.json | 5 + 36 files changed, 592 insertions(+), 190 deletions(-) rename src/main/java/com/gooddata/{connectors => connector}/ConnectorException.java (80%) rename src/main/java/com/gooddata/{connectors => connector}/ConnectorProcess.java (63%) rename src/main/java/com/gooddata/{connectors => connector}/ConnectorService.java (76%) rename src/main/java/com/gooddata/{connectors/Connector.java => connector/ConnectorType.java} (62%) rename src/main/java/com/gooddata/{connectors => connector}/Integration.java (84%) rename src/main/java/com/gooddata/{connectors => connector}/Process.java (83%) rename src/main/java/com/gooddata/{connectors => connector}/ProcessExecution.java (83%) create mode 100644 src/main/java/com/gooddata/connector/Settings.java create mode 100644 src/main/java/com/gooddata/connector/Status.java create mode 100644 src/main/java/com/gooddata/connector/Zendesk4Process.java rename src/main/java/com/gooddata/{connectors => connector}/Zendesk4Settings.java (66%) delete mode 100644 src/main/java/com/gooddata/connectors/Settings.java delete mode 100644 src/main/java/com/gooddata/connectors/Status.java delete mode 100644 src/main/java/com/gooddata/connectors/Zendesk4Process.java create mode 100644 src/test/java/com/gooddata/connector/ConnectorProcessTest.java rename src/test/java/com/gooddata/{connectors => connector}/ConnectorServiceIT.java (81%) rename src/test/java/com/gooddata/{connectors => connector}/IntegrationTest.java (59%) create mode 100644 src/test/java/com/gooddata/connector/ProcessExecutionTest.java rename src/test/java/com/gooddata/{connectors => connector}/ProcessTest.java (74%) create mode 100644 src/test/java/com/gooddata/connector/StatusTest.java create mode 100644 src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectTemplateTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectTemplatesTest.java create mode 100644 src/test/resources/connector/connector-process.json create mode 100644 src/test/resources/connector/integration-in.json create mode 100644 src/test/resources/connector/integration.json rename src/test/resources/{connectors => connector}/process-error.json (73%) rename src/test/resources/{connectors => connector}/process-finished.json (65%) create mode 100644 src/test/resources/connector/process-in.json rename src/test/resources/{connectors => connector}/process-scheduled.json (62%) rename src/test/resources/{connectors => connector}/settings-zendesk4.json (100%) delete mode 100644 src/test/resources/connectors/integration.json create mode 100644 src/test/resources/project/project-template.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index dc34081d8..3fda66140 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -4,7 +4,7 @@ package com.gooddata; import com.gooddata.account.AccountService; -import com.gooddata.connectors.ConnectorService; +import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.processes.ProcessService; import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; diff --git a/src/main/java/com/gooddata/connectors/ConnectorException.java b/src/main/java/com/gooddata/connector/ConnectorException.java similarity index 80% rename from src/main/java/com/gooddata/connectors/ConnectorException.java rename to src/main/java/com/gooddata/connector/ConnectorException.java index 8c43feb35..cd7b8f136 100644 --- a/src/main/java/com/gooddata/connectors/ConnectorException.java +++ b/src/main/java/com/gooddata/connector/ConnectorException.java @@ -1,9 +1,9 @@ -package com.gooddata.connectors; +package com.gooddata.connector; import com.gooddata.GoodDataException; /** - * Connector exception + * Represents error in ConnectorService. */ public class ConnectorException extends GoodDataException { diff --git a/src/main/java/com/gooddata/connectors/ConnectorProcess.java b/src/main/java/com/gooddata/connector/ConnectorProcess.java similarity index 63% rename from src/main/java/com/gooddata/connectors/ConnectorProcess.java rename to src/main/java/com/gooddata/connector/ConnectorProcess.java index e79a443cc..a61277bdf 100644 --- a/src/main/java/com/gooddata/connectors/ConnectorProcess.java +++ b/src/main/java/com/gooddata/connector/ConnectorProcess.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; @@ -10,7 +10,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Connector process + * Connector process (= single ETL run). Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @@ -22,7 +22,7 @@ public class ConnectorProcess { @JsonCreator protected ConnectorProcess(@JsonProperty("status") Status status, @JsonProperty("started") String started, - @JsonProperty("finished") String finished) { + @JsonProperty("finished") String finished) { this.status = status; this.started = started; this.finished = finished; @@ -40,11 +40,23 @@ public String getFinished() { return finished; } + /** + * Returns true when the connector process has already finished (no matter if it was successful). + * NOTE: It also returns false in case of inability to resolve the code (e.g. API change) + * + * @return true when the connector process has already finished, false otherwise + */ @JsonIgnore public boolean isFinished() { return status != null && status.isFinished(); } + /** + * Returns true when the connector process failed. + * NOTE: It also returns false in case of inability to resolve the code (e.g. API change) + * + * @return true when the connector process failed, false otherwise + */ @JsonIgnore public boolean isFailed() { return status != null && status.isFailed(); diff --git a/src/main/java/com/gooddata/connectors/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java similarity index 76% rename from src/main/java/com/gooddata/connectors/ConnectorService.java rename to src/main/java/com/gooddata/connector/ConnectorService.java index d1249d239..4bc2cbe74 100644 --- a/src/main/java/com/gooddata/connectors/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import com.gooddata.AbstractService; import com.gooddata.FutureResult; @@ -22,7 +22,7 @@ import static com.gooddata.Validate.notNull; /** - * Connector Service + * Service for connector integration creation, update of its settings or execution of its process. */ public class ConnectorService extends AbstractService { @@ -35,7 +35,8 @@ public ConnectorService(final RestTemplate restTemplate, final ProjectService pr /** * Create connector integration with given settings - * @param project project + * + * @param project project * @param settings integration settings * @return created integration * @throws ConnectorException if integration can't be created @@ -43,54 +44,63 @@ public ConnectorService(final RestTemplate restTemplate, final ProjectService pr public Integration createIntegration(final Project project, final Settings settings) { notNull(project, "project"); notNull(settings, "settings"); + final Collection projectTemplates = projectService.getProjectTemplates(project); if (projectTemplates == null || projectTemplates.isEmpty()) { throw new GoodDataException("Project " + project.getId() + " doesn't contain a template reference"); } final ProjectTemplate template = notNull(projectTemplates.iterator().next(), "project template"); - final Integration integration = createIntegration(project, settings.getConnector(), new Integration(template.getUrl())); + final Integration integration = createIntegration(project, settings.getConnectorType(), + new Integration(template.getUrl())); updateSettings(project, settings); return integration; } /** * Create connector integration - * @param project project - * @param connector connector - * @param integration integration + * + * @param project project + * @param connectorType connector type + * @param integration integration * @return created integration * @throws ConnectorException if integration can't be created */ - public Integration createIntegration(final Project project, final Connector connector, final Integration integration) { + public Integration createIntegration(final Project project, final ConnectorType connectorType, + final Integration integration) { notNull(project, "project"); - notNull(connector, "connector"); + notNull(connectorType, "connector"); notNull(integration, "integration"); + try { - return restTemplate.postForObject(Integration.URL, integration, Integration.class, project.getId(), connector.getName()); + return restTemplate.postForObject(Integration.URL, integration, Integration.class, project.getId(), + connectorType.getName()); } catch (GoodDataRestException | RestClientException e) { - throw new ConnectorException("Unable to create " + connector + " integration", e); + throw new ConnectorException("Unable to create " + connectorType + " integration", e); } } /** * Update integration settings - * @param project project + * + * @param project project * @param settings integration settings * @throws ConnectorException if settings can't be updated */ - public void updateSettings(final Project project, final T settings) { + public void updateSettings(final Project project, final Settings settings) { notNull(settings, "settings"); notNull(project, "project"); + try { - restTemplate.put(Settings.URL, settings, project.getId(), settings.getConnector().getName()); + restTemplate.put(Settings.URL, settings, project.getId(), settings.getConnectorType().getName()); } catch (GoodDataRestException | RestClientException e) { - throw new ConnectorException("Unable to set " + settings.getConnector() + " settings", e); + throw new ConnectorException("Unable to set " + settings.getConnectorType() + " settings", e); } } /** * Execute connector process - * @param project project + * + * @param project project * @param execution process execution * @return executed process * @throws ConnectorException if process execution fails @@ -98,9 +108,11 @@ public void updateSettings(final Project project, final T s public FutureResult executeProcess(final Project project, final ProcessExecution execution) { notNull(project, "project"); notNull(execution, "execution"); - final String connectorName = execution.getConnector().getName(); + + final String connectorType = execution.getConnectorType().getName(); try { - final UriResponse response = restTemplate.postForObject(Process.URL, execution, UriResponse.class, project.getId(), connectorName); + final UriResponse response = restTemplate + .postForObject(Process.URL, execution, UriResponse.class, project.getId(), connectorType); return new FutureResult<>(this, new SimplePollHandler(response.getUri(), Process.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { @@ -112,13 +124,13 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException public void handlePollResult(final Process pollResult) { super.handlePollResult(pollResult); if (pollResult.isFailed()) { - throw new ConnectorException("Unable to execute " + connectorName + " process: " + + throw new ConnectorException(connectorType + " process failed: " + pollResult.getStatus().getDescription()); } } }); } catch (GoodDataRestException | RestClientException e) { - throw new ConnectorException("Unable to execute " + connectorName + " process", e); + throw new ConnectorException("Unable to execute " + connectorType + " process", e); } } } diff --git a/src/main/java/com/gooddata/connectors/Connector.java b/src/main/java/com/gooddata/connector/ConnectorType.java similarity index 62% rename from src/main/java/com/gooddata/connectors/Connector.java rename to src/main/java/com/gooddata/connector/ConnectorType.java index 85d4e02a1..eb018969c 100644 --- a/src/main/java/com/gooddata/connectors/Connector.java +++ b/src/main/java/com/gooddata/connector/ConnectorType.java @@ -1,12 +1,12 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; /** - * + * Enum containing implemented connector types. */ -public enum Connector { +public enum ConnectorType { ZENDESK4; diff --git a/src/main/java/com/gooddata/connectors/Integration.java b/src/main/java/com/gooddata/connector/Integration.java similarity index 84% rename from src/main/java/com/gooddata/connectors/Integration.java rename to src/main/java/com/gooddata/connector/Integration.java index 2b897efcc..b970d0766 100644 --- a/src/main/java/com/gooddata/connectors/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -13,7 +13,7 @@ import static com.gooddata.Validate.notEmpty; /** - * Connectors integration + * Connector integration (= one instance of configured ETL for loading of one GDC project). */ @JsonTypeName("integration") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -35,9 +35,9 @@ public Integration(final String projectTemplate) { @JsonCreator Integration(@JsonProperty("projectTemplate") String projectTemplate, @JsonProperty("active") boolean active, - @JsonProperty("lastFinishedProcess") ConnectorProcess lastFinishedProcess, - @JsonProperty("lastSuccessfulProcess") ConnectorProcess lastSuccessfulProcess, - @JsonProperty("runningProcess") ConnectorProcess runningProcess) { + @JsonProperty("lastFinishedProcess") ConnectorProcess lastFinishedProcess, + @JsonProperty("lastSuccessfulProcess") ConnectorProcess lastSuccessfulProcess, + @JsonProperty("runningProcess") ConnectorProcess runningProcess) { this.projectTemplate = notEmpty(projectTemplate, "projectTemplate"); this.active = active; this.lastFinishedProcess = lastFinishedProcess; diff --git a/src/main/java/com/gooddata/connectors/Process.java b/src/main/java/com/gooddata/connector/Process.java similarity index 83% rename from src/main/java/com/gooddata/connectors/Process.java rename to src/main/java/com/gooddata/connector/Process.java index 075c36516..93bc26b8a 100644 --- a/src/main/java/com/gooddata/connectors/Process.java +++ b/src/main/java/com/gooddata/connector/Process.java @@ -1,22 +1,20 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Connector process + * Connector process (= single ETL run). Deserialization only. */ @JsonTypeName("process") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Process extends ConnectorProcess { public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/processes"; diff --git a/src/main/java/com/gooddata/connectors/ProcessExecution.java b/src/main/java/com/gooddata/connector/ProcessExecution.java similarity index 83% rename from src/main/java/com/gooddata/connectors/ProcessExecution.java rename to src/main/java/com/gooddata/connector/ProcessExecution.java index dede830f1..4c0e64893 100644 --- a/src/main/java/com/gooddata/connectors/ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/ProcessExecution.java @@ -1,7 +1,7 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -10,7 +10,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Connector process execution + * Connector process execution. Serialization only. */ @JsonTypeName("process") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -19,6 +19,6 @@ public interface ProcessExecution { @JsonIgnore - Connector getConnector(); + ConnectorType getConnectorType(); } diff --git a/src/main/java/com/gooddata/connector/Settings.java b/src/main/java/com/gooddata/connector/Settings.java new file mode 100644 index 000000000..932086637 --- /dev/null +++ b/src/main/java/com/gooddata/connector/Settings.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Connector integration settings. + */ +@JsonTypeName("settings") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public interface Settings { + + final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; + + @JsonIgnore + ConnectorType getConnectorType(); + +} diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java new file mode 100644 index 000000000..4586ac9f6 --- /dev/null +++ b/src/main/java/com/gooddata/connector/Status.java @@ -0,0 +1,73 @@ +package com.gooddata.connector; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +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; + +/** + * Connector process status. Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class Status { + private final String code; + private final String detail; + private final String description; + + @JsonCreator + Status(@JsonProperty("code") String code, @JsonProperty("detail") String detail, + @JsonProperty("description") String description) { + this.code = code; + this.detail = detail; + this.description = description; + } + + public String getCode() { + return code; + } + + public String getDetail() { + return detail; + } + + public String getDescription() { + return description; + } + + /** + * Returns true when the status means that the connector process has already finished + * (no matter if it was successful). + * NOTE: It also returns false in case of inability to resolve the code (e.g. API change) + * + * @return true when the status means that the connector process has already finished, false otherwise + */ + @JsonIgnore + public boolean isFinished() { + return SYNCHRONIZED.name().equalsIgnoreCase(code) || isFailed(); + } + + /** + * Returns true when the status means that the connector process failed. + * NOTE: It also returns false in case of inability to resolve the code (e.g. API change) + * + * @return true when the status means that the connector process failed, false otherwise + */ + @JsonIgnore + public boolean isFailed() { + return ERROR.name().equalsIgnoreCase(code) || USER_ERROR.name().equalsIgnoreCase(code); + } + + + /** + * Enum of connector process status codes + */ + public enum Code { + NEW, SCHEDULED, DOWNLOADING, DOWNLOADED, TRANSFORMING, TRANSFORMED, UPLOADING, UPLOADED, SYNCHRONIZED, + ERROR, USER_ERROR; + } + +} diff --git a/src/main/java/com/gooddata/connector/Zendesk4Process.java b/src/main/java/com/gooddata/connector/Zendesk4Process.java new file mode 100644 index 000000000..0187232b9 --- /dev/null +++ b/src/main/java/com/gooddata/connector/Zendesk4Process.java @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import static com.gooddata.connector.ConnectorType.ZENDESK4; + +/** + * Zendesk 4 (Insights) connector process execution. Serialization only. + */ +public class Zendesk4Process implements ProcessExecution { + + @Override + public ConnectorType getConnectorType() { + return ZENDESK4; + } +} diff --git a/src/main/java/com/gooddata/connectors/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java similarity index 66% rename from src/main/java/com/gooddata/connectors/Zendesk4Settings.java rename to src/main/java/com/gooddata/connector/Zendesk4Settings.java index bca893109..bf5437c52 100644 --- a/src/main/java/com/gooddata/connectors/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -1,24 +1,17 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; import static com.gooddata.Validate.notEmpty; +import static com.gooddata.connector.ConnectorType.ZENDESK4; /** - * Zendesk 4 connector settings + * Zendesk 4 (Insights) connector settings. */ -@JsonTypeName("settings") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Zendesk4Settings implements Settings { private String apiUrl; @@ -32,7 +25,8 @@ public Zendesk4Settings(final String apiUrl) { @JsonCreator public Zendesk4Settings(@JsonProperty("apiUrl") String apiUrl, @JsonProperty("type") String type, - @JsonProperty("syncTime") String syncTime, @JsonProperty("syncTimeZone") String syncTimeZone) { + @JsonProperty("syncTime") String syncTime, + @JsonProperty("syncTimeZone") String syncTimeZone) { this.apiUrl = notEmpty(apiUrl, "apiUrl"); this.type = type; this.syncTime = syncTime; @@ -60,7 +54,12 @@ public String getSyncTimeZone() { } @Override - public Connector getConnector() { - return Connector.ZENDESK4; + public ConnectorType getConnectorType() { + return ZENDESK4; } + + /** + * Type of Zendesk account. + */ + public enum Zendesk4Type {plus, enterprise} } diff --git a/src/main/java/com/gooddata/connectors/Settings.java b/src/main/java/com/gooddata/connectors/Settings.java deleted file mode 100644 index 6b3f65542..000000000 --- a/src/main/java/com/gooddata/connectors/Settings.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.connectors; - -import org.codehaus.jackson.annotate.JsonIgnore; - -/** - * Integration settings - */ -public interface Settings { - - final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; - - @JsonIgnore - Connector getConnector(); - -} diff --git a/src/main/java/com/gooddata/connectors/Status.java b/src/main/java/com/gooddata/connectors/Status.java deleted file mode 100644 index 55df42032..000000000 --- a/src/main/java/com/gooddata/connectors/Status.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gooddata.connectors; - -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; - -/** - * Process status - */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Status { - private final String code; - private final String detail; - private final String description; - - @JsonCreator - Status(@JsonProperty("code") String code, @JsonProperty("detail") String detail, - @JsonProperty("description") String description) { - this.code = code; - this.detail = detail; - this.description = description; - } - - public String getCode() { - return code; - } - - public String getDetail() { - return detail; - } - - public String getDescription() { - return description; - } - - @JsonIgnore - public boolean isFinished() { - return "SYNCHRONIZED".equalsIgnoreCase(code) || isFailed(); - } - - @JsonIgnore - public boolean isFailed() { - return "ERROR".equalsIgnoreCase(code) || "USER_ERROR".equalsIgnoreCase(code); - } -} diff --git a/src/main/java/com/gooddata/connectors/Zendesk4Process.java b/src/main/java/com/gooddata/connectors/Zendesk4Process.java deleted file mode 100644 index d6ef55c2a..000000000 --- a/src/main/java/com/gooddata/connectors/Zendesk4Process.java +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.connectors; - -/** - * Zendesk4 connector process execution - */ -public class Zendesk4Process implements ProcessExecution { - @Override - public Connector getConnector() { - return Connector.ZENDESK4; - } -} diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java index 0b1f24724..00977ceff 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -9,7 +9,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Project template + * Project template. + * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java index a05c37fcf..91b2dd9be 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -11,7 +11,8 @@ import java.util.Collection; /** - * Project templates + * Collection of project templates. + * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) diff --git a/src/test/java/com/gooddata/connector/ConnectorProcessTest.java b/src/test/java/com/gooddata/connector/ConnectorProcessTest.java new file mode 100644 index 000000000..c2955ec6e --- /dev/null +++ b/src/test/java/com/gooddata/connector/ConnectorProcessTest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static com.gooddata.connector.Status.Code.ERROR; +import static com.gooddata.connector.Status.Code.SYNCHRONIZED; +import static com.gooddata.connector.Status.Code.UPLOADING; +import static com.gooddata.connector.Status.Code.USER_ERROR; +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 ConnectorProcessTest { + + @Test + public void testShouldDeserialize() throws Exception { + final ConnectorProcess process = new ObjectMapper() + .readValue(getClass().getResource("/connector/connector-process.json"), ConnectorProcess.class); + + assertThat(process, is(notNullValue())); + assertThat(process.getStarted(), is("2014-05-30T07:50:15.000Z")); + assertThat(process.getFinished(), is("2014-05-30T07:50:50.000Z")); + assertThat(process.getStatus(), is(notNullValue())); + assertThat(process.getStatus().getCode(), is(ERROR.name())); + assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); + assertThat(process.getStatus().getDescription(), is(nullValue())); + } + + @Test + public void testIsFinishedOnError() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(ERROR.name(), "", ""), "", ""); + assertThat(process.isFinished(), is(true)); + } + + @Test + public void testIsFinishedOnSynchronized() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + assertThat(process.isFinished(), is(true)); + } + + @Test + public void testIsFinishedOnUploading() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(UPLOADING.name(), "", ""), "", ""); + assertThat(process.isFinished(), is(false)); + } + + @Test + public void testIsFinishedOnNullCode() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(null, "", ""), "", ""); + assertThat(process.isFinished(), is(false)); + } + + @Test + public void testIsFinishedOnUnknownCode() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status("unknown code", "", ""), "", ""); + assertThat(process.isFinished(), is(false)); + } + + @Test + public void testIsFailedOnError() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(ERROR.name(), "", ""), "", ""); + assertThat(process.isFailed(), is(true)); + } + + @Test + public void testIsFailedOnUserError() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(USER_ERROR.name(), "", ""), "", ""); + assertThat(process.isFailed(), is(true)); + } + + @Test + public void testIsFailedOnSynchronized() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + assertThat(process.isFailed(), is(false)); + } + + @Test + public void testIsFailedOnNullCode() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status(null, "", ""), "", ""); + assertThat(process.isFailed(), is(false)); + } + + @Test + public void testIsFailedOnUnknownCode() throws Exception { + final ConnectorProcess process = new ConnectorProcess(new Status("unknown code", "", ""), "", ""); + assertThat(process.isFailed(), is(false)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/connectors/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java similarity index 81% rename from src/test/java/com/gooddata/connectors/ConnectorServiceIT.java rename to src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 163090188..fe9e13c1c 100644 --- a/src/test/java/com/gooddata/connectors/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -1,4 +1,4 @@ -package com.gooddata.connectors; +package com.gooddata.connector; import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; @@ -7,6 +7,8 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static com.gooddata.connector.Status.Code.ERROR; +import static com.gooddata.connector.Status.Code.SYNCHRONIZED; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -33,7 +35,7 @@ public void shouldCreateIntegration() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") .respond() - .withBody(readResource("/connectors/integration.json")); + .withBody(readResource("/connector/integration.json")); onRequest() .havingMethodEqualTo("PUT") @@ -56,13 +58,13 @@ public void shouldExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connectors/process-scheduled.json")) + .withBody(readResource("/connector/process-scheduled.json")) .thenRespond() - .withBody(readResource("/connectors/process-finished.json")) + .withBody(readResource("/connector/process-finished.json")) ; final Process process = connectors.executeProcess(project, new Zendesk4Process()).get(); - assertThat(process.getStatus().getCode(), is("SYNCHRONIZED")); + assertThat(process.getStatus().getCode(), is(SYNCHRONIZED.name())); } @Test(expectedExceptions = GoodDataException.class) @@ -75,8 +77,9 @@ public void shouldFailExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connectors/process-error.json")); + .withBody(readResource("/connector/process-error.json")); - connectors.executeProcess(project, new Zendesk4Process()).get(); + final Process process = connectors.executeProcess(project, new Zendesk4Process()).get(); + assertThat(process.getStatus().getCode(), is(ERROR.name())); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connectors/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java similarity index 59% rename from src/test/java/com/gooddata/connectors/IntegrationTest.java rename to src/test/java/com/gooddata/connector/IntegrationTest.java index 4ad088844..818ff9111 100644 --- a/src/test/java/com/gooddata/connectors/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -1,8 +1,9 @@ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -13,7 +14,8 @@ public class IntegrationTest { @Test public void shouldDeserialize() throws Exception { final Integration integration = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/connectors/integration.json"), Integration.class); + .readValue(getClass().getResourceAsStream("/connector/integration.json"), Integration.class); + assertThat(integration, is(notNullValue())); assertThat(integration.isActive(), is(true)); assertThat(integration.getProjectTemplate(), is("/projectTemplates/template")); @@ -21,4 +23,18 @@ public void shouldDeserialize() throws Exception { assertThat(integration.getLastSuccessfulProcess(), is(notNullValue())); assertThat(integration.getRunningProcess(), is(nullValue())); } + + @Test + public void shouldSerialize() throws Exception { + final Integration integration = new Integration("template"); + assertThat(integration, serializesToJson("/connector/integration-in.json")); + } + + @Test + public void testSimplifiedConstructor() throws Exception { + final Integration integration = new Integration("template"); + + assertThat(integration.getProjectTemplate(), is("template")); + assertThat(integration.isActive(), is(true)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java new file mode 100644 index 000000000..c65a0eba7 --- /dev/null +++ b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import org.testng.annotations.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.connector.ConnectorType.ZENDESK4; +import static org.hamcrest.MatcherAssert.assertThat; + +public class ProcessExecutionTest { + + @Test + public void shouldSerialize() throws Exception { + final ProcessExecution execution = new ProcessExecution(){ + @Override + public ConnectorType getConnectorType() { + return ZENDESK4; + } + }; + + assertThat(execution, serializesToJson("/connector/process-in.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/connectors/ProcessTest.java b/src/test/java/com/gooddata/connector/ProcessTest.java similarity index 74% rename from src/test/java/com/gooddata/connectors/ProcessTest.java rename to src/test/java/com/gooddata/connector/ProcessTest.java index 893608dbd..ade9eda69 100644 --- a/src/test/java/com/gooddata/connectors/ProcessTest.java +++ b/src/test/java/com/gooddata/connector/ProcessTest.java @@ -1,24 +1,27 @@ -package com.gooddata.connectors; +package com.gooddata.connector; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.connector.Status.Code.ERROR; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; public class ProcessTest { @Test public void shouldDeserialize() throws Exception { final Process process = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/connectors/process-error.json"), Process.class); + .readValue(getClass().getResourceAsStream("/connector/process-error.json"), Process.class); + assertThat(process, is(notNullValue())); assertThat(process.getFinished(), is(notNullValue())); assertThat(process.getStarted(), is(notNullValue())); assertThat(process.getStatus(), is(notNullValue())); - assertThat(process.getStatus().getCode(), is("ERROR")); + assertThat(process.getStatus().getCode(), is(ERROR.name())); assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); assertThat(process.getStatus().getDescription(), is("Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com")); - } + } diff --git a/src/test/java/com/gooddata/connector/StatusTest.java b/src/test/java/com/gooddata/connector/StatusTest.java new file mode 100644 index 000000000..22a8ae191 --- /dev/null +++ b/src/test/java/com/gooddata/connector/StatusTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import org.testng.annotations.Test; + +import static com.gooddata.connector.Status.Code.ERROR; +import static com.gooddata.connector.Status.Code.SYNCHRONIZED; +import static com.gooddata.connector.Status.Code.UPLOADING; +import static com.gooddata.connector.Status.Code.USER_ERROR; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class StatusTest { + + @Test + public void testIsFinishedOnError() throws Exception { + assertThat(new Status(ERROR.name(), "", "").isFinished(), is(true)); + } + + @Test + public void testIsFinishedOnSynchronized() throws Exception { + assertThat(new Status(SYNCHRONIZED.name(), "", "").isFinished(), is(true)); + } + + @Test + public void testIsFinishedOnUploading() throws Exception { + assertThat(new Status(UPLOADING.name(), "", "").isFinished(), is(false)); + } + + @Test + public void testIsFinishedOnNullCode() throws Exception { + assertThat(new Status(null, "", "").isFinished(), is(false)); + } + + @Test + public void testIsFinishedOnUnknownCode() throws Exception { + assertThat(new Status("unknown code", "", "").isFinished(), is(false)); + } + + @Test + public void testIsFailedOnError() throws Exception { + assertThat(new Status(ERROR.name(), "", "").isFailed(), is(true)); + } + + @Test + public void testIsFailedOnUserError() throws Exception { + assertThat(new Status(USER_ERROR.name(), "", "").isFailed(), is(true)); + } + + @Test + public void testIsFailedOnSynchronized() throws Exception { + assertThat(new Status(SYNCHRONIZED.name(), "", "").isFailed(), is(false)); + } + + @Test + public void testIsFailedOnNullCode() throws Exception { + assertThat(new Status(null, "", "").isFailed(), is(false)); + } + + @Test + public void testIsFailedOnUnknownCode() throws Exception { + assertThat(new Status("unknown code", "", "").isFailed(), is(false)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java new file mode 100644 index 000000000..8ba60ae34 --- /dev/null +++ b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.connector.ConnectorType.ZENDESK4; +import static com.gooddata.connector.Zendesk4Settings.Zendesk4Type.plus; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class Zendesk4SettingsTest { + + @Test + public void shouldSerialize() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("https://foo.com", plus.name(), "12am", "America/Los_Angeles"); + assertThat(settings, serializesToJson("/connector/settings-zendesk4.json")); + } + + @Test + public void shouldDeserialize() throws Exception { + final Zendesk4Settings settings = new ObjectMapper() + .readValue(getClass().getResource("/connector/settings-zendesk4.json"), Zendesk4Settings.class); + + assertThat(settings, is(notNullValue())); + assertThat(settings.getApiUrl(), is("https://foo.com")); + assertThat(settings.getType(), is(plus.name())); + assertThat(settings.getSyncTime(), is("12am")); + assertThat(settings.getSyncTimeZone(), is("America/Los_Angeles")); + } + + @Test + public void testGetConnectorType() throws Exception { + assertThat(new Zendesk4Settings("url").getConnectorType(), is(ZENDESK4)); + } + + @Test(expectedExceptions = {IllegalArgumentException.class}) + public void testSetApiUrlWithEmptyValue() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("old url"); + settings.setApiUrl(""); + } + + @Test(expectedExceptions = {IllegalArgumentException.class}) + public void testSetApiUrlWithNull() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("old url"); + settings.setApiUrl(null); + } + + @Test + public void testSetApiUrl() throws Exception { + final Zendesk4Settings settings = new Zendesk4Settings("old url"); + settings.setApiUrl("new url"); + assertThat(settings.getApiUrl(), is("new url")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectTemplateTest.java b/src/test/java/com/gooddata/project/ProjectTemplateTest.java new file mode 100644 index 000000000..b1f607fb2 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectTemplateTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class ProjectTemplateTest { + + @Test + public void shouldDeserialize() throws Exception { + final ProjectTemplate template = new ObjectMapper() + .readValue(getClass().getResource("/project/project-template.json"), ProjectTemplate.class); + + assertThat(template, is(notNullValue())); + assertThat(template.getUrl(), is("/projectTemplates/ZendeskAnalytics/11")); + assertThat(template.getUrn(), is("urn:gooddata:ZendeskAnalytics")); + assertThat(template.getVersion(), is("11")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java new file mode 100644 index 000000000..f639322dc --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + +public class ProjectTemplatesTest { + + @Test + public void shouldDeserialize() throws Exception { + final ProjectTemplates templates = new ObjectMapper() + .readValue(getClass().getResource("/project/project-templates.json"), ProjectTemplates.class); + + assertThat(templates, is(notNullValue())); + assertThat(templates.getTemplatesInfo(), is(notNullValue())); + assertThat(templates.getTemplatesInfo(), hasSize(1)); + } +} \ No newline at end of file diff --git a/src/test/resources/connector/connector-process.json b/src/test/resources/connector/connector-process.json new file mode 100644 index 000000000..b85283a18 --- /dev/null +++ b/src/test/resources/connector/connector-process.json @@ -0,0 +1,12 @@ +{ + "status": { + "code": "ERROR", + "detail": "GDC-INTERNAL-ERROR", + "description": null + }, + "started": "2014-05-30T07:50:15.000Z", + "finished": "2014-05-30T07:50:50.000Z", + "links": { + "self": "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/FINISHED_PROCESS_ID" + } +} diff --git a/src/test/resources/connector/integration-in.json b/src/test/resources/connector/integration-in.json new file mode 100644 index 000000000..cea21f61f --- /dev/null +++ b/src/test/resources/connector/integration-in.json @@ -0,0 +1,6 @@ +{ + "integration": { + "projectTemplate": "template", + "active": true + } +} \ No newline at end of file diff --git a/src/test/resources/connector/integration.json b/src/test/resources/connector/integration.json new file mode 100644 index 000000000..4f2d2fe81 --- /dev/null +++ b/src/test/resources/connector/integration.json @@ -0,0 +1,37 @@ +{ + "integration" : { + "projectTemplate" : "/projectTemplates/template", + "active" : true, + "lastFinishedProcess" : { + "status" : { + "code" : "ERROR", + "detail" : "GDC-INTERNAL-ERROR", + "description" : "Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com" + }, + "started" : "2014-05-30T07:50:15.000Z", + "finished" : "2014-05-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/FINISHED_PROCESS_ID" + } + }, + "lastSuccessfulProcess" : { + "status" : { + "code" : "SYNCHRONIZED", + "detail" : null, + "description" : null + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : "2014-04-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/SUCCESSFUL_PROCESS_ID" + } + }, + "runningProcess" : null, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration", + "processes" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes", + "configuration" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/settings" + }, + "ui" : { } + } +} diff --git a/src/test/resources/connectors/process-error.json b/src/test/resources/connector/process-error.json similarity index 73% rename from src/test/resources/connectors/process-error.json rename to src/test/resources/connector/process-error.json index d4b3dfb91..86a5d542e 100644 --- a/src/test/resources/connectors/process-error.json +++ b/src/test/resources/connector/process-error.json @@ -8,7 +8,7 @@ "started" : "2014-04-29T13:13:41.000Z", "finished" : "2014-04-29T13:14:14.000Z", "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/EKvjqfYyjiIftojiV1p9" + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID" } } } \ No newline at end of file diff --git a/src/test/resources/connectors/process-finished.json b/src/test/resources/connector/process-finished.json similarity index 65% rename from src/test/resources/connectors/process-finished.json rename to src/test/resources/connector/process-finished.json index 4da619af7..186899d0f 100644 --- a/src/test/resources/connectors/process-finished.json +++ b/src/test/resources/connector/process-finished.json @@ -8,7 +8,7 @@ "started" : "2014-04-30T07:50:15.000Z", "finished" : "2014-04-30T07:50:50.000Z", "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID" } } } \ No newline at end of file diff --git a/src/test/resources/connector/process-in.json b/src/test/resources/connector/process-in.json new file mode 100644 index 000000000..ebad9073d --- /dev/null +++ b/src/test/resources/connector/process-in.json @@ -0,0 +1,3 @@ +{ + "process": {} +} \ No newline at end of file diff --git a/src/test/resources/connectors/process-scheduled.json b/src/test/resources/connector/process-scheduled.json similarity index 62% rename from src/test/resources/connectors/process-scheduled.json rename to src/test/resources/connector/process-scheduled.json index eae32ffb2..432240e57 100644 --- a/src/test/resources/connectors/process-scheduled.json +++ b/src/test/resources/connector/process-scheduled.json @@ -8,7 +8,7 @@ "started" : "2014-04-30T07:50:15.000Z", "finished" : null, "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID" } } } \ No newline at end of file diff --git a/src/test/resources/connectors/settings-zendesk4.json b/src/test/resources/connector/settings-zendesk4.json similarity index 100% rename from src/test/resources/connectors/settings-zendesk4.json rename to src/test/resources/connector/settings-zendesk4.json diff --git a/src/test/resources/connectors/integration.json b/src/test/resources/connectors/integration.json deleted file mode 100644 index 2bbce476d..000000000 --- a/src/test/resources/connectors/integration.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "integration" : { - "projectTemplate" : "/projectTemplates/template", - "active" : true, - "lastFinishedProcess" : { - "status" : { - "code" : "SYNCHRONIZED", - "detail" : null, - "description" : null - }, - "started" : "2014-04-30T07:50:15.000Z", - "finished" : "2014-04-30T07:50:50.000Z", - "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" - } - }, - "lastSuccessfulProcess" : { - "status" : { - "code" : "SYNCHRONIZED", - "detail" : null, - "description" : null - }, - "started" : "2014-04-30T07:50:15.000Z", - "finished" : "2014-04-30T07:50:50.000Z", - "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes/saRuMDRmnNS6zzTWDEYS" - } - }, - "runningProcess" : null, - "links" : { - "self" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration", - "processes" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/processes", - "configuration" : "/gdc/projects/ri4qhi4c4s587erv2h2nlv0twdds62vl/connectors/zendesk4/integration/settings" - }, - "ui" : { } - } -} diff --git a/src/test/resources/project/project-template.json b/src/test/resources/project/project-template.json new file mode 100644 index 000000000..f32312de9 --- /dev/null +++ b/src/test/resources/project/project-template.json @@ -0,0 +1,5 @@ +{ + "url": "/projectTemplates/ZendeskAnalytics/11", + "urn": "urn:gooddata:ZendeskAnalytics", + "version": "11" +} From 64a8ec0dd325ad308f09897a986c1a78f876cdf7 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 25 Oct 2014 16:25:42 +0200 Subject: [PATCH 0090/1191] change ProcessStatus and ProcessExecution naming --- .../gooddata/connector/ConnectorService.java | 10 +++---- .../com/gooddata/connector/Integration.java | 20 ++++++------- ...ess.java => IntegrationProcessStatus.java} | 8 +++--- .../gooddata/connector/ProcessExecution.java | 2 +- .../{Process.java => ProcessStatus.java} | 9 +++--- ...ess.java => Zendesk4ProcessExecution.java} | 4 +-- .../connector/ConnectorServiceIT.java | 12 ++++---- ...java => IntegrationProcessStatusTest.java} | 28 +++++++++---------- .../connector/ProcessExecutionTest.java | 2 +- ...rocessTest.java => ProcessStatusTest.java} | 6 ++-- .../Zendesk4ProcessExecutionTest.java | 18 ++++++++++++ ...s-in.json => process-execution-empty.json} | 0 ...cess.json => process-status-embedded.json} | 0 ...s-error.json => process-status-error.json} | 0 ...shed.json => process-status-finished.json} | 0 ...led.json => process-status-scheduled.json} | 0 16 files changed, 69 insertions(+), 50 deletions(-) rename src/main/java/com/gooddata/connector/{ConnectorProcess.java => IntegrationProcessStatus.java} (83%) rename src/main/java/com/gooddata/connector/{Process.java => ProcessStatus.java} (66%) rename src/main/java/com/gooddata/connector/{Zendesk4Process.java => Zendesk4ProcessExecution.java} (60%) rename src/test/java/com/gooddata/connector/{ConnectorProcessTest.java => IntegrationProcessStatusTest.java} (63%) rename src/test/java/com/gooddata/connector/{ProcessTest.java => ProcessStatusTest.java} (87%) create mode 100644 src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java rename src/test/resources/connector/{process-in.json => process-execution-empty.json} (100%) rename src/test/resources/connector/{connector-process.json => process-status-embedded.json} (100%) rename src/test/resources/connector/{process-error.json => process-status-error.json} (100%) rename src/test/resources/connector/{process-finished.json => process-status-finished.json} (100%) rename src/test/resources/connector/{process-scheduled.json => process-status-scheduled.json} (100%) diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 4bc2cbe74..436c457ae 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -105,23 +105,23 @@ public void updateSettings(final Project project, final Settings settings) { * @return executed process * @throws ConnectorException if process execution fails */ - public FutureResult executeProcess(final Project project, final ProcessExecution execution) { + public FutureResult executeProcess(final Project project, final ProcessExecution execution) { notNull(project, "project"); notNull(execution, "execution"); final String connectorType = execution.getConnectorType().getName(); try { final UriResponse response = restTemplate - .postForObject(Process.URL, execution, UriResponse.class, project.getId(), connectorType); - return new FutureResult<>(this, new SimplePollHandler(response.getUri(), Process.class) { + .postForObject(ProcessStatus.URL, execution, UriResponse.class, project.getId(), connectorType); + return new FutureResult<>(this, new SimplePollHandler(response.getUri(), ProcessStatus.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { - final Process process = extractData(response, Process.class); + final ProcessStatus process = extractData(response, ProcessStatus.class); return process.isFinished(); } @Override - public void handlePollResult(final Process pollResult) { + public void handlePollResult(final ProcessStatus pollResult) { super.handlePollResult(pollResult); if (pollResult.isFailed()) { throw new ConnectorException(connectorType + " process failed: " + diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index b970d0766..b746e7d48 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -13,7 +13,7 @@ import static com.gooddata.Validate.notEmpty; /** - * Connector integration (= one instance of configured ETL for loading of one GDC project). + * Connector integration (i.e. one instance of configured ETL for loading of one GDC project). */ @JsonTypeName("integration") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -25,9 +25,9 @@ public class Integration { private String projectTemplate; private boolean active; - private final ConnectorProcess lastFinishedProcess; - private final ConnectorProcess lastSuccessfulProcess; - private final ConnectorProcess runningProcess; + private final IntegrationProcessStatus lastFinishedProcess; + private final IntegrationProcessStatus lastSuccessfulProcess; + private final IntegrationProcessStatus runningProcess; public Integration(final String projectTemplate) { this(projectTemplate, true, null, null, null); @@ -35,9 +35,9 @@ public Integration(final String projectTemplate) { @JsonCreator Integration(@JsonProperty("projectTemplate") String projectTemplate, @JsonProperty("active") boolean active, - @JsonProperty("lastFinishedProcess") ConnectorProcess lastFinishedProcess, - @JsonProperty("lastSuccessfulProcess") ConnectorProcess lastSuccessfulProcess, - @JsonProperty("runningProcess") ConnectorProcess runningProcess) { + @JsonProperty("lastFinishedProcess") IntegrationProcessStatus lastFinishedProcess, + @JsonProperty("lastSuccessfulProcess") IntegrationProcessStatus lastSuccessfulProcess, + @JsonProperty("runningProcess") IntegrationProcessStatus runningProcess) { this.projectTemplate = notEmpty(projectTemplate, "projectTemplate"); this.active = active; this.lastFinishedProcess = lastFinishedProcess; @@ -61,15 +61,15 @@ public void setActive(final boolean active) { this.active = active; } - public ConnectorProcess getLastFinishedProcess() { + public IntegrationProcessStatus getLastFinishedProcess() { return lastFinishedProcess; } - public ConnectorProcess getLastSuccessfulProcess() { + public IntegrationProcessStatus getLastSuccessfulProcess() { return lastSuccessfulProcess; } - public ConnectorProcess getRunningProcess() { + public IntegrationProcessStatus getRunningProcess() { return runningProcess; } } diff --git a/src/main/java/com/gooddata/connector/ConnectorProcess.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java similarity index 83% rename from src/main/java/com/gooddata/connector/ConnectorProcess.java rename to src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index a61277bdf..7bddc48ad 100644 --- a/src/main/java/com/gooddata/connector/ConnectorProcess.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -10,19 +10,19 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Connector process (= single ETL run). Deserialization only. + * Connector process (i.e. single ETL run) status used in integration object. Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ConnectorProcess { +public class IntegrationProcessStatus { private final Status status; private final String started; // todo date private final String finished; // todo date @JsonCreator - protected ConnectorProcess(@JsonProperty("status") Status status, @JsonProperty("started") String started, - @JsonProperty("finished") String finished) { + protected IntegrationProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") String started, + @JsonProperty("finished") String finished) { this.status = status; this.started = started; this.finished = finished; diff --git a/src/main/java/com/gooddata/connector/ProcessExecution.java b/src/main/java/com/gooddata/connector/ProcessExecution.java index 4c0e64893..df17e4557 100644 --- a/src/main/java/com/gooddata/connector/ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/ProcessExecution.java @@ -10,7 +10,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Connector process execution. Serialization only. + * Connector process execution (i.e. definition for single ETL run). Serialization only. */ @JsonTypeName("process") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) diff --git a/src/main/java/com/gooddata/connector/Process.java b/src/main/java/com/gooddata/connector/ProcessStatus.java similarity index 66% rename from src/main/java/com/gooddata/connector/Process.java rename to src/main/java/com/gooddata/connector/ProcessStatus.java index 93bc26b8a..49ac3888a 100644 --- a/src/main/java/com/gooddata/connector/Process.java +++ b/src/main/java/com/gooddata/connector/ProcessStatus.java @@ -10,18 +10,19 @@ import org.codehaus.jackson.annotate.JsonTypeName; /** - * Connector process (= single ETL run). Deserialization only. + * Connector process (i.e. single ETL run) status (standalone, not embedded in integration as its parent) . + * Deserialization only. */ @JsonTypeName("process") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -public class Process extends ConnectorProcess { +public class ProcessStatus extends IntegrationProcessStatus { public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/processes"; @JsonCreator - Process(@JsonProperty("status") Status status, @JsonProperty("started") String started, - @JsonProperty("finished") String finished) { + ProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") String started, + @JsonProperty("finished") String finished) { super(status, started, finished); } diff --git a/src/main/java/com/gooddata/connector/Zendesk4Process.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java similarity index 60% rename from src/main/java/com/gooddata/connector/Zendesk4Process.java rename to src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 0187232b9..626f8bd2a 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Process.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -6,9 +6,9 @@ import static com.gooddata.connector.ConnectorType.ZENDESK4; /** - * Zendesk 4 (Insights) connector process execution. Serialization only. + * Zendesk 4 (Insights) connector process execution (i.e. definition for single ETL run). Serialization only. */ -public class Zendesk4Process implements ProcessExecution { +public class Zendesk4ProcessExecution implements ProcessExecution { @Override public ConnectorType getConnectorType() { diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index fe9e13c1c..ad0a55f6b 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -58,12 +58,12 @@ public void shouldExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connector/process-scheduled.json")) + .withBody(readResource("/connector/process-status-scheduled.json")) .thenRespond() - .withBody(readResource("/connector/process-finished.json")) + .withBody(readResource("/connector/process-status-finished.json")) ; - final Process process = connectors.executeProcess(project, new Zendesk4Process()).get(); + final ProcessStatus process = connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); assertThat(process.getStatus().getCode(), is(SYNCHRONIZED.name())); } @@ -77,9 +77,9 @@ public void shouldFailExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connector/process-error.json")); + .withBody(readResource("/connector/process-status-error.json")); - final Process process = connectors.executeProcess(project, new Zendesk4Process()).get(); + final ProcessStatus process = connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); assertThat(process.getStatus().getCode(), is(ERROR.name())); } -} \ No newline at end of file +} diff --git a/src/test/java/com/gooddata/connector/ConnectorProcessTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java similarity index 63% rename from src/test/java/com/gooddata/connector/ConnectorProcessTest.java rename to src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index c2955ec6e..4ed6c09f6 100644 --- a/src/test/java/com/gooddata/connector/ConnectorProcessTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -15,12 +15,12 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; -public class ConnectorProcessTest { +public class IntegrationProcessStatusTest { @Test public void testShouldDeserialize() throws Exception { - final ConnectorProcess process = new ObjectMapper() - .readValue(getClass().getResource("/connector/connector-process.json"), ConnectorProcess.class); + final IntegrationProcessStatus process = new ObjectMapper() + .readValue(getClass().getResource("/connector/process-status-embedded.json"), IntegrationProcessStatus.class); assertThat(process, is(notNullValue())); assertThat(process.getStarted(), is("2014-05-30T07:50:15.000Z")); @@ -33,62 +33,62 @@ public void testShouldDeserialize() throws Exception { @Test public void testIsFinishedOnError() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), "", ""); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnSynchronized() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), "", ""); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnUploading() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(UPLOADING.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), "", ""); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnNullCode() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(null, "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), "", ""); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnUnknownCode() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status("unknown code", "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), "", ""); assertThat(process.isFinished(), is(false)); } @Test public void testIsFailedOnError() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), "", ""); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnUserError() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(USER_ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), "", ""); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnSynchronized() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), "", ""); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnNullCode() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status(null, "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), "", ""); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnUnknownCode() throws Exception { - final ConnectorProcess process = new ConnectorProcess(new Status("unknown code", "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), "", ""); assertThat(process.isFailed(), is(false)); } -} \ No newline at end of file +} diff --git a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java index c65a0eba7..6e87b8cb6 100644 --- a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java @@ -20,6 +20,6 @@ public ConnectorType getConnectorType() { } }; - assertThat(execution, serializesToJson("/connector/process-in.json")); + assertThat(execution, serializesToJson("/connector/process-execution-empty.json")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/ProcessTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java similarity index 87% rename from src/test/java/com/gooddata/connector/ProcessTest.java rename to src/test/java/com/gooddata/connector/ProcessStatusTest.java index ade9eda69..51e7c7ed0 100644 --- a/src/test/java/com/gooddata/connector/ProcessTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -8,12 +8,12 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -public class ProcessTest { +public class ProcessStatusTest { @Test public void shouldDeserialize() throws Exception { - final Process process = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/connector/process-error.json"), Process.class); + final ProcessStatus process = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/connector/process-status-error.json"), ProcessStatus.class); assertThat(process, is(notNullValue())); assertThat(process.getFinished(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java new file mode 100644 index 000000000..6a0fa443b --- /dev/null +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.connector; + +import com.gooddata.JsonMatchers; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; + +public class Zendesk4ProcessExecutionTest { + + @Test + public void testShouldSerialize() throws Exception { + assertThat(new Zendesk4ProcessExecution(), JsonMatchers.serializesToJson( + "/connector/process-execution-empty.json")); + } +} \ No newline at end of file diff --git a/src/test/resources/connector/process-in.json b/src/test/resources/connector/process-execution-empty.json similarity index 100% rename from src/test/resources/connector/process-in.json rename to src/test/resources/connector/process-execution-empty.json diff --git a/src/test/resources/connector/connector-process.json b/src/test/resources/connector/process-status-embedded.json similarity index 100% rename from src/test/resources/connector/connector-process.json rename to src/test/resources/connector/process-status-embedded.json diff --git a/src/test/resources/connector/process-error.json b/src/test/resources/connector/process-status-error.json similarity index 100% rename from src/test/resources/connector/process-error.json rename to src/test/resources/connector/process-status-error.json diff --git a/src/test/resources/connector/process-finished.json b/src/test/resources/connector/process-status-finished.json similarity index 100% rename from src/test/resources/connector/process-finished.json rename to src/test/resources/connector/process-status-finished.json diff --git a/src/test/resources/connector/process-scheduled.json b/src/test/resources/connector/process-status-scheduled.json similarity index 100% rename from src/test/resources/connector/process-scheduled.json rename to src/test/resources/connector/process-status-scheduled.json From 4f9a6ae87bcea1e559a17ab4f9a2d1086a63047d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 8 Nov 2014 17:29:30 +0100 Subject: [PATCH 0091/1191] requiring JsonUnit test is questionable --- CONTRIBUTE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index e815aab77..45404ae06 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -35,7 +35,7 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); * `*IT` integration tests (see [`AbstractGoodDataIT`](src/test/java/com/gooddata/AbstractGoodDataIT.java)) ## Best practices -* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. +* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. TODO -- this is questionable, because almost nothing is tested by JsonUnit now. * Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. * Everything public should be **documented** using _javadoc_. * When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. From eca3f27e2f98c372fc9ea2c0450f5e3a24d83f72 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 8 Nov 2014 17:35:43 +0100 Subject: [PATCH 0092/1191] add paperwork section --- CONTRIBUTE.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 45404ae06..a257f9c08 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -2,6 +2,11 @@ Below are few **rules, recommendations and best practices** we try to follow when developing the _GoodData Java SDK_. +## Paperwork +* Every pull request with non-trivial change must be **associated with an issue**. +* Every closed non-rejected pull request and issue must be marked with exactly **one milestone version**. +* Issue must be **properly labeled** (bug/enhancement/backward incompatible/...). + ## Design ### Structure From c1f8788a611c45c89faa4b564a770b27bb64ebad Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 8 Nov 2014 20:35:27 +0100 Subject: [PATCH 0093/1191] add releases and dependencies --- README.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 35a65f181..45c92565a 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,15 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from ``` -The *GoodData Java SDK* uses the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) (version 0.8.2 or later) -and the *Apache HTTP Client* (version 4.3 or later). +See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes. + +### Dependencies + +The *GoodData Java SDK* uses: +* the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) (version 0.8.2 or later) +* the *Apache HTTP Client* (version 4.3 or later). +* the *Spring Framework* (version 3.x) +* the *Jackson JSON Processor* (version 1.9) ### General From faeef4b1b2c505d98a4f807c33224cc4dd60338d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Nov 2014 15:12:31 +0100 Subject: [PATCH 0094/1191] make gooddata client working with jackson2 on classpath Make sure jackson1 converter is present and remove all converters conflicting with it (eg. jackson2). Close: #80 --- src/main/java/com/gooddata/GoodData.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b6f1fc336..0b0ed1390 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -24,9 +24,13 @@ import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.util.Arrays; +import java.util.Iterator; +import java.util.List; import static com.gooddata.Validate.notEmpty; import static java.util.Collections.singletonMap; @@ -145,6 +149,21 @@ private RestTemplate createRestTemplate(String login, String password, String ho restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); + + // make sure jackson1 converter is present and remove all converters conflicting with it (eg. jackson2) + final MappingJacksonHttpMessageConverter jacksonConverter = new MappingJacksonHttpMessageConverter(); + final Iterator> it = restTemplate.getMessageConverters().iterator(); + while (it.hasNext()) { + final HttpMessageConverter converter = it.next(); + for (MediaType type: converter.getSupportedMediaTypes()) { + if (jacksonConverter.getSupportedMediaTypes().contains(type)) { + it.remove(); + break; + } + } + } + restTemplate.getMessageConverters().add(jacksonConverter); + return restTemplate; } From d1a4c3073b377a44c96bdb34a86395857614b1da Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 29 Oct 2014 21:29:16 +0100 Subject: [PATCH 0095/1191] move util classes to util package --- src/main/java/com/gooddata/AbstractPollHandler.java | 2 +- src/main/java/com/gooddata/AbstractPollHandlerBase.java | 2 +- src/main/java/com/gooddata/AbstractService.java | 2 +- src/main/java/com/gooddata/FutureResult.java | 2 +- src/main/java/com/gooddata/GoodData.java | 2 +- .../java/com/gooddata/HeaderSettingRequestInterceptor.java | 2 +- src/main/java/com/gooddata/ResponseErrorHandler.java | 2 +- src/main/java/com/gooddata/UriPrefixer.java | 4 ++-- .../com/gooddata/UriPrefixingClientHttpRequestFactory.java | 2 +- src/main/java/com/gooddata/connector/ConnectorService.java | 2 +- src/main/java/com/gooddata/connector/Integration.java | 2 +- src/main/java/com/gooddata/connector/Zendesk4Settings.java | 2 +- .../com/gooddata/dataload/processes/DataloadProcess.java | 4 ++-- .../com/gooddata/dataload/processes/ProcessExecution.java | 4 ++-- .../gooddata/dataload/processes/ProcessExecutionDetail.java | 4 ++-- .../com/gooddata/dataload/processes/ProcessService.java | 6 +++--- src/main/java/com/gooddata/dataset/DatasetService.java | 4 ++-- src/main/java/com/gooddata/gdc/DataStoreService.java | 4 ++-- src/main/java/com/gooddata/gdc/ErrorStructure.java | 2 +- src/main/java/com/gooddata/md/AbstractObj.java | 2 +- src/main/java/com/gooddata/md/MetadataService.java | 2 +- src/main/java/com/gooddata/model/DiffRequest.java | 2 +- src/main/java/com/gooddata/model/ModelService.java | 4 ++-- src/main/java/com/gooddata/project/ProjectService.java | 4 ++-- src/main/java/com/gooddata/report/ReportService.java | 5 ++--- src/main/java/com/gooddata/{ => util}/Validate.java | 2 +- src/main/java/com/gooddata/{ => util}/ZipUtils.java | 4 ++-- src/main/java/com/gooddata/warehouse/Warehouse.java | 2 +- src/main/java/com/gooddata/warehouse/WarehouseService.java | 4 ++-- src/test/java/com/gooddata/AbstractGoodDataIT.java | 2 +- src/test/java/com/gooddata/{ => util}/ZipUtilsTest.java | 2 +- 31 files changed, 44 insertions(+), 45 deletions(-) rename src/main/java/com/gooddata/{ => util}/Validate.java (98%) rename src/main/java/com/gooddata/{ => util}/ZipUtils.java (96%) rename src/test/java/com/gooddata/{ => util}/ZipUtilsTest.java (99%) diff --git a/src/main/java/com/gooddata/AbstractPollHandler.java b/src/main/java/com/gooddata/AbstractPollHandler.java index 838b63423..959af7769 100644 --- a/src/main/java/com/gooddata/AbstractPollHandler.java +++ b/src/main/java/com/gooddata/AbstractPollHandler.java @@ -5,7 +5,7 @@ import org.springframework.http.client.ClientHttpResponse; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * For internal use by services employing polling.

diff --git a/src/main/java/com/gooddata/AbstractPollHandlerBase.java b/src/main/java/com/gooddata/AbstractPollHandlerBase.java index e36f7aa1e..086cc8364 100644 --- a/src/main/java/com/gooddata/AbstractPollHandlerBase.java +++ b/src/main/java/com/gooddata/AbstractPollHandlerBase.java @@ -8,7 +8,7 @@ import java.io.IOException; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * For internal use by services employing polling.

diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index a5136eddc..dce4b92fe 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -3,7 +3,7 @@ */ package com.gooddata; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import static java.lang.String.format; import static org.springframework.http.HttpMethod.GET; diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index 592af7c6e..dbcb764a7 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -5,7 +5,7 @@ import java.util.concurrent.TimeUnit; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * Represents the result retrieved by polling on the REST API. diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b8240548a..d15b88e98 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -32,7 +32,7 @@ import java.util.Iterator; import java.util.List; -import static com.gooddata.Validate.notEmpty; +import static com.gooddata.util.Validate.notEmpty; import static java.util.Collections.singletonMap; import static org.apache.http.util.VersionInfo.loadVersionInfo; diff --git a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java index a8d1bc03e..f534a9d77 100644 --- a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java +++ b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java @@ -12,7 +12,7 @@ import java.io.IOException; import java.util.Map; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * Intercepts client-side HTTP requests and sets HTTP headers passed to constructor of this class. diff --git a/src/main/java/com/gooddata/ResponseErrorHandler.java b/src/main/java/com/gooddata/ResponseErrorHandler.java index 7145cd7c6..d2e189f06 100644 --- a/src/main/java/com/gooddata/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/ResponseErrorHandler.java @@ -14,7 +14,7 @@ import java.util.List; import static com.gooddata.GoodData.GDC_REQUEST_ID_HEADER; -import static com.gooddata.Validate.noNullElements; +import static com.gooddata.util.Validate.noNullElements; /** * A response error handler able to extract GoodData error response diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 0c814700d..748c61917 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -7,8 +7,8 @@ import java.net.URI; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; /** * Used internally by GoodData SDK to hold and set URI prefix (hostname and port) of all requests. diff --git a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java index 4aaf9a715..fdf3f4ba3 100644 --- a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java +++ b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java @@ -11,7 +11,7 @@ import java.io.IOException; import java.net.URI; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * Factory for ClientHttpRequest objects. diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 436c457ae..843188b58 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -19,7 +19,7 @@ import java.io.IOException; import java.util.Collection; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * Service for connector integration creation, update of its settings or execution of its process. diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index b746e7d48..e68ad1cd1 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -10,7 +10,7 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import static com.gooddata.Validate.notEmpty; +import static com.gooddata.util.Validate.notEmpty; /** * Connector integration (i.e. one instance of configured ETL for loading of one GDC project). diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java index bf5437c52..02336dae5 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -6,7 +6,7 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; -import static com.gooddata.Validate.notEmpty; +import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.connector.ConnectorType.ZENDESK4; /** diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 830d06594..25f357b0f 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 8d5c5487a..72e2d5786 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index 3c4f34540..1dbb6cebf 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import com.gooddata.gdc.ErrorStructure; import org.codehaus.jackson.annotate.JsonCreator; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index ecf4fa94a..250531899 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -1,7 +1,7 @@ package com.gooddata.dataload.processes; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.util.Collections.emptyList; import com.gooddata.AbstractService; @@ -9,7 +9,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.ZipUtils; +import com.gooddata.util.ZipUtils; import com.gooddata.account.AccountService; import com.gooddata.project.Project; import org.springframework.core.io.FileSystemResource; diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 78f543277..6005312ba 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -23,8 +23,8 @@ import java.nio.file.Paths; import java.util.Collection; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.emptyList; diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index fca0af6bb..bc30023d9 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -12,8 +12,8 @@ import java.io.InputStream; import java.net.URI; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; /** * Uploads, downloads, deletes, ... at datastore diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 0cc33199a..e26259fe0 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -5,7 +5,7 @@ import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.copyOf; /** diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index de6902898..ca4dd0b0c 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -6,7 +6,7 @@ import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; -import static com.gooddata.Validate.noNullElements; +import static com.gooddata.util.Validate.noNullElements; /** * Metadata object (common part) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index a46056907..a5d7fdfcb 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -16,7 +16,7 @@ import java.util.ArrayList; import java.util.Collection; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * Query, create and update project metadata - attributes, facts, metrics, reports,... diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index 4e03a2068..44041aff5 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -10,7 +10,7 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; /** * A request to perform diff between current project model and given targetModel. diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index b6ecf8c9d..d534193c8 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -20,8 +20,8 @@ import java.util.Collection; import java.util.LinkedList; -import static com.gooddata.Validate.noNullElements; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.noNullElements; +import static com.gooddata.util.Validate.notNull; import static com.gooddata.model.ModelDiff.UpdateScript; import static java.util.Arrays.asList; diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index edb18a4bb..f64380a1a 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -19,8 +19,8 @@ import java.util.Collection; import java.util.Collections; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; /** * List projects, create a project, ... diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index bf01eb2ad..9d63a6c8c 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -6,7 +6,6 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; -import com.gooddata.PollHandler; import com.gooddata.SimplePollHandler; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; @@ -21,8 +20,8 @@ import java.io.IOException; import java.io.OutputStream; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.POST; diff --git a/src/main/java/com/gooddata/Validate.java b/src/main/java/com/gooddata/util/Validate.java similarity index 98% rename from src/main/java/com/gooddata/Validate.java rename to src/main/java/com/gooddata/util/Validate.java index 380e904c8..22a60bc56 100644 --- a/src/main/java/com/gooddata/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -1,4 +1,4 @@ -package com.gooddata; +package com.gooddata.util; import java.util.Collection; import java.util.Iterator; diff --git a/src/main/java/com/gooddata/ZipUtils.java b/src/main/java/com/gooddata/util/ZipUtils.java similarity index 96% rename from src/main/java/com/gooddata/ZipUtils.java rename to src/main/java/com/gooddata/util/ZipUtils.java index 0e3594b98..54e278bc6 100644 --- a/src/main/java/com/gooddata/ZipUtils.java +++ b/src/main/java/com/gooddata/util/ZipUtils.java @@ -1,6 +1,6 @@ -package com.gooddata; +package com.gooddata.util; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import org.springframework.util.StreamUtils; diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 9d56a7855..bc54b0aa0 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,6 +1,6 @@ package com.gooddata.warehouse; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 769a83851..ea32e59f3 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -1,7 +1,7 @@ package com.gooddata.warehouse; -import static com.gooddata.Validate.notEmpty; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.util.Collections.emptyList; import com.gooddata.AbstractPollHandler; diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index d9684ccb3..08e51f0a8 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -11,7 +11,7 @@ import java.io.InputStream; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import static net.jadler.Jadler.*; public abstract class AbstractGoodDataIT { diff --git a/src/test/java/com/gooddata/ZipUtilsTest.java b/src/test/java/com/gooddata/util/ZipUtilsTest.java similarity index 99% rename from src/test/java/com/gooddata/ZipUtilsTest.java rename to src/test/java/com/gooddata/util/ZipUtilsTest.java index e9b5591f7..6286cdca0 100644 --- a/src/test/java/com/gooddata/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/util/ZipUtilsTest.java @@ -1,4 +1,4 @@ -package com.gooddata; +package com.gooddata.util; import org.apache.commons.io.FileUtils; import org.testng.annotations.AfterClass; From 77a9dd6e43fd8edd7740e8439a7ca3e4d755fe37 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Oct 2014 08:06:05 +0100 Subject: [PATCH 0096/1191] change date time fields from String to DateTime type --- pom.xml | 5 +++ .../connector/IntegrationProcessStatus.java | 19 +++++++---- .../com/gooddata/connector/ProcessStatus.java | 9 +++-- .../processes/ProcessExecutionDetail.java | 34 +++++++++++++------ .../java/com/gooddata/dataset/FailStatus.java | 13 +++++-- .../java/com/gooddata/md/AbstractObj.java | 5 +-- src/main/java/com/gooddata/md/Entry.java | 18 ++++++---- src/main/java/com/gooddata/md/Meta.java | 18 ++++++---- .../java/com/gooddata/project/Project.java | 10 ++++-- .../gooddata/util/GDDateTimeDeserializer.java | 26 ++++++++++++++ .../gooddata/util/GDDateTimeSerializer.java | 30 ++++++++++++++++ .../util/ISODateTimeDeserializer.java | 27 +++++++++++++++ .../gooddata/util/ISODateTimeSerializer.java | 24 +++++++++++++ .../com/gooddata/warehouse/Warehouse.java | 24 +++++++++---- .../IntegrationProcessStatusTest.java | 27 ++++++++------- .../processes/ProcessExecutionDetailTest.java | 10 +++--- .../com/gooddata/dataset/FailStatusTest.java | 4 ++- src/test/java/com/gooddata/md/EntryTest.java | 6 ++-- src/test/java/com/gooddata/md/MetaTest.java | 6 ++-- src/test/java/com/gooddata/md/ObjTest.java | 6 ++-- .../com/gooddata/project/ProjectTest.java | 6 ++-- .../java/com/gooddata/util/GDDateClass.java | 22 ++++++++++++ .../util/GDDateTimeDeserializerTest.java | 26 ++++++++++++++ .../util/GDDateTimeSerializerTest.java | 24 +++++++++++++ .../java/com/gooddata/util/ISODateClass.java | 22 ++++++++++++ .../util/ISODateTimeDeserializerTest.java | 27 +++++++++++++++ .../util/ISODateTimeSerializerTest.java | 24 +++++++++++++ .../com/gooddata/warehouse/WarehouseTest.java | 6 ++-- 28 files changed, 405 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/gooddata/util/GDDateTimeDeserializer.java create mode 100644 src/main/java/com/gooddata/util/GDDateTimeSerializer.java create mode 100644 src/main/java/com/gooddata/util/ISODateTimeDeserializer.java create mode 100644 src/main/java/com/gooddata/util/ISODateTimeSerializer.java create mode 100644 src/test/java/com/gooddata/util/GDDateClass.java create mode 100644 src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java create mode 100644 src/test/java/com/gooddata/util/ISODateClass.java create mode 100644 src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java diff --git a/pom.xml b/pom.xml index 80ed7aaf5..50b2d58fd 100644 --- a/pom.xml +++ b/pom.xml @@ -155,6 +155,11 @@ sardine 5.1 + + joda-time + joda-time + 2.3 + org.testng diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index 7bddc48ad..722ff1169 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -3,11 +3,15 @@ */ package com.gooddata.connector; +import com.gooddata.util.ISODateTimeDeserializer; +import com.gooddata.util.ISODateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; /** * Connector process (i.e. single ETL run) status used in integration object. Deserialization only. @@ -17,12 +21,13 @@ public class IntegrationProcessStatus { private final Status status; - private final String started; // todo date - private final String finished; // todo date + private final DateTime started; + private final DateTime finished; @JsonCreator - protected IntegrationProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") String started, - @JsonProperty("finished") String finished) { + protected IntegrationProcessStatus(@JsonProperty("status") Status status, + @JsonProperty("started") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime started, + @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished) { this.status = status; this.started = started; this.finished = finished; @@ -32,11 +37,13 @@ public Status getStatus() { return status; } - public String getStarted() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getStarted() { return started; } - public String getFinished() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getFinished() { return finished; } diff --git a/src/main/java/com/gooddata/connector/ProcessStatus.java b/src/main/java/com/gooddata/connector/ProcessStatus.java index 49ac3888a..14e11c8de 100644 --- a/src/main/java/com/gooddata/connector/ProcessStatus.java +++ b/src/main/java/com/gooddata/connector/ProcessStatus.java @@ -3,11 +3,15 @@ */ package com.gooddata.connector; +import com.gooddata.util.ISODateTimeDeserializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; /** * Connector process (i.e. single ETL run) status (standalone, not embedded in integration as its parent) . @@ -21,8 +25,9 @@ public class ProcessStatus extends IntegrationProcessStatus { public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/processes"; @JsonCreator - ProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") String started, - @JsonProperty("finished") String finished) { + ProcessStatus(@JsonProperty("status") Status status, + @JsonProperty("started") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime started, + @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished) { super(status, started, finished); } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index 1dbb6cebf..b199e8c8c 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -4,12 +4,17 @@ import static com.gooddata.util.Validate.notNull; import com.gooddata.gdc.ErrorStructure; +import com.gooddata.util.ISODateTimeDeserializer; +import com.gooddata.util.ISODateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; import java.net.URI; import java.util.Map; @@ -28,18 +33,21 @@ public class ProcessExecutionDetail { private static final String STATUS_OK = "OK"; private final String status; - // TODO should be dates - private final String created; - private final String started; - private final String updated; - private final String finished; + private final DateTime created; + private final DateTime started; + private final DateTime updated; + private final DateTime finished; private final ErrorStructure error; private final Map links; @JsonCreator - private ProcessExecutionDetail(@JsonProperty("status") String status, @JsonProperty("created") String created, @JsonProperty("started") String started, - @JsonProperty("updated") String updated, @JsonProperty("finished")String finished, @JsonProperty("error") ErrorStructure error, + private ProcessExecutionDetail(@JsonProperty("status") String status, + @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, + @JsonProperty("started") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime started, + @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, + @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished, + @JsonProperty("error") ErrorStructure error, @JsonProperty("links") Map links) { this.status = notEmpty(status, "status"); this.created = notNull(created, "created"); @@ -54,19 +62,23 @@ public String getStatus() { return status; } - public String getCreated() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getCreated() { return created; } - public String getStarted() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getStarted() { return started; } - public String getUpdated() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getUpdated() { return updated; } - public String getFinished() { + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getFinished() { return finished; } diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java index 0ac8cd51a..ba4874c39 100644 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ b/src/main/java/com/gooddata/dataset/FailStatus.java @@ -1,9 +1,14 @@ package com.gooddata.dataset; import com.gooddata.gdc.ErrorStructure; +import com.gooddata.util.GDDateTimeDeserializer; +import com.gooddata.util.GDDateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; /** * Fail status of dataset load. @@ -13,11 +18,12 @@ public class FailStatus { private final String status; - private final String date; //TODO date + private final DateTime date; private final ErrorStructure error; @JsonCreator - private FailStatus(@JsonProperty("status") String status, @JsonProperty("date") String date, + private FailStatus(@JsonProperty("status") String status, + @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date, @JsonProperty("error") ErrorStructure error) { this.status = status; this.date = date; @@ -28,7 +34,8 @@ public String getStatus() { return status; } - public String getDate() { + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getDate() { return date; } diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index ca4dd0b0c..cedbbc85f 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -5,6 +5,7 @@ import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonProperty; +import org.joda.time.DateTime; import static com.gooddata.util.Validate.noNullElements; @@ -31,7 +32,7 @@ public String getContributor() { } @JsonIgnore - public String getCreated() { + public DateTime getCreated() { return meta.getCreated(); } @@ -46,7 +47,7 @@ public String getTitle() { } @JsonIgnore - public String getUpdated() { + public DateTime getUpdated() { return meta.getUpdated(); } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 7f7d92930..394ceeaf9 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,9 +1,13 @@ package com.gooddata.md; +import com.gooddata.util.GDDateTimeDeserializer; +import com.gooddata.util.GDDateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; /** * Metadata entry (can be named "LINK" in some API docs) @@ -21,8 +25,8 @@ public class Entry { private final String deprecated; //TODO boolean private final String identifier; private final String tags; //TODO collection - private final String created; //TODO date time - private final String updated; //TODO date time + private final DateTime created; + private final DateTime updated; private final Integer locked; //TODO boolean private final Integer unlisted; //TODO boolean @@ -36,8 +40,8 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("deprecated") String deprecated, @JsonProperty("identifier") String identifier, @JsonProperty("tags") String tags, - @JsonProperty("created") String created, - @JsonProperty("updated") String updated, + @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("locked") Integer locked, @JsonProperty("unlisted") Integer unlisted) { this.link = link; @@ -91,11 +95,13 @@ public String getTags() { return tags; } - public String getCreated() { + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getCreated() { return created; } - public String getUpdated() { + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getUpdated() { return updated; } diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index fb7c1dad0..79f7e2b5c 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -3,11 +3,15 @@ */ package com.gooddata.md; +import com.gooddata.util.GDDateTimeDeserializer; +import com.gooddata.util.GDDateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; +import org.joda.time.DateTime; import java.io.Serializable; @@ -20,8 +24,8 @@ public class Meta implements Serializable { private String author; private String contributor; - private String created; //TODO date time - private String updated; //TODO date time + private DateTime created; + private DateTime updated; private String summary; private String category; private String tags; //TODO collection @@ -35,8 +39,8 @@ public class Meta implements Serializable { @JsonCreator protected Meta(@JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("created") String created, - @JsonProperty("updated") String updated, + @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("summary") String summary, @JsonProperty("title") String title, @JsonProperty("category") String category, @@ -79,7 +83,8 @@ public String getContributor() { return contributor; } - public String getCreated() { + @JsonSerialize(using = GDDateTimeSerializer.class, include = Inclusion.NON_NULL) + public DateTime getCreated() { return created; } @@ -91,7 +96,8 @@ public String getTitle() { return title; } - public String getUpdated() { + @JsonSerialize(using = GDDateTimeSerializer.class, include = Inclusion.NON_NULL) + public DateTime getUpdated() { return updated; } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 809dab41a..b4ed4fe47 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -4,13 +4,16 @@ package com.gooddata.project; import com.gooddata.md.Meta; +import com.gooddata.util.GDDateTimeDeserializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; import java.util.HashSet; @@ -119,12 +122,12 @@ public String getContributor() { } @JsonIgnore - public String getCreated() { + public DateTime getCreated() { return meta.getCreated(); } @JsonIgnore - public String getUpdated() { + public DateTime getUpdated() { return meta.getUpdated(); } @@ -424,7 +427,8 @@ private static class ProjectMeta extends Meta { @JsonCreator private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("created") String created, @JsonProperty("updated") String updated, + @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("summary") String summary, @JsonProperty("title") String title, @JsonProperty("category") String category, @JsonProperty("tags") String tags, @JsonProperty("uri") String uri, @JsonProperty("deprecated") String deprecated, diff --git a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java new file mode 100644 index 000000000..bdef9df53 --- /dev/null +++ b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java @@ -0,0 +1,26 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.joda.time.DateTime; + +import java.io.IOException; + +import static com.gooddata.util.GDDateTimeSerializer.FORMATTER; + +/** + * Deserializes Joda's {@link DateTime} fields from the GoodData date time format in the UTC timezone (yyyy-MM-dd HH:mm:ss.SSSZ). + */ +public class GDDateTimeDeserializer extends JsonDeserializer { + + @Override + public DateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + if (root == null || root.isNull()) { + return null; + } + return FORMATTER.parseDateTime(root.getTextValue()); + } +} diff --git a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java new file mode 100644 index 000000000..450930813 --- /dev/null +++ b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java @@ -0,0 +1,30 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.DateTimeFormatterBuilder; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.IOException; + +/** + * Serializes Joda's {@link DateTime} fields to the GoodDate date time format in the UTC timezone (yyyy-MM-dd HH:mm:ss.SSSZ). + */ +public class GDDateTimeSerializer extends JsonSerializer { + + static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder() + .append(ISODateTimeFormat.date()) + .appendLiteral(' ') + .append(ISODateTimeFormat.hourMinuteSecond()) + .toFormatter().withZone(DateTimeZone.UTC); + + @Override + public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) throws IOException { + gen.writeString(FORMATTER.print(value)); + } + +} diff --git a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java new file mode 100644 index 000000000..a6aad2205 --- /dev/null +++ b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java @@ -0,0 +1,27 @@ +package com.gooddata.util; + +import java.io.IOException; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.joda.time.DateTime; + +import static com.gooddata.util.ISODateTimeSerializer.FORMATTER; + +/** + * Deserializes Joda's {@link DateTime} fields from the ISO date time format in the UTC timezone (yyyy-MM-dd'T'HH:mm:ss.SSSZZ). + */ +public class ISODateTimeDeserializer extends JsonDeserializer { + + @Override + public DateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + if (root == null || root.isNull()) { + return null; + } + return FORMATTER.parseDateTime(root.getTextValue()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java new file mode 100644 index 000000000..17805c125 --- /dev/null +++ b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java @@ -0,0 +1,24 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.IOException; + +/** + * Serializes Joda's {@link DateTime} fields to the ISO date time format in the UTC timezone (yyyy-MM-dd'T'HH:mm:ss.SSSZZ). + */ +public class ISODateTimeSerializer extends JsonSerializer { + + static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); + + @Override + public void serialize(DateTime value, JsonGenerator gen, SerializerProvider arg2) throws IOException { + gen.writeString(FORMATTER.print(value)); + } +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index bc54b0aa0..2df54c2b9 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,14 +1,19 @@ package com.gooddata.warehouse; import static com.gooddata.util.Validate.notNull; +import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL; +import com.gooddata.util.ISODateTimeDeserializer; +import com.gooddata.util.ISODateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; import java.util.Map; @@ -19,7 +24,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("instance") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonSerialize(include = NON_NULL) public class Warehouse { private static final String ID_PARAM = "id"; @@ -35,8 +40,8 @@ public class Warehouse { private String description; private String authorizationToken; - private String created; // TODO should be date - private String updated; // TODO should be date + private DateTime created; + private DateTime updated; private String createdBy; private String updatedBy; private String status; @@ -57,8 +62,11 @@ public Warehouse(String title, String authToken, String description) { @JsonCreator Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, - @JsonProperty("description") String description, @JsonProperty("created") String created, @JsonProperty("updated") String updated, - @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, @JsonProperty("status") String status, @JsonProperty("links") Map links) { + @JsonProperty("description") String description, + @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, + @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, + @JsonProperty("status") String status, @JsonProperty("links") Map links) { this(title, authToken, description); this.created = created; this.updated = updated; @@ -88,11 +96,13 @@ public void setDescription(String description) { this.description = description; } - public String getCreated() { + @JsonSerialize(using = ISODateTimeSerializer.class, include = NON_NULL) + public DateTime getCreated() { return created; } - public String getUpdated() { + @JsonSerialize(using = ISODateTimeSerializer.class, include = NON_NULL) + public DateTime getUpdated() { return updated; } diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index 4ed6c09f6..455c295e3 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -4,6 +4,8 @@ package com.gooddata.connector; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import static com.gooddata.connector.Status.Code.ERROR; @@ -14,6 +16,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.joda.time.DateTime.now; public class IntegrationProcessStatusTest { @@ -23,8 +26,8 @@ public void testShouldDeserialize() throws Exception { .readValue(getClass().getResource("/connector/process-status-embedded.json"), IntegrationProcessStatus.class); assertThat(process, is(notNullValue())); - assertThat(process.getStarted(), is("2014-05-30T07:50:15.000Z")); - assertThat(process.getFinished(), is("2014-05-30T07:50:50.000Z")); + assertThat(process.getStarted(), is(new DateTime(2014, 5, 30, 7, 50, 15, DateTimeZone.UTC))); + assertThat(process.getFinished(), is(new DateTime(2014, 5, 30, 7, 50, 50, DateTimeZone.UTC))); assertThat(process.getStatus(), is(notNullValue())); assertThat(process.getStatus().getCode(), is(ERROR.name())); assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); @@ -33,61 +36,61 @@ public void testShouldDeserialize() throws Exception { @Test public void testIsFinishedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnUploading() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), now(), now()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFailedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnUserError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), now(), now()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), "", ""); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now()); assertThat(process.isFailed(), is(false)); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 1974590c4..e07699954 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,6 +1,8 @@ package com.gooddata.dataload.processes; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,10 +19,10 @@ public void testDeserialization() throws Exception { ProcessExecutionDetail.class); assertThat(executionDetail, notNullValue()); assertThat(executionDetail.getStatus(), is("ERROR")); - assertThat(executionDetail.getCreated(), is("2014-02-24T19:00:35.999Z")); - assertThat(executionDetail.getStarted(), is("2014-02-24T19:00:39.155Z")); - assertThat(executionDetail.getUpdated(), is("2014-02-24T19:26:13.197Z")); - assertThat(executionDetail.getFinished(), is("2014-02-24T19:26:13.060Z")); + assertThat(executionDetail.getCreated(), is(new DateTime(2014, 2, 24, 19, 0, 35, 999, DateTimeZone.UTC))); + assertThat(executionDetail.getStarted(), is(new DateTime(2014, 2, 24, 19, 0, 39, 155, DateTimeZone.UTC))); + assertThat(executionDetail.getUpdated(), is(new DateTime(2014, 2, 24, 19, 26, 13, 197, DateTimeZone.UTC))); + assertThat(executionDetail.getFinished(), is(new DateTime(2014, 2, 24, 19, 26, 13, 60, DateTimeZone.UTC))); assertThat(executionDetail.getError(), notNullValue()); assertThat(executionDetail.getError().getErrorCode(), is("executor.error")); assertThat(executionDetail.getError().getFormattedMessage(), diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index 24a326322..9db54bd31 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -2,6 +2,8 @@ import com.gooddata.gdc.ErrorStructure; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import java.io.InputStream; @@ -20,7 +22,7 @@ public void testDeserialize() throws Exception { assertThat(value, is(notNullValue())); assertThat(value.getStatus(), is("ERROR")); - assertThat(value.getDate(), is("2014-04-21 00:11:34")); + assertThat(value.getDate(), is(new DateTime(2014, 4, 21, 0, 11, 34, DateTimeZone.UTC))); final ErrorStructure error = value.getError(); assertThat(error, is(notNullValue())); diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 40e65a130..df852d198 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -4,6 +4,8 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; @@ -16,10 +18,10 @@ public class EntryTest { public static final String LINK = "/gdc/md/PROJECT_ID/obj/ENTRY_ID"; public static final String AUTHOR = "/gdc/account/profile/AUTHOR_USER_ID"; public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; - public static final String CREATED = "2014-04-11 13:45:54"; + public static final DateTime CREATED = new DateTime(2014, 4, 11, 13, 45, 54, DateTimeZone.UTC); public static final String SUMMARY = "Entry summary"; public static final String TITLE = "Entry title"; - public static final String UPDATED = "2014-04-11 13:45:55"; + public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 55, DateTimeZone.UTC); public static final String CATEGORY = "ENTRY_CATEGORY"; public static final String TAGS = "TAG"; public static final String DEPRECATED = "1"; diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 4566e72d4..27e5c3f74 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -4,6 +4,8 @@ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; @@ -15,10 +17,10 @@ public class MetaTest { public static final String AUTHOR = "/gdc/account/profile/USER_ID"; public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; - public static final String CREATED = "2014-04-11 13:45:56"; + public static final DateTime CREATED = new DateTime(2014, 4, 11, 13, 45, 56, DateTimeZone.UTC); public static final String SUMMARY = "Obj summary"; public static final String TITLE = "Obj title"; - public static final String UPDATED = "2014-04-11 13:45:57"; + public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 57, DateTimeZone.UTC); public static final String CATEGORY = "attributeDisplayForm"; public static final String TAGS = "TAG1 TAG2"; public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index f5d018393..a4a836e34 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -5,6 +5,8 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import java.io.InputStream; @@ -18,10 +20,10 @@ public class ObjTest { public static final String AUTHOR = "/gdc/account/profile/USER_ID"; public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; - public static final String CREATED = "2014-04-11 13:45:56"; + public static final DateTime CREATED = new DateTime(2014, 4, 11, 13, 45, 56, DateTimeZone.UTC); public static final String SUMMARY = "Obj summary"; public static final String TITLE = "Obj title"; - public static final String UPDATED = "2014-04-11 13:45:57"; + public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 57, DateTimeZone.UTC); public static final String CATEGORY = "attributeDisplayForm"; public static final String TAGS = "TAG1 TAG2"; public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index aa1daa6ac..c297c556d 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,6 +1,8 @@ package com.gooddata.project; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; @@ -29,8 +31,8 @@ public void testDeserialize() throws Exception { assertThat(project.getSummary(), is("DESC")); assertThat(project.getAuthor(), is("/gdc/account/profile/USER_ID")); assertThat(project.getContributor(), is("/gdc/account/profile/CONTRIB_USER_ID")); - assertThat(project.getCreated(), is("2014-04-11 11:43:45")); - assertThat(project.getUpdated(), is("2014-04-11 11:43:47")); + assertThat(project.getCreated(), is(new DateTime(2014, 4, 11, 11, 43, 45, DateTimeZone.UTC))); + assertThat(project.getUpdated(), is(new DateTime(2014, 4, 11, 11, 43, 47, DateTimeZone.UTC))); assertThat(project.getLdmThumbnailLink(), is("/gdc/projects/PROJECT_ID/ldm?thumbnail=1")); assertThat(project.getUri(), is("/gdc/projects/PROJECT_ID")); diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java new file mode 100644 index 000000000..df2886b47 --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -0,0 +1,22 @@ +package com.gooddata.util; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; + +class GDDateClass { + + private DateTime date; + + @JsonCreator + public GDDateClass(@JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) final DateTime date) { + this.date = date; + } + + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getDate() { + return date; + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java new file mode 100644 index 000000000..90b8f32ed --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -0,0 +1,26 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class GDDateTimeDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeserialize() throws Exception { + final String json = MAPPER.writeValueAsString(new GDDateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("date").getTextValue(), is("2012-03-20 14:31:05")); + + final GDDateClass date = MAPPER.readValue(json, GDDateClass.class); + assertThat(date.getDate(), is(new DateTime(2012, 3, 20, 14, 31, 5, DateTimeZone.UTC))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java new file mode 100644 index 000000000..04bde6966 --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -0,0 +1,24 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class GDDateTimeSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testSerialize() throws Exception { + final GDDateClass foo = new GDDateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); + final String json = MAPPER.writeValueAsString(foo); + final JsonNode node = MAPPER.readTree(json); + + assertThat(node.path("date").getTextValue(), is("2012-03-20 14:31:05")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ISODateClass.java b/src/test/java/com/gooddata/util/ISODateClass.java new file mode 100644 index 000000000..6fa23b791 --- /dev/null +++ b/src/test/java/com/gooddata/util/ISODateClass.java @@ -0,0 +1,22 @@ +package com.gooddata.util; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; + +class ISODateClass { + + private DateTime date; + + @JsonCreator + public ISODateClass(@JsonProperty("date") @JsonDeserialize(using = ISODateTimeDeserializer.class) final DateTime date) { + this.date = date; + } + + @JsonSerialize(using = ISODateTimeSerializer.class) + public DateTime getDate() { + return date; + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java new file mode 100644 index 000000000..499d2df54 --- /dev/null +++ b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java @@ -0,0 +1,27 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class ISODateTimeDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeserialize() throws Exception { + final DateTime expected = new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC); + final String json = MAPPER.writeValueAsString(new ISODateClass(expected)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("date").getTextValue(), is("2012-03-20T14:31:05.003Z")); + + final ISODateClass moo = MAPPER.readValue(json, ISODateClass.class); + assertThat(moo.getDate(), is(expected)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java new file mode 100644 index 000000000..0f1eab9ac --- /dev/null +++ b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java @@ -0,0 +1,24 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class ISODateTimeSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testSerialize() throws Exception { + final ISODateClass foo = new ISODateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); + final String json = MAPPER.writeValueAsString(foo); + final JsonNode node = MAPPER.readTree(json); + + assertThat(node.path("date").getTextValue(), is("2012-03-20T14:31:05.003Z")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 404e07c47..a83bb611f 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -6,6 +6,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import java.io.InputStream; @@ -28,8 +30,8 @@ public void testDeserialization() throws Exception { assertThat(warehouse.getAuthorizationToken(), is("{Token}")); assertThat(warehouse.getCreatedBy(), is("/gdc/account/profile/createdBy")); assertThat(warehouse.getUpdatedBy(), is("/gdc/account/profile/updatedBy")); - assertThat(warehouse.getCreated(), is("2014-05-05T08:27:33.000Z")); - assertThat(warehouse.getUpdated(), is("2014-05-05T08:27:34.000Z")); + assertThat(warehouse.getCreated(), is(new DateTime(2014, 5, 5, 8, 27, 33, DateTimeZone.UTC))); + assertThat(warehouse.getUpdated(), is(new DateTime(2014, 5, 5, 8, 27, 34, DateTimeZone.UTC))); assertThat(warehouse.getAuthorizationToken(), is("{Token}")); } } \ No newline at end of file From 3b2549db2bafe25b8d6c8855268bd187654bef66 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Nov 2014 22:59:42 +0100 Subject: [PATCH 0097/1191] fixed typo - missing space --- .../java/com/gooddata/dataset/DatasetNotFoundException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java index df9dc5804..309656d1d 100644 --- a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java +++ b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java @@ -11,6 +11,6 @@ public class DatasetNotFoundException extends GoodDataException { public DatasetNotFoundException(String dataset, Throwable cause) { - super("Dataset " + dataset + "was not found", cause); + super("Dataset " + dataset + " was not found", cause); } } From f3f14cc8667de7d3a3db712f60d2b78ff3eaa4e8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Nov 2014 23:54:43 +0100 Subject: [PATCH 0098/1191] remove DataStoreServiceTest which duplicates DataStoreServiceIT --- .../gooddata/gdc/DataStoreServiceTest.java | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 src/test/java/com/gooddata/gdc/DataStoreServiceTest.java diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java b/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java deleted file mode 100644 index 91321f1f2..000000000 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gooddata.gdc; - -import org.apache.http.impl.client.HttpClientBuilder; -import org.testng.annotations.AfterMethod; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; - -import java.io.ByteArrayInputStream; - -import static net.jadler.Jadler.closeJadler; -import static net.jadler.Jadler.initJadler; -import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.port; -import static net.jadler.Jadler.verifyThatRequest; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -public class DataStoreServiceTest { - - private DataStoreService storeService; - private GdcService gdcService; - - @BeforeMethod - public void setUp() { - initJadler(); - - gdcService = mock(GdcService.class); - storeService = new DataStoreService(HttpClientBuilder.create(), gdcService, "http://localhost:"+port(), "user", "pass"); - } - - @AfterMethod - public void tearDown() { - closeJadler(); - } - - @Test - public void testUpload() throws Exception { - final Gdc gdc = mock(Gdc.class); - when(gdc.getUserStagingLink()).thenReturn("http://localhost:"+port()); - when(gdcService.getGdc()).thenReturn(gdc); - onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").respond().withStatus(201); - storeService.upload("/test", new ByteArrayInputStream("test".getBytes())); - verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").receivedOnce(); - } - - @Test - public void testUploadRelativePath() throws Exception { - testUploadRelative("/uploads"); - } - - @Test - public void testUploadRelativePathNoSlash() throws Exception { - testUploadRelative("uploads"); - } - - private void testUploadRelative(String path) { - final Gdc gdc = mock(Gdc.class); - when(gdc.getUserStagingLink()).thenReturn(path); - when(gdcService.getGdc()).thenReturn(gdc); - onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").respond().withStatus(201); - storeService.upload("/test", new ByteArrayInputStream("test".getBytes())); - verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").receivedOnce(); - } - - -} \ No newline at end of file From ca296e1383b3a890915a5f0fca9b134b0f3c997b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Nov 2014 23:52:34 +0100 Subject: [PATCH 0099/1191] add convenient dataset manifest methods - set upload mode for all parts - set mapping - map CSV column name to the dataset field --- .../com/gooddata/dataset/DatasetManifest.java | 34 +++++++++++++++++++ .../java/com/gooddata/dataset/UploadMode.java | 5 +++ .../gooddata/dataset/DatasetManifestTest.java | 34 +++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 src/main/java/com/gooddata/dataset/UploadMode.java diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index b35803adc..2e5da4af4 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -13,6 +13,8 @@ import java.util.List; import java.util.Map; +import static com.gooddata.Validate.notNull; + /** * Dataset specific upload manifest */ @@ -60,6 +62,38 @@ public void setFile(String file) { this.file = file; } + /** + * Set upload mode for all parts of this dataset manifest + * @param uploadMode upload mode + */ + public void setUploadMode(final UploadMode uploadMode) { + notNull(uploadMode, "uploadMode"); + for (Part part : parts) { + part.setUploadMode(uploadMode.name()); + } + } + + /** + * Map the given CSV column name to the dataset field + * @param columnName column name + * @param populates dataset field + */ + public void setMapping(final String columnName, final String populates) { + notNull(columnName, "columnName"); + notNull(populates, "populates"); + for (Part part : parts) { + if (part.getPopulates() == null || part.getPopulates().size() != 1) { + throw new IllegalStateException("Only parts with exactly one populates are supported " + part.getPopulates()); + } + final String field = part.getPopulates().iterator().next(); + if (populates.equals(field)) { + part.setColumnName(columnName); + return; + } + } + throw new IllegalArgumentException("Dataset manifest parts doesn't contain populate value " + populates); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public static class Part { diff --git a/src/main/java/com/gooddata/dataset/UploadMode.java b/src/main/java/com/gooddata/dataset/UploadMode.java new file mode 100644 index 000000000..a44e0759e --- /dev/null +++ b/src/main/java/com/gooddata/dataset/UploadMode.java @@ -0,0 +1,5 @@ +package com.gooddata.dataset; + +public enum UploadMode { + INCREMENTAL, FULL +} \ 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 1936de50c..d60632900 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -9,6 +9,7 @@ import java.io.InputStream; import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.hamcrest.CoreMatchers.is; @@ -46,4 +47,37 @@ public void testSerialization() throws Exception { assertThat(manifest, serializesToJson("/dataset/datasetManifest-input.json")); } + + @Test + public void shouldSetUploadModeForAllParts() throws Exception { + final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( + new DatasetManifest.Part("FULL", "col1", asList("attr1"), 1, null), + new DatasetManifest.Part("FULL", "col2", asList("attr2"), 1, null) + )); + manifest.setUploadMode(UploadMode.INCREMENTAL); + + assertThat(manifest.getParts().get(0).getUploadMode(), is("INCREMENTAL")); + assertThat(manifest.getParts().get(1).getUploadMode(), is("INCREMENTAL")); + } + + @Test + public void shouldSetMapping() throws Exception { + final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( + new DatasetManifest.Part("FULL", "col1", asList("attr1"), 1, null), + new DatasetManifest.Part("FULL", "col2", asList("attr2"), 1, null) + )); + manifest.setMapping("c1", "attr1"); + manifest.setMapping("c2", "attr2"); + + assertThat(manifest.getParts().get(0).getColumnName(), is("c1")); + assertThat(manifest.getParts().get(1).getColumnName(), is("c2")); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void shouldFailOnMultiPopulates() throws Exception { + final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( + new DatasetManifest.Part("FULL", "col1", asList("attr1", "attr2"), 1, null) + )); + manifest.setMapping("col", "attr2"); + } } From 7ae5e73080c26538bf6d0f15a8f5b49c414a46ba Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 11 Nov 2014 10:06:14 +0100 Subject: [PATCH 0100/1191] add jackson annotations --- CONTRIBUTE.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index a257f9c08..43d247f2e 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -21,7 +21,9 @@ Below are few **rules, recommendations and best practices** we try to follow whe public static final String URI = "/gdc/someresource/{resource-id}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); ``` +* Put _Jackson_ annotations on getters rather then on fields. * Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed in related service. +* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. TODO -- this is questionable, because almost nothing is tested by JsonUnit now. ### Enums * Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use them when deserializing**. @@ -35,12 +37,11 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); * `get*()` when searching form single object (throw exception when no or multiple objects are found, never return `null`) * `find*()` when searching for multiple objects (collection of objects, never return `null`) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` +* Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. + +## Best practices * **Test class naming**: * `*Test` unit tests * `*IT` integration tests (see [`AbstractGoodDataIT`](src/test/java/com/gooddata/AbstractGoodDataIT.java)) - -## Best practices -* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. TODO -- this is questionable, because almost nothing is tested by JsonUnit now. -* Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. * Everything public should be **documented** using _javadoc_. * When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. From 87d5d5f34e28bae066bb91779c9fa3a5e2bf644a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 11 Nov 2014 20:41:46 +0100 Subject: [PATCH 0101/1191] remove Process and Processes classes This classes were kept for backward compatibility but they work only for method arguments but not for method return values. Close #71 --- .../gooddata/dataload/processes/Process.java | 11 ----------- .../gooddata/dataload/processes/Processes.java | 17 ----------------- 2 files changed, 28 deletions(-) delete mode 100644 src/main/java/com/gooddata/dataload/processes/Process.java delete mode 100644 src/main/java/com/gooddata/dataload/processes/Processes.java diff --git a/src/main/java/com/gooddata/dataload/processes/Process.java b/src/main/java/com/gooddata/dataload/processes/Process.java deleted file mode 100644 index 5e453e535..000000000 --- a/src/main/java/com/gooddata/dataload/processes/Process.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gooddata.dataload.processes; - -/** - * @deprecated This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcess} - */ -@Deprecated -public class Process extends DataloadProcess { - public Process(String name, String type) { - super(name, type); - } -} diff --git a/src/main/java/com/gooddata/dataload/processes/Processes.java b/src/main/java/com/gooddata/dataload/processes/Processes.java deleted file mode 100644 index 21810088f..000000000 --- a/src/main/java/com/gooddata/dataload/processes/Processes.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.dataload.processes; - -import java.util.List; - -/** - * @deprecated This class has been replaced by {@link com.gooddata.dataload.processes.DataloadProcesses} - */ -@Deprecated -public class Processes extends DataloadProcesses { - - private Processes(List items) { - super(items); - } -} From 0397601be4d8f0bcb58fedf1cbc60d6abb12ee89 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Oct 2014 22:58:15 +0100 Subject: [PATCH 0102/1191] change boolean fields from string/integer to boolean --- .../com/gooddata/dataset/DatasetManifest.java | 12 ++++--- .../java/com/gooddata/md/AbstractObj.java | 12 +++---- .../com/gooddata/md/AttributeDisplayForm.java | 2 +- .../java/com/gooddata/md/DisplayForm.java | 20 ++++++----- src/main/java/com/gooddata/md/Entry.java | 24 +++++++------ src/main/java/com/gooddata/md/Meta.java | 24 +++++++------ .../java/com/gooddata/project/Project.java | 8 +++-- .../util/BooleanIntegerDeserializer.java | 23 ++++++++++++ .../util/BooleanIntegerSerializer.java | 18 ++++++++++ .../util/BooleanStringDeserializer.java | 21 +++++++++++ .../util/BooleanStringSerializer.java | 18 ++++++++++ .../gooddata/dataset/DatasetManifestTest.java | 4 +-- .../gooddata/md/AttributeDisplayFormTest.java | 4 +-- .../java/com/gooddata/md/DisplayFormTest.java | 4 +-- src/test/java/com/gooddata/md/EntryTest.java | 12 +++---- src/test/java/com/gooddata/md/MetaTest.java | 12 +++---- src/test/java/com/gooddata/md/ObjTest.java | 12 +++---- .../gooddata/util/BooleanIntegerClass.java | 20 +++++++++++ .../util/BooleanIntegerDeserializerTest.java | 35 +++++++++++++++++++ .../util/BooleanIntegerSerializerTest.java | 29 +++++++++++++++ .../com/gooddata/util/BooleanStringClass.java | 20 +++++++++++ .../util/BooleanStringDeserializerTest.java | 35 +++++++++++++++++++ .../util/BooleanStringSerializerTest.java | 29 +++++++++++++++ src/test/resources/md/attribute-input.json | 5 ++- .../md/attributeDisplayForm-input.json | 5 ++- src/test/resources/md/displayForm-input.json | 5 ++- src/test/resources/md/fact-input.json | 5 ++- src/test/resources/md/metric-input.json | 5 ++- .../oneNumberReportDefinition-input.json | 5 ++- .../resources/md/report/report-input.json | 5 ++- 30 files changed, 359 insertions(+), 74 deletions(-) create mode 100644 src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java create mode 100644 src/main/java/com/gooddata/util/BooleanIntegerSerializer.java create mode 100644 src/main/java/com/gooddata/util/BooleanStringDeserializer.java create mode 100644 src/main/java/com/gooddata/util/BooleanStringSerializer.java create mode 100644 src/test/java/com/gooddata/util/BooleanIntegerClass.java create mode 100644 src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java create mode 100644 src/test/java/com/gooddata/util/BooleanStringClass.java create mode 100644 src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/BooleanStringSerializerTest.java diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index b35803adc..737d5c582 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -3,11 +3,14 @@ */ package com.gooddata.dataset; +import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanIntegerSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.List; @@ -68,14 +71,14 @@ public static class Part { private String uploadMode; private String columnName; private List populates; - private Integer referenceKey; //TODO boolean + private boolean referenceKey; private Map constraints; @JsonCreator Part(@JsonProperty("mode") String uploadMode, @JsonProperty("columnName") String columnName, @JsonProperty("populates") List populates, - @JsonProperty("referenceKey") Integer referenceKey, + @JsonProperty("referenceKey") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean referenceKey, @JsonProperty("constraints") Map constraints) { this.uploadMode = uploadMode; this.columnName = columnName; @@ -108,11 +111,12 @@ public void setPopulates(List populates) { this.populates = populates; } - public Integer getReferenceKey() { + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isReferenceKey() { return referenceKey; } - public void setReferenceKey(Integer referenceKey) { + public void setReferenceKey(boolean referenceKey) { this.referenceKey = referenceKey; } diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index cedbbc85f..b0b6b9ffc 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -67,8 +67,8 @@ public String getUri() { } @JsonIgnore - public String getDeprecated() { - return meta.getDeprecated(); + public boolean isDeprecated() { + return meta.isDeprecated(); } @JsonIgnore @@ -77,13 +77,13 @@ public String getIdentifier() { } @JsonIgnore - public Integer getLocked() { - return meta.getLocked(); + public boolean isLocked() { + return meta.isLocked(); } @JsonIgnore - public Integer getUnlisted() { - return meta.getUnlisted(); + public boolean isUnlisted() { + return meta.isUnlisted(); } /** diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 4f5f827f6..c73b997cf 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -22,7 +22,7 @@ private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("con } /* Just for serialization test */ - AttributeDisplayForm(String title, String formOf, String expression, Integer isDefault, String ldmExpression) { + AttributeDisplayForm(String title, String formOf, String expression, boolean isDefault, String ldmExpression) { super(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression)); } } diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 55cdc9d53..19abee5ba 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -3,10 +3,13 @@ */ package com.gooddata.md; +import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanIntegerSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; /** @@ -36,9 +39,9 @@ public String getExpression() { } @JsonIgnore - public Integer getDefault() { - return content.getDefault(); - } //TODO boolean + public boolean isDefault() { + return content.isDefault(); + } @JsonIgnore public String getLdmExpression() { @@ -51,14 +54,12 @@ protected static class Content { private final String formOf; private final String expression; - @JsonProperty("default") - private final Integer isDefault; - @JsonProperty("ldmexpression") + private final boolean isDefault; private final String ldmExpression; @JsonCreator public Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") Integer isDefault, + @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean isDefault, @JsonProperty("ldmexpression") String ldmExpression) { this.formOf = formOf; this.expression = expression; @@ -74,10 +75,13 @@ public String getExpression() { return expression; } - public Integer getDefault() { + @JsonProperty("default") + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isDefault() { return isDefault; } + @JsonProperty("ldmexpression") public String getLdmExpression() { return ldmExpression; } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 394ceeaf9..293da0afe 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,7 +1,6 @@ package com.gooddata.md; -import com.gooddata.util.GDDateTimeDeserializer; -import com.gooddata.util.GDDateTimeSerializer; +import com.gooddata.util.*; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; @@ -22,13 +21,13 @@ public class Entry { private final String category; private final String author; private final String contributor; - private final String deprecated; //TODO boolean + private final boolean deprecated; private final String identifier; private final String tags; //TODO collection private final DateTime created; private final DateTime updated; - private final Integer locked; //TODO boolean - private final Integer unlisted; //TODO boolean + private final boolean locked; + private final boolean unlisted; @JsonCreator public Entry(@JsonProperty("link") String link, @@ -37,13 +36,13 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("category") String category, @JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("deprecated") String deprecated, + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, @JsonProperty("identifier") String identifier, @JsonProperty("tags") String tags, @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, - @JsonProperty("locked") Integer locked, - @JsonProperty("unlisted") Integer unlisted) { + @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { this.link = link; this.title = title; this.summary = summary; @@ -83,7 +82,8 @@ public String getContributor() { return contributor; } - public String getDeprecated() { + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean isDeprecated() { return deprecated; } @@ -105,11 +105,13 @@ public DateTime getUpdated() { return updated; } - public Integer getLocked() { + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isLocked() { return locked; } - public Integer getUnlisted() { + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isUnlisted() { return unlisted; } } diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 79f7e2b5c..937528bfe 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -3,8 +3,7 @@ */ package com.gooddata.md; -import com.gooddata.util.GDDateTimeDeserializer; -import com.gooddata.util.GDDateTimeSerializer; +import com.gooddata.util.*; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; @@ -30,11 +29,11 @@ public class Meta implements Serializable { private String category; private String tags; //TODO collection private String uri; - private String deprecated; //TODO boolean + private boolean deprecated; private String title; private String identifier; - private Integer locked; //TODO boolean - private Integer unlisted; //TODO boolean + private boolean locked; + private boolean unlisted; @JsonCreator protected Meta(@JsonProperty("author") String author, @@ -46,10 +45,10 @@ protected Meta(@JsonProperty("author") String author, @JsonProperty("category") String category, @JsonProperty("tags") String tags, @JsonProperty("uri") String uri, - @JsonProperty("deprecated") String deprecated, + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("locked") Integer locked, - @JsonProperty("unlisted") Integer unlisted) { + @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { super(); this.author = author; this.uri = uri; @@ -113,7 +112,8 @@ public String getUri() { return uri; } - public String getDeprecated() { + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean isDeprecated() { return deprecated; } @@ -121,11 +121,13 @@ public String getIdentifier() { return identifier; } - public Integer getLocked() { + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isLocked() { return locked; } - public Integer getUnlisted() { + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isUnlisted() { return unlisted; } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index b4ed4fe47..9030fe5f0 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -4,6 +4,8 @@ package com.gooddata.project; import com.gooddata.md.Meta; +import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.GDDateTimeDeserializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; @@ -431,9 +433,11 @@ private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("contri @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("summary") String summary, @JsonProperty("title") String title, @JsonProperty("category") String category, @JsonProperty("tags") String tags, - @JsonProperty("uri") String uri, @JsonProperty("deprecated") String deprecated, + @JsonProperty("uri") String uri, + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("locked") Integer locked, @JsonProperty("unlisted") Integer unlisted) { + @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { super(author, contributor, created, updated, summary, title, category, tags, uri, deprecated, identifier, locked, unlisted); } diff --git a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java new file mode 100644 index 000000000..27eb820f1 --- /dev/null +++ b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java @@ -0,0 +1,23 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; + +import java.io.IOException; + +/** + * Deserializes Integer 1 or 0 as boolean + */ +public class BooleanIntegerDeserializer extends JsonDeserializer { + + private static final Integer ONE = 1; + + @Override + public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + return root != null && ONE.equals(root.getNumberValue()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java new file mode 100644 index 000000000..b8007ed3a --- /dev/null +++ b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java @@ -0,0 +1,18 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; + +import java.io.IOException; + +/** + * Serializes boolean as Integer 1 or 0 + */ +public class BooleanIntegerSerializer extends JsonSerializer { + + @Override + public void serialize(Boolean value, JsonGenerator gen, SerializerProvider arg2) throws IOException { + gen.writeNumber(Boolean.TRUE.equals(value) ? 1 : 0); + } +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java new file mode 100644 index 000000000..f28fc8b53 --- /dev/null +++ b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java @@ -0,0 +1,21 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; + +import java.io.IOException; + +/** + * Deserializes String "1" or "0" as boolean + */ +public class BooleanStringDeserializer extends JsonDeserializer { + + @Override + public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + return root != null && "1".equals(root.getTextValue()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/BooleanStringSerializer.java b/src/main/java/com/gooddata/util/BooleanStringSerializer.java new file mode 100644 index 000000000..265144338 --- /dev/null +++ b/src/main/java/com/gooddata/util/BooleanStringSerializer.java @@ -0,0 +1,18 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; + +import java.io.IOException; + +/** + * Serializes boolean as String "1" or "0" + */ +public class BooleanStringSerializer extends JsonSerializer { + + @Override + public void serialize(Boolean value, JsonGenerator gen, SerializerProvider arg2) throws IOException { + gen.writeString(Boolean.TRUE.equals(value) ? "1" : "0"); + } +} \ 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 1936de50c..dc401d1ba 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -30,7 +30,7 @@ public void testDeserialization() throws Exception { final DatasetManifest.Part lastPart = manifest.getParts().get(2); assertThat(lastPart.getColumnName(), is("d_person_department.nm_xdepartment")); assertThat(lastPart.getUploadMode(), is("FULL")); - assertThat(lastPart.getReferenceKey(), is(1)); + assertThat(lastPart.isReferenceKey(), is(true)); assertThat(lastPart.getPopulates(), hasSize(1)); assertThat(lastPart.getPopulates().get(0), is("attr.person.xdepartment")); @@ -40,7 +40,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { - final DatasetManifest.Part part = new DatasetManifest.Part("MODE", "COLUMN", singletonList("POPULATES"), 1, + final DatasetManifest.Part part = new DatasetManifest.Part("MODE", "COLUMN", singletonList("POPULATES"), true, singletonMap("date", "CONSTRAINT")); final DatasetManifest manifest = new DatasetManifest("DATASET", "FILE", singletonList(part)); diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 4f7ed76eb..6f0ab6b82 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -14,7 +14,7 @@ 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 Integer DEFAULT = 0; + public static final boolean DEFAULT = false; public static final String LDM_EXPRESSION = ""; @Test @@ -25,7 +25,7 @@ public void shouldDeserialize() throws Exception { assertThat(attrDF.getFormOf(), is(FORM_OF)); assertThat(attrDF.getExpression(), is(EXPRESSION)); - assertThat(attrDF.getDefault(), is(DEFAULT)); + assertThat(attrDF.isDefault(), is(DEFAULT)); assertThat(attrDF.getLdmExpression(), is(LDM_EXPRESSION)); } diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index d065b5ebf..f15a0fa62 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -17,7 +17,7 @@ public class DisplayFormTest { 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 Integer DEFAULT = 0; + public static final boolean DEFAULT = false; public static final String LDM_EXPRESSION = ""; @Test @@ -28,7 +28,7 @@ public void shouldDeserialize() throws Exception { assertThat(displayForm.getFormOf(), is(FORM_OF)); assertThat(displayForm.getExpression(), is(EXPRESSION)); - assertThat(displayForm.getDefault(), is(DEFAULT)); + assertThat(displayForm.isDefault(), is(DEFAULT)); assertThat(displayForm.getLdmExpression(), is(LDM_EXPRESSION)); } diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index df852d198..19e392201 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -24,10 +24,10 @@ public class EntryTest { public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 55, DateTimeZone.UTC); public static final String CATEGORY = "ENTRY_CATEGORY"; public static final String TAGS = "TAG"; - public static final String DEPRECATED = "1"; + public static final boolean DEPRECATED = true; public static final String IDENTIFIER = "ID"; - public static final Integer LOCKED = 1; - public static final Integer UNLISTED = 0; + public static final boolean LOCKED = true; + public static final boolean UNLISTED = false; @Test public void testDeserialize() throws Exception { @@ -39,13 +39,13 @@ public void testDeserialize() throws Exception { assertThat(entry.getCategory(), is(CATEGORY)); assertThat(entry.getAuthor(), is(AUTHOR)); assertThat(entry.getContributor(), is(CONTRIBUTOR)); - assertThat(entry.getDeprecated(), is(DEPRECATED)); + assertThat(entry.isDeprecated(), is(DEPRECATED)); assertThat(entry.getIdentifier(), is(IDENTIFIER)); assertThat(entry.getTags(), is(TAGS)); assertThat(entry.getCreated(), is(CREATED)); assertThat(entry.getUpdated(), is(UPDATED)); - assertThat(entry.getLocked(), is(LOCKED)); - assertThat(entry.getUnlisted(), is(UNLISTED)); + assertThat(entry.isLocked(), is(LOCKED)); + assertThat(entry.isUnlisted(), is(UNLISTED)); } @Test diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 27e5c3f74..fba867d00 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -24,10 +24,10 @@ public class MetaTest { public static final String CATEGORY = "attributeDisplayForm"; public static final String TAGS = "TAG1 TAG2"; public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; - public static final String DEPRECATED = "0"; + public static final boolean DEPRECATED = false; public static final String IDENTIFIER = "attr.person.id.name"; - public static final Integer LOCKED = 0; - public static final Integer UNLISTED = 1; + public static final boolean LOCKED = false; + public static final boolean UNLISTED = true; @Test public void testDeserialization() throws Exception { @@ -42,10 +42,10 @@ public void testDeserialization() throws Exception { assertThat(meta.getCategory(), is(CATEGORY)); assertThat(meta.getTags(), is(TAGS)); assertThat(meta.getUri(), is(URI)); - assertThat(meta.getDeprecated(), is(DEPRECATED)); + assertThat(meta.isDeprecated(), is(DEPRECATED)); assertThat(meta.getIdentifier(), is(IDENTIFIER)); - assertThat(meta.getLocked(), is(LOCKED)); - assertThat(meta.getUnlisted(), is(UNLISTED)); + assertThat(meta.isLocked(), is(LOCKED)); + assertThat(meta.isUnlisted(), is(UNLISTED)); } @Test diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index a4a836e34..478e526eb 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -27,10 +27,10 @@ public class ObjTest { public static final String CATEGORY = "attributeDisplayForm"; public static final String TAGS = "TAG1 TAG2"; public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; - public static final String DEPRECATED = "0"; + public static final boolean DEPRECATED = false; public static final String IDENTIFIER = "attr.person.id.name"; - public static final Integer LOCKED = 0; - public static final Integer UNLISTED = 1; + public static final boolean LOCKED = false; + public static final boolean UNLISTED = true; @Test public void testDeserialization() throws Exception { @@ -47,10 +47,10 @@ public void testDeserialization() throws Exception { assertThat(obj.getCategory(), is(CATEGORY)); assertThat(obj.getTags(), is(TAGS)); assertThat(obj.getUri(), is(URI)); - assertThat(obj.getDeprecated(), is(DEPRECATED)); + assertThat(obj.isDeprecated(), is(DEPRECATED)); assertThat(obj.getIdentifier(), is(IDENTIFIER)); - assertThat(obj.getLocked(), is(LOCKED)); - assertThat(obj.getUnlisted(), is(UNLISTED)); + assertThat(obj.isLocked(), is(LOCKED)); + assertThat(obj.isUnlisted(), is(UNLISTED)); } @Test diff --git a/src/test/java/com/gooddata/util/BooleanIntegerClass.java b/src/test/java/com/gooddata/util/BooleanIntegerClass.java new file mode 100644 index 000000000..0ec6c61ed --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanIntegerClass.java @@ -0,0 +1,20 @@ +package com.gooddata.util; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +public class BooleanIntegerClass { + private final boolean foo; + + @JsonCreator + public BooleanIntegerClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanIntegerDeserializer.class) final boolean foo) { + this.foo = foo; + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) + public boolean isFoo() { + return foo; + } +} diff --git a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java new file mode 100644 index 000000000..72ad2c8c7 --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java @@ -0,0 +1,35 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class BooleanIntegerDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldDeserializeTrue() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getNumberValue().intValue(), is(1)); + + final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); + assertThat(moo.isFoo(), is(true)); + } + + @Test + public void shouldDeserializeFalse() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getNumberValue().intValue(), is(0)); + + final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); + assertThat(moo.isFoo(), is(false)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java new file mode 100644 index 000000000..ba2921217 --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java @@ -0,0 +1,29 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class BooleanIntegerSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldSerializeTrue() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getNumberValue().intValue(), is(1)); + } + + @Test + public void shouldSerializeFalse() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getNumberValue().intValue(), is(0)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanStringClass.java b/src/test/java/com/gooddata/util/BooleanStringClass.java new file mode 100644 index 000000000..9821fa6a6 --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanStringClass.java @@ -0,0 +1,20 @@ +package com.gooddata.util; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +public class BooleanStringClass { + private final boolean foo; + + @JsonCreator + public BooleanStringClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanStringDeserializer.class) final boolean foo) { + this.foo = foo; + } + + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean isFoo() { + return foo; + } +} diff --git a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java new file mode 100644 index 000000000..c9da683d8 --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java @@ -0,0 +1,35 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class BooleanStringDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldDeserializeTrue() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getTextValue(), is("1")); + + final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + assertThat(moo.isFoo(), is(true)); + } + + @Test + public void shouldDeserializeFalse() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getTextValue(), is("0")); + + final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + assertThat(moo.isFoo(), is(false)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java new file mode 100644 index 000000000..5200a22c1 --- /dev/null +++ b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java @@ -0,0 +1,29 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class BooleanStringSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldSerializeTrue() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getTextValue(), is("1")); + } + + @Test + public void shouldSerializeFalse() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").getTextValue(), is("0")); + } +} \ No newline at end of file diff --git a/src/test/resources/md/attribute-input.json b/src/test/resources/md/attribute-input.json index bbafb463d..7ea88e071 100644 --- a/src/test/resources/md/attribute-input.json +++ b/src/test/resources/md/attribute-input.json @@ -16,7 +16,10 @@ ] }, "meta" : { - "title" : "Person ID" + "title" : "Person ID", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json index 436233ad3..71f448dae 100644 --- a/src/test/resources/md/attributeDisplayForm-input.json +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -7,7 +7,10 @@ "ldmexpression" : "" }, "meta" : { - "title" : "Person Name" + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } \ No newline at end of file diff --git a/src/test/resources/md/displayForm-input.json b/src/test/resources/md/displayForm-input.json index 1bb516670..76bccda76 100644 --- a/src/test/resources/md/displayForm-input.json +++ b/src/test/resources/md/displayForm-input.json @@ -6,6 +6,9 @@ "ldmexpression" : "" }, "meta" : { - "title" : "Person Name" + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } \ No newline at end of file diff --git a/src/test/resources/md/fact-input.json b/src/test/resources/md/fact-input.json index 022d842e4..736bd2e3b 100644 --- a/src/test/resources/md/fact-input.json +++ b/src/test/resources/md/fact-input.json @@ -9,7 +9,10 @@ ] }, "meta" : { - "title" : "Person Shoe Size" + "title" : "Person Shoe Size", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } diff --git a/src/test/resources/md/metric-input.json b/src/test/resources/md/metric-input.json index 2bdf876e8..85a17e7bb 100644 --- a/src/test/resources/md/metric-input.json +++ b/src/test/resources/md/metric-input.json @@ -5,7 +5,10 @@ "format" : "FORMAT" }, "meta" : { - "title" : "Person Name" + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } diff --git a/src/test/resources/md/report/oneNumberReportDefinition-input.json b/src/test/resources/md/report/oneNumberReportDefinition-input.json index c17b83948..22af47a7d 100644 --- a/src/test/resources/md/report/oneNumberReportDefinition-input.json +++ b/src/test/resources/md/report/oneNumberReportDefinition-input.json @@ -20,7 +20,10 @@ "filters" : [] }, "meta" : { - "title" : "Untitled" + "title" : "Untitled", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } diff --git a/src/test/resources/md/report/report-input.json b/src/test/resources/md/report/report-input.json index 51963d408..f71daab1a 100644 --- a/src/test/resources/md/report/report-input.json +++ b/src/test/resources/md/report/report-input.json @@ -9,7 +9,10 @@ ] }, "meta" : { - "title" : "Beers Consumed This Week" + "title" : "Beers Consumed This Week", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } From 561dc563ab2e7c2ba79f826a12040f143639dbec Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 13 Nov 2014 15:04:47 +0100 Subject: [PATCH 0103/1191] fix compilation problems --- .../java/com/gooddata/dataset/DatasetManifest.java | 3 ++- .../java/com/gooddata/dataset/DatasetManifestTest.java | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 6be31898e..53d62842d 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -16,7 +16,8 @@ import java.util.List; import java.util.Map; -import static com.gooddata.Validate.notNull; +import static com.gooddata.util.Validate.notNull; + /** * Dataset specific upload manifest diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 8141f7947..86036ec75 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -51,8 +51,8 @@ public void testSerialization() throws Exception { @Test public void shouldSetUploadModeForAllParts() throws Exception { final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( - new DatasetManifest.Part("FULL", "col1", asList("attr1"), 1, null), - new DatasetManifest.Part("FULL", "col2", asList("attr2"), 1, null) + new DatasetManifest.Part("FULL", "col1", asList("attr1"), true, null), + new DatasetManifest.Part("FULL", "col2", asList("attr2"), true, null) )); manifest.setUploadMode(UploadMode.INCREMENTAL); @@ -63,8 +63,8 @@ public void shouldSetUploadModeForAllParts() throws Exception { @Test public void shouldSetMapping() throws Exception { final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( - new DatasetManifest.Part("FULL", "col1", asList("attr1"), 1, null), - new DatasetManifest.Part("FULL", "col2", asList("attr2"), 1, null) + new DatasetManifest.Part("FULL", "col1", asList("attr1"), true, null), + new DatasetManifest.Part("FULL", "col2", asList("attr2"), true, null) )); manifest.setMapping("c1", "attr1"); manifest.setMapping("c2", "attr2"); @@ -76,7 +76,7 @@ public void shouldSetMapping() throws Exception { @Test(expectedExceptions = IllegalStateException.class) public void shouldFailOnMultiPopulates() throws Exception { final DatasetManifest manifest = new DatasetManifest("dataset", "file.csv", asList( - new DatasetManifest.Part("FULL", "col1", asList("attr1", "attr2"), 1, null) + new DatasetManifest.Part("FULL", "col1", asList("attr1", "attr2"), true, null) )); manifest.setMapping("col", "attr2"); } From db1e3a48df302911ece712a8248868c622e7ad40 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 13 Nov 2014 15:14:21 +0100 Subject: [PATCH 0104/1191] [maven-release-plugin] prepare release gooddata-java-0.10.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 50b2d58fd..4efbac706 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.9.1-SNAPSHOT + 0.10.0 ${project.artifactId} GoodData Java SDK From 2d1fbeb1d1e524e7b9fe0c13b2e96d530535d7e5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 13 Nov 2014 15:14:21 +0100 Subject: [PATCH 0105/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4efbac706..14299037f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.10.0 + 0.10.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From c80d1f87e1c7428ee3ccec41eae2544bb6fe8d25 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 13 Nov 2014 15:48:23 +0100 Subject: [PATCH 0106/1191] update version to 0.10.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 45c92565a..974bd8c88 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.9.0 + 0.10.0 ``` From 490b84570579ed299732ef03c0e92d36d9df8acc Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 13 Nov 2014 23:27:30 +0100 Subject: [PATCH 0107/1191] add only non-null request id to exception message --- src/main/java/com/gooddata/GoodDataRestException.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 05a3c1de5..398bc14cb 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -29,7 +29,7 @@ public class GoodDataRestException extends GoodDataException { */ public GoodDataRestException(int statusCode, String requestId, String message, String component, String errorClass) { - super(statusCode + ": [requestId=" + requestId + "] " + message); + super(statusCode + (requestId != null ? ": [requestId=" + requestId + "] " : "") + message); this.statusCode = statusCode; this.requestId = requestId; this.component = component; From 4570153bfe8183a5434993f576e9622338f09b0f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 11 Nov 2014 20:52:06 +0100 Subject: [PATCH 0108/1191] expose rest template for extending classes close #60 --- src/main/java/com/gooddata/GoodData.java | 38 ++++++++++++++---------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b8240548a..6e71a17f6 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -30,7 +30,6 @@ import java.util.Arrays; import java.util.Iterator; -import java.util.List; import static com.gooddata.Validate.notEmpty; import static java.util.Collections.singletonMap; @@ -58,6 +57,7 @@ public class GoodData { private static final String HOSTNAME = "secure.gooddata.com"; private static final String UNKNOWN_VERSION = "UNKNOWN"; + private final RestTemplate restTemplate; private final AccountService accountService; private final ProjectService projectService; private final MetadataService metadataService; @@ -123,20 +123,19 @@ public GoodData(String hostname, String login, String password, int port) { notEmpty(protocol, "protocol"); final HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() .setUserAgent(getUserAgent()); - final RestTemplate restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, - protocol); - - accountService = new AccountService(restTemplate); - projectService = new ProjectService(restTemplate, accountService); - metadataService = new MetadataService(restTemplate); - modelService = new ModelService(restTemplate); - gdcService = new GdcService(restTemplate); + restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, protocol); + + accountService = new AccountService(getRestTemplate()); + projectService = new ProjectService(getRestTemplate(), accountService); + metadataService = new MetadataService(getRestTemplate()); + modelService = new ModelService(getRestTemplate()); + gdcService = new GdcService(getRestTemplate()); dataStoreService = new DataStoreService(httpClientBuilder, gdcService, new HttpHost(hostname, port, protocol).toURI(), login, password); - datasetService = new DatasetService(restTemplate, dataStoreService); - reportService = new ReportService(restTemplate); - processService = new ProcessService(restTemplate, accountService); - warehouseService = new WarehouseService(restTemplate, hostname, port); - connectorService = new ConnectorService(restTemplate, projectService); + datasetService = new DatasetService(getRestTemplate(), dataStoreService); + reportService = new ReportService(getRestTemplate()); + processService = new ProcessService(getRestTemplate(), accountService); + warehouseService = new WarehouseService(getRestTemplate(), hostname, port); + connectorService = new ConnectorService(getRestTemplate(), projectService); } private RestTemplate createRestTemplate(String login, String password, String hostname, HttpClientBuilder builder, @@ -167,7 +166,7 @@ private RestTemplate createRestTemplate(String login, String password, String ho return restTemplate; } - protected HttpClient createHttpClient(final String login, final String password, final String hostname, + HttpClient createHttpClient(final String login, final String password, final String hostname, final int port, final String protocol, final HttpClientBuilder builder) { final HttpHost host = new HttpHost(hostname, port, protocol); final HttpClient httpClient = builder.build(); @@ -188,6 +187,15 @@ private String getUserAgent() { "Apache-HttpClient", apacheVersion); } + /** + * Get the configured {@link RestTemplate} used by the library. + * This is the extension point for inheriting classes providing additional services. + * @return REST template + */ + protected final RestTemplate getRestTemplate() { + return restTemplate; + } + /** * Logout from GoodData Platform */ From c3f83ce69c5a166f5891f87765da17307c03b8f4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 16 Nov 2014 01:31:09 +0100 Subject: [PATCH 0109/1191] tweak upload related tests - clean mess in DataStoreIT - return upload link /uploads --- .../com/gooddata/gdc/DataStoreServiceIT.java | 53 ++++++++++--------- .../java/com/gooddata/gdc/GdcServiceIT.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 2 +- src/test/resources/gdc/gdc.json | 2 +- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 9e1fdded9..92ae3ae64 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -2,52 +2,57 @@ import com.gooddata.AbstractGoodDataIT; import org.apache.commons.io.IOUtils; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.ByteArrayInputStream; -import java.io.IOException; +import java.io.InputStream; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; -import static net.jadler.Jadler.verifyThatRequest; public class DataStoreServiceIT extends AbstractGoodDataIT { + private InputStream content; - @Test - public void testUpload() throws Exception { - onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").respond().withStatus(201); - mockGdc("http://localhost:" + port()); - gd.getDataStoreService().upload("/test", new ByteArrayInputStream("test".getBytes())); - verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/test").receivedOnce(); - } - - @Test - public void testUploadRelativePath() throws Exception { - testUploadRelative("/uploads"); + @BeforeMethod + public void setUp() throws Exception { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo("/uploads/test") + .respond() + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .respond() + .withBody(readResource("/gdc/gdc.json")) + .withStatus(200); + content = new ByteArrayInputStream("test".getBytes()); } @Test - public void testUploadRelativePathNoSlash() throws Exception { - testUploadRelative("uploads"); + public void shouldUploadAbsolute() throws Exception { + gd.getDataStoreService().upload("/test", content); } - private void testUploadRelative(String path) throws IOException { - onRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").respond().withStatus(201); - mockGdc(path); - gd.getDataStoreService().upload("/test", new ByteArrayInputStream("test".getBytes())); - verifyThatRequest().havingMethodEqualTo("PUT").havingPathEqualTo("/uploads/test").receivedOnce(); + @Test(enabled = false) // todo #91 + public void shouldUploadRelative() throws Exception { + gd.getDataStoreService().upload("test", content); } - private void mockGdc(String path) throws IOException { - final String gdcBody = IOUtils.toString(getClass().getResourceAsStream("/gdc/gdc.json")).replaceAll("\\{STAGING_LINK\\}", path); + @Test + public void shouldUploadWithFullStagingLink() throws Exception { + final String gdcBody = IOUtils.toString(readResource("/gdc/gdc.json")) + .replaceAll("/uploads", "http://localhost:" + port() + "/uploads"); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc") - .respond() + .respond() .withBody(gdcBody) .withStatus(200); - } + gd.getDataStoreService().upload("/test", content); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index dce47955f..7dbe38036 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -21,6 +21,6 @@ public void shouldReturnGdc() throws Exception { final Gdc gdc = gd.getGdcService().getGdc(); assertThat(gdc, is(notNullValue())); - assertThat(gdc.getUserStagingLink(), is("{STAGING_LINK}")); + assertThat(gdc.getUserStagingLink(), is("/uploads")); } } diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 8b58dcfc2..0eedba857 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -29,6 +29,6 @@ public void deserialize() throws Exception { assertThat(gdc.getToolLink(), is("/gdc/tool")); assertThat(gdc.getTemplatesLink(), is("/gdc/templates")); assertThat(gdc.getReleaseInfoLink(), is("/gdc/releaseInfo")); - assertThat(gdc.getUserStagingLink(), is("{STAGING_LINK}")); + assertThat(gdc.getUserStagingLink(), is("/uploads")); } } \ No newline at end of file diff --git a/src/test/resources/gdc/gdc.json b/src/test/resources/gdc/gdc.json index 209e6b8c6..eec83eb69 100644 --- a/src/test/resources/gdc/gdc.json +++ b/src/test/resources/gdc/gdc.json @@ -76,7 +76,7 @@ "category" : "releaseInfo" }, { - "link" : "{STAGING_LINK}", + "link" : "/uploads", "summary" : "User data staging area.", "title" : "user-uploads", "category" : "uploads" From ff85b9644c264191e944c786e0551dd90452139f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 16 Nov 2014 01:32:00 +0100 Subject: [PATCH 0110/1191] Improve error messages when loading a dataset - read upload_info.json - read log file(s) - add integration tests --- .../com/gooddata/dataset/DatasetService.java | 52 +++++-- .../java/com/gooddata/dataset/FailPart.java | 48 +++++++ .../java/com/gooddata/dataset/FailStatus.java | 31 +++- .../gooddata/dataset/DatasetServiceIT.java | 135 ++++++++++++++++++ .../com/gooddata/dataset/FailStatusTest.java | 18 +++ .../resources/dataset/failStatusComplex.json | 69 +++++++++ .../dataset/pullTaskStatusError.json | 3 + .../resources/dataset/pullTaskStatusOk.json | 3 + 8 files changed, 347 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/FailPart.java create mode 100644 src/test/java/com/gooddata/dataset/DatasetServiceIT.java create mode 100644 src/test/resources/dataset/failStatusComplex.json create mode 100644 src/test/resources/dataset/pullTaskStatusError.json create mode 100644 src/test/resources/dataset/pullTaskStatusOk.json diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 6005312ba..c614f764b 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -21,11 +21,14 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.nio.charset.StandardCharsets.UTF_8; +import static java.util.Arrays.asList; import static java.util.Collections.emptyList; /** @@ -100,17 +103,7 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); final boolean finished = status.isFinished(); if (finished && !status.isSuccess()) { - String message = "status: " + status.getStatus(); - try { - final InputStream input = dataStoreService - .download(dirPath.resolve(STATUS_FILE_NAME).toString()); - final FailStatus failStatus = mapper.readValue(input, FailStatus.class); - if (failStatus != null && failStatus.getError() != null) { - message = failStatus.getError().getFormattedMessage(); - } - } catch (IOException | DataStoreException ignored) { - // todo log? - } + final String message = getErrorMessage(status, dirPath); throw new DatasetException(message, manifest.getDataSet()); } return finished; @@ -132,6 +125,43 @@ protected void onFinish() { } } + private String getErrorMessage(final PullTaskStatus status, final Path dirPath) { + String message = "status: " + status.getStatus(); + try { + final FailStatus failStatus = download(dirPath.resolve(STATUS_FILE_NAME), FailStatus.class); + if (failStatus != null) { + final List errorParts = failStatus.getErrorParts(); + if (!errorParts.isEmpty()) { + final List errors = new ArrayList<>(); + for (FailPart part: errorParts) { + if (part.getLogName() != null) { + try { + final String[] msg = download(dirPath.resolve(part.getLogName()), String[].class); + errors.addAll(asList(msg)); + } catch (IOException | DataStoreException e) { + if (part.getError() != null) { + errors.add(part.getError().getFormattedMessage()); + } + } + } + } + message = errors.toString(); + } else if (failStatus.getError() != null) { + message = failStatus.getError().getFormattedMessage(); + } + } + } catch (IOException | DataStoreException ignored) { + // todo log? + } + return message; + } + + private T download(final Path path, final Class type) throws IOException { + try (final InputStream input = dataStoreService.download(path.toString())) { + return mapper.readValue(input, type); + } + } + /** * Gets DatasetManifest (using {@link #getDatasetManifest(com.gooddata.project.Project, String)} * first and then calls {@link #loadDataset(com.gooddata.project.Project, DatasetManifest, java.io.InputStream)} diff --git a/src/main/java/com/gooddata/dataset/FailPart.java b/src/main/java/com/gooddata/dataset/FailPart.java new file mode 100644 index 000000000..cb629f2db --- /dev/null +++ b/src/main/java/com/gooddata/dataset/FailPart.java @@ -0,0 +1,48 @@ +package com.gooddata.dataset; + +import com.gooddata.gdc.ErrorStructure; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * Describe status of uploaded parts + */ +public class FailPart { + + private final String logName; + private final String fileName; + private final String status; + private final String tableName; + private final ErrorStructure error; + + @JsonCreator + private FailPart(@JsonProperty("logName") String logName, @JsonProperty("fileName") String fileName, + @JsonProperty("status") String status, @JsonProperty("tableName") String tableName, + @JsonProperty("error") ErrorStructure error) { + this.logName = logName; + this.fileName = fileName; + this.status = status; + this.tableName = tableName; + this.error = error; + } + + public String getLogName() { + return logName; + } + + public String getFileName() { + return fileName; + } + + public String getStatus() { + return status; + } + + public String getTableName() { + return tableName; + } + + public ErrorStructure getError() { + return error; + } +} diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java index ba4874c39..04ce34f93 100644 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ b/src/main/java/com/gooddata/dataset/FailStatus.java @@ -4,12 +4,17 @@ import com.gooddata.util.GDDateTimeDeserializer; import com.gooddata.util.GDDateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.joda.time.DateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * Fail status of dataset load. * Deserialization only. @@ -20,14 +25,16 @@ public class FailStatus { private final String status; private final DateTime date; private final ErrorStructure error; + private final List parts; @JsonCreator private FailStatus(@JsonProperty("status") String status, @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date, - @JsonProperty("error") ErrorStructure error) { + @JsonProperty("error") ErrorStructure error, @JsonProperty("parts") List parts) { this.status = status; this.date = date; this.error = error; + this.parts = parts; } public String getStatus() { @@ -42,4 +49,26 @@ public DateTime getDate() { public ErrorStructure getError() { return error; } + + /** + * + * @return or null + */ + public List getParts() { + return parts; + } + + @JsonIgnore + public List getErrorParts() { + if (parts == null) { + return Collections.emptyList(); + } + final List result = new ArrayList<>(parts.size()); + for (FailPart part: parts) { + if ("ERROR".equals(part.getStatus())) { + result.add(part); + } + } + return result; + } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java new file mode 100644 index 000000000..51ecb2630 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -0,0 +1,135 @@ +package com.gooddata.dataset; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.ByteArrayInputStream; +import java.util.Collection; + +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.testng.Assert.fail; + +public class DatasetServiceIT extends AbstractGoodDataIT { + + private Project project; + + @BeforeClass + public void setUpClass() throws Exception { + project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + } + + @BeforeMethod + public void setUp() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .respond() + .withBody(readResource("/gdc/gdc.json")); + onRequest() + .havingPath(startsWith("/uploads/")) + .havingMethodEqualTo("PUT") + .respond() + .withStatus(200); + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/pull") + .havingMethodEqualTo("POST") + .respond() + .withStatus(201) + .withBody(readResource("/dataset/pullTask.json")); + } + + @Test + public void shouldLoadDataset() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(202) + .withBody(readResource("/dataset/pullTask.json")) + .thenRespond() + .withStatus(200) + .withBody(readResource("/dataset/pullTaskStatusOk.json")); + + final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); + } + + @Test + public void shouldFailLoading() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(200) + .withBody(readResource("/dataset/pullTaskStatusError.json")); + final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + try { + gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); + fail("Exception should be thrown"); + } catch (DatasetException e) { + assertThat(e.getMessage(), is("Load dataset dataset.person failed: status: ERROR")); + } + } + + @Test + public void shouldReadErrorMessages() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(200) + .withBody(readResource("/dataset/pullTaskStatusError.json")); + onRequest() + .havingPath(containsString("upload_status.json")) + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + .withBody(readResource("/dataset/failStatusComplex.json")); + onRequest() + .havingPath(containsString("d_adstpch_querynum.csv.log")) + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new String[]{"Very error indeed"})); + + final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + try { + gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); + fail("Exception should be thrown"); + } catch (DatasetException e) { + assertThat(e.getMessage(), is("Load dataset dataset.person failed: [Very error indeed, 1 errors occured during csv import]")); + } + } + + @Test + public void shouldGetDatasetManifest() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface/foo/manifest") + .respond() + .withBody(readResource("/dataset/datasetManifest.json")) + ; + + final DatasetManifest manifest = gd.getDatasetService().getDatasetManifest(project, "foo"); + assertThat(manifest, is(notNullValue())); + } + + @Test + public void shouldListDatasets() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface") + .respond() + .withBody(readResource("/dataset/datasets.json")) + ; + + final Collection datasets = gd.getDatasetService().listDatasets(project); + assertThat(datasets, hasSize(1)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index 9db54bd31..52bb6b135 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -4,6 +4,7 @@ import org.codehaus.jackson.map.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; +import org.hamcrest.Matchers; import org.testng.annotations.Test; import java.io.InputStream; @@ -11,6 +12,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; public class FailStatusTest { @@ -27,4 +29,20 @@ public void testDeserialize() throws Exception { final ErrorStructure error = value.getError(); assertThat(error, is(notNullValue())); } + + @Test + public void testDeserializeComplex() throws Exception { + + final InputStream stream = getClass().getResourceAsStream("/dataset/failStatusComplex.json"); + final FailStatus value = new ObjectMapper().readValue(stream, FailStatus.class); + + assertThat(value, is(notNullValue())); + assertThat(value.getStatus(), is("ERROR")); + assertThat(value.getDate(), is(new DateTime(2014, 11, 11, 22, 25, 11, DateTimeZone.UTC))); + + final ErrorStructure error = value.getError(); + assertThat(error, is(notNullValue())); + + assertThat(value.getErrorParts(), hasSize(2)); + } } diff --git a/src/test/resources/dataset/failStatusComplex.json b/src/test/resources/dataset/failStatusComplex.json new file mode 100644 index 000000000..38d6a67f3 --- /dev/null +++ b/src/test/resources/dataset/failStatusComplex.json @@ -0,0 +1,69 @@ + +{ + "status" : "ERROR", + "date" : "2014-11-11 22:25:11", + "parts" : [ + { + "fileName" : "f_adstpch.csv", + "status" : "OK", + "tableName" : "f_adstpch_aajqnzc4m1apxf8" + }, + { + "fileName" : "d_adstpch_name.csv", + "status" : "OK", + "tableName" : "d_adstpch_name_aajrnzc4m1apxf8" + }, + { + "logName" : "d_adstpch_querynum.csv.log", + "fileName" : "d_adstpch_querynum.csv", + "status" : "ERROR", + "error" : { + "parameters" : [ + 1 + ], + "component" : "GDC::DB2::ETL", + "errorClass" : "GDC::Exception::User", + "message" : "%s errors occured during csv import" + }, + "tableName" : "d_adstpch_querynum_aajsnzc4m1apxf8" + }, + { + "fileName" : "d_adstpch_jdbcuri.csv", + "status" : "OK", + "tableName" : "d_adstpch_jdbcuri_aajtnzc4m1apxf8" + }, + { + "fileName" : "d_adstpch_parallel.csv", + "status" : "OK", + "tableName" : "d_adstpch_parallel_aajunzc4m1apxf8" + }, + { + "logName" : "d_adstpch_repeat.csv.log", + "fileName" : "d_adstpch_repeat.csv", + "status" : "ERROR", + "error" : { + "parameters" : [ + 1 + ], + "component" : "GDC::DB2::ETL", + "errorClass" : "GDC::Exception::User", + "message" : "%s errors occured during csv import" + }, + "tableName" : "d_adstpch_repeat_aajvnzc4m1apxf8" + }, + { + "fileName" : "d_adstpch_size.csv", + "status" : "OK", + "tableName" : "d_adstpch_size_aajwnzc4m1apxf8" + } + ], + "error" : { + "parameters" : [ + 2, + 7 + ], + "component" : "GDC::DB2::ETL", + "errorClass" : "GDC::Exception::User", + "message" : "%d of %d parts failed" + } +} diff --git a/src/test/resources/dataset/pullTaskStatusError.json b/src/test/resources/dataset/pullTaskStatusError.json new file mode 100644 index 000000000..24f0679bd --- /dev/null +++ b/src/test/resources/dataset/pullTaskStatusError.json @@ -0,0 +1,3 @@ +{ + "taskStatus" : "ERROR" +} diff --git a/src/test/resources/dataset/pullTaskStatusOk.json b/src/test/resources/dataset/pullTaskStatusOk.json new file mode 100644 index 000000000..2333f8b6b --- /dev/null +++ b/src/test/resources/dataset/pullTaskStatusOk.json @@ -0,0 +1,3 @@ +{ + "taskStatus" : "OK" +} From 95e22726f9543900218b7a699d399826388f468f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Sep 2014 00:35:03 +0200 Subject: [PATCH 0111/1191] add acceptance tests --- pom.xml | 35 +++ .../java/com/gooddata/ProcessIdMatcher.java | 28 ++ .../java/com/gooddata/ProjectIdMatcher.java | 29 ++ src/test/java/com/gooddata/ShowcaseAT.java | 280 ++++++++++++++++++ .../java/com/gooddata/WarehouseIdMatcher.java | 28 ++ .../dataload/processes/testgraph/sdktest.grf | 77 +++++ .../processes/testgraph/workspace.prm | 0 7 files changed, 477 insertions(+) create mode 100644 src/test/java/com/gooddata/ProcessIdMatcher.java create mode 100644 src/test/java/com/gooddata/ProjectIdMatcher.java create mode 100644 src/test/java/com/gooddata/ShowcaseAT.java create mode 100644 src/test/java/com/gooddata/WarehouseIdMatcher.java create mode 100644 src/test/resources/dataload/processes/testgraph/sdktest.grf create mode 100644 src/test/resources/dataload/processes/testgraph/workspace.prm diff --git a/pom.xml b/pom.xml index 14299037f..95b21e6a0 100644 --- a/pom.xml +++ b/pom.xml @@ -77,6 +77,7 @@ 2.2.1 + install jar @@ -88,6 +89,7 @@ 2.9 + install jar @@ -110,6 +112,39 @@ + + + at + + + + maven-surefire-plugin + + true + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.17 + + + + integration-test + verify + + + + + + **/*AT.java + + + + + + + com.gooddata diff --git a/src/test/java/com/gooddata/ProcessIdMatcher.java b/src/test/java/com/gooddata/ProcessIdMatcher.java new file mode 100644 index 000000000..0703c5386 --- /dev/null +++ b/src/test/java/com/gooddata/ProcessIdMatcher.java @@ -0,0 +1,28 @@ +package com.gooddata; + +import com.gooddata.dataload.processes.DataloadProcess; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +class ProcessIdMatcher extends TypeSafeMatcher { + + private final DataloadProcess process; + + public ProcessIdMatcher(final DataloadProcess process) { + this.process = process; + } + + @Override + public void describeTo(final Description description) { + description.appendText("Process id " + process.getId()); + } + + public static ProcessIdMatcher hasSameIdAs(final DataloadProcess process) { + return new ProcessIdMatcher(process); + } + + @Override + protected boolean matchesSafely(DataloadProcess item) { + return process.getId().equals(item.getId()); + } +} diff --git a/src/test/java/com/gooddata/ProjectIdMatcher.java b/src/test/java/com/gooddata/ProjectIdMatcher.java new file mode 100644 index 000000000..21d3203c5 --- /dev/null +++ b/src/test/java/com/gooddata/ProjectIdMatcher.java @@ -0,0 +1,29 @@ +package com.gooddata; + +import com.gooddata.project.Project; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +class ProjectIdMatcher extends TypeSafeMatcher { + + private final Project project; + + public ProjectIdMatcher(final Project project) { + this.project = project; + } + + @Override + public void describeTo(final Description description) { + description.appendText("Project ids don't match"); + } + + public static ProjectIdMatcher hasSameIdAs(final Project project) { + return new ProjectIdMatcher(project); + } + + @Override + protected boolean matchesSafely(Project item) { + return project.getId().equals(item.getId()); + } +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java new file mode 100644 index 000000000..9d856aa67 --- /dev/null +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -0,0 +1,280 @@ +package com.gooddata; + +import com.gooddata.account.Account; +import com.gooddata.account.AccountService; +import com.gooddata.dataload.processes.DataloadProcess; +import com.gooddata.dataload.processes.ProcessExecution; +import com.gooddata.dataload.processes.ProcessExecutionDetail; +import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.dataload.processes.ProcessType; +import com.gooddata.dataset.DatasetManifest; +import com.gooddata.dataset.DatasetService; +import com.gooddata.gdc.DataStoreService; +import com.gooddata.md.Attribute; +import com.gooddata.md.Fact; +import com.gooddata.md.MetadataService; +import com.gooddata.md.Metric; +import com.gooddata.md.report.AttributeInGrid; +import com.gooddata.md.report.GridElement; +import com.gooddata.md.report.GridReportDefinitionContent; +import com.gooddata.md.report.Report; +import com.gooddata.md.report.ReportDefinition; +import com.gooddata.model.ModelDiff; +import com.gooddata.model.ModelService; +import com.gooddata.project.Project; +import com.gooddata.project.ProjectService; +import com.gooddata.report.ReportExportFormat; +import com.gooddata.report.ReportService; +import com.gooddata.warehouse.Warehouse; +import com.gooddata.warehouse.WarehouseService; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.joda.time.LocalDate; +import org.springframework.core.io.ClassPathResource; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.Collection; +import java.util.UUID; + +import static com.gooddata.ProcessIdMatcher.hasSameIdAs; +import static com.gooddata.ProjectIdMatcher.hasSameIdAs; +import static com.gooddata.WarehouseIdMatcher.hasSameIdAs; +import static com.gooddata.md.Restriction.identifier; +import static java.nio.file.Files.createTempDirectory; +import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.IsCollectionContaining.hasItem; + +public class ShowcaseAT { + + private String title; + private GoodData gd; + private Project project; + private String fact; + private Attribute attr; + private Metric metric; + private ReportDefinition reportDefinition; + private String file; + private String projectToken; + private String warehouseToken; + private Warehouse warehouse; + private DataloadProcess process; + + @BeforeClass + public void setUp() throws Exception { + projectToken = getProperty("projectToken"); + warehouseToken = getProperty("warehouseToken"); + gd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); + title = "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); + } + + private static String getProperty(String name) { + final String value = System.getenv(name); + if (value != null) { + return value; + } + throw new IllegalArgumentException("Environment variable " + name + " not found! Available variables: " + + System.getenv().keySet()); + } + + @AfterClass + public void tearDown() throws Exception { + if (gd != null && project != null) { + gd.getProjectService().removeProject(project); + } + if (gd != null) { + gd.logout(); + } + } + + @Test + public void login() throws Exception { + final AccountService accountService = gd.getAccountService(); + final Account current = accountService.getCurrent(); + assertThat(current.getId(), is(notNullValue())); + } + + @Test(groups = "project", dependsOnMethods = "login") + public void createProject() throws Exception { + project = gd.getProjectService().createProject(new Project(title, projectToken)).get(); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjects() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final Collection projects = projectService.getProjects(); + assertThat(projects, hasItem(hasSameIdAs(project))); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void getProjectById() throws Exception { + final Project project = gd.getProjectService().getProjectById(this.project.getId()); + assertThat(project, hasSameIdAs(this.project)); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void getProjectByUri() throws Exception { + final Project project = gd.getProjectService().getProjectByUri(this.project.getUri()); + assertThat(project, hasSameIdAs(this.project)); + } + + @Test(groups = "model", dependsOnGroups = "project") + public void createModel() throws Exception { + final ModelService modelService = gd.getModelService(); + + final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, + new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); + modelService.updateProjectModel(project, projectModelDiff).get(); + } + + @Test(groups = "md", dependsOnGroups = "model") + public void getObjs() throws Exception { + final MetadataService md = gd.getMetadataService(); + + fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); + attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); + } + + @Test(groups = "md", dependsOnMethods = "getObjs") + public void createMetric() throws Exception { + final MetadataService md = gd.getMetadataService(); + metric = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); + } + + @Test(groups = "md", dependsOnMethods = "createMetric") + public void createReport() throws Exception { + final MetadataService md = gd.getMetadataService(); + + reportDefinition = md.createObj(project, GridReportDefinitionContent.create( + "Department avg shoe size", + asList("metricGroup"), + asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), + asList(new GridElement(metric.getUri(), "Avg shoe size")) + )); + md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); + } + + @Test(groups = "datastore", dependsOnMethods = "login") + public void datastoreUpload() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + + file = "/" + UUID.randomUUID().toString() + "/file.csv"; + dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); + } + + @Test(groups = "datastore", dependsOnMethods = "datastoreUpload") + public void datastoreDownload() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + + final File file = File.createTempFile("file", ".txt"); + try (InputStream stream = dataStoreService.download(this.file)) { + file.deleteOnExit(); + IOUtils.copy(stream, new FileOutputStream(file)); + } finally { + file.delete(); + } + } + + @Test(groups = "datastore", dependsOnMethods = "datastoreDownload") + public void datastoreDelete() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + dataStoreService.delete(this.file); + } + + @Test(groups = "dataset", dependsOnGroups = {"md", "datastore"}) + public void loadDataset() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + + final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); + datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/person.csv")).get(); + } + + @Test(groups = "report", dependsOnGroups = "dataset") + public void exportReportDefinition() throws Exception { + final ReportService reportService = gd.getReportService(); + reportService.exportReport(reportDefinition, ReportExportFormat.CSV, System.out); + } + + @Test(groups = "warehouse", dependsOnMethods = "login") + public void createWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + warehouse = warehouseService.createWarehouse(new Warehouse(title, warehouseToken)).get(); + String jdbc = warehouse.getJdbcConnectionString(); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void getWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + final Warehouse warehouse = warehouseService.getWarehouseById(this.warehouse.getId()); + assertThat(warehouse, is(hasSameIdAs(warehouse))); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void listWarehouses() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + final Collection warehouses = warehouseService.listWarehouses(); + assertThat(warehouses, hasItem(hasSameIdAs(warehouse))); + } + + @Test(dependsOnGroups = "warehouse") + public void removeWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + warehouseService.removeWarehouse(warehouse); + } + + @Test(groups = "process", dependsOnGroups = "project") + public void createProcess() throws Exception { + final File dir = createTempDirectory("sdktest").toFile(); + try { + copy("sdktest.grf", dir); + copy("workspace.prm", dir); + process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); + } finally { + FileUtils.deleteDirectory(dir); + } + } + + public void copy(final String file, final File dir) throws IOException { + IOUtils.copy( + new ClassPathResource("/dataload/processes/testgraph/" + file, getClass()).getInputStream(), + new FileOutputStream(new File(dir, file)) + ); + } + + @Test(groups = "process", dependsOnMethods = "createProcess") + public void processes() { + final Collection processes = gd.getProcessService().listProcesses(project); + assertThat(processes, hasItem(hasSameIdAs(process))); + } + + @Test(groups = "process", dependsOnMethods = "createProcess") + public void executeProcess() throws Exception { + ProcessService processService = gd.getProcessService(); + ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "sdktest.grf")).get(); + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + processService.getExecutionLog(executionDetail, outputStream); + assertThat(outputStream.toString("UTF-8"), allOf(containsString("infoooooooo"), containsString("waaaaaaaarn"), + containsString("errooooooor"), containsString("fataaaaaaal"))); + } + + @Test(dependsOnGroups = "process") + public void removeProcess() throws Exception { + gd.getProcessService().removeProcess(process); + final Collection processes = gd.getProcessService().listProcesses(project); + assertThat(processes, not(hasItem(hasSameIdAs(process)))); + } +} diff --git a/src/test/java/com/gooddata/WarehouseIdMatcher.java b/src/test/java/com/gooddata/WarehouseIdMatcher.java new file mode 100644 index 000000000..bfa35841d --- /dev/null +++ b/src/test/java/com/gooddata/WarehouseIdMatcher.java @@ -0,0 +1,28 @@ +package com.gooddata; + +import com.gooddata.warehouse.Warehouse; +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +class WarehouseIdMatcher extends TypeSafeMatcher { + + private final Warehouse warehouse; + + public WarehouseIdMatcher(final Warehouse warehouse) { + this.warehouse = warehouse; + } + + @Override + public void describeTo(final Description description) { + description.appendText("Warehouse id " + warehouse.getId()); + } + + public static WarehouseIdMatcher hasSameIdAs(final Warehouse warehouse) { + return new WarehouseIdMatcher(warehouse); + } + + @Override + protected boolean matchesSafely(Warehouse item) { + return warehouse.getId().equals(item.getId()); + } +} diff --git a/src/test/resources/dataload/processes/testgraph/sdktest.grf b/src/test/resources/dataload/processes/testgraph/sdktest.grf new file mode 100644 index 000000000..18cce3546 --- /dev/null +++ b/src/test/resources/dataload/processes/testgraph/sdktest.grf @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/resources/dataload/processes/testgraph/workspace.prm b/src/test/resources/dataload/processes/testgraph/workspace.prm new file mode 100644 index 000000000..e69de29bb From 3bb3fb3faf8685ae03decb0452d156e3a1e15662 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 27 Nov 2014 08:00:45 +0100 Subject: [PATCH 0112/1191] do not zip already zipped file --- src/main/java/com/gooddata/util/ZipUtils.java | 31 ++++++++--- .../java/com/gooddata/util/ZipUtilsTest.java | 52 ++++++++++++------- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gooddata/util/ZipUtils.java b/src/main/java/com/gooddata/util/ZipUtils.java index 54e278bc6..2eb99dd51 100644 --- a/src/main/java/com/gooddata/util/ZipUtils.java +++ b/src/main/java/com/gooddata/util/ZipUtils.java @@ -10,6 +10,7 @@ import java.io.OutputStream; import java.nio.file.Path; import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; /** @@ -19,7 +20,8 @@ public abstract class ZipUtils { /** * This method compresses the input file to zip format. If the given file is a directory, it recursively - * packs the directory into the output. Not including give directory itself + * packs the directory into the output. Not including given directory itself. + * If the given file is already zipped, simply copies it into the output. * * @param file file to be zipped * @param output stream where the output will be written @@ -31,7 +33,7 @@ public static void zip(File file, OutputStream output) throws IOException { /** * This method compresses the input file to zip format. If the given file is a directory, it recursively - * packs the directory into the output. + * packs the directory into the output. If the given file is already zipped, simply copies it into the output. * * @param file file to be zipped * @param output stream where the output will be written @@ -42,13 +44,18 @@ public static void zip(File file, OutputStream output, boolean includeRoot) thro notNull(file, "file"); notNull(output, "output"); - try (ZipOutputStream zos = new ZipOutputStream(output)) { - if (file.isDirectory()) { - zipDir(includeRoot ? file.getParentFile().toPath() : file.toPath(), file, zos); - } else { - zipFile(file.getParentFile().toPath(), file, zos); + if (isZipped(file)) { + try (FileInputStream fis = new FileInputStream(file)) { + StreamUtils.copy(fis, output); + } + } else { + try (ZipOutputStream zos = new ZipOutputStream(output)) { + if (file.isDirectory()) { + zipDir(includeRoot ? file.getParentFile().toPath() : file.toPath(), file, zos); + } else { + zipFile(file.getParentFile().toPath(), file, zos); + } } - } } @@ -70,4 +77,12 @@ private static void zipFile(Path rootPath, File file, ZipOutputStream zos) throw } zos.closeEntry(); } + + private static boolean isZipped(File file) { + try { + return new ZipInputStream(new FileInputStream(file)).getNextEntry() != null; + } catch (IOException e) { + return false; + } + } } diff --git a/src/test/java/com/gooddata/util/ZipUtilsTest.java b/src/test/java/com/gooddata/util/ZipUtilsTest.java index 6286cdca0..96fc7383a 100644 --- a/src/test/java/com/gooddata/util/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/util/ZipUtilsTest.java @@ -8,6 +8,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileOutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.ZipEntry; @@ -33,16 +34,12 @@ public void tearDown() throws Exception { @Test public void shouldZipSingleFile() throws Exception { - final File file = temporaryFolder.resolve("someFile.zip").toFile(); + final File file = temporaryFolder.resolve("someFile.txt").toFile(); file.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(file, output); output.close(); - try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { - ZipEntry entry = zipInputStream.getNextEntry(); - assertThat(entry, notNullValue()); - assertThat(entry.getName(), is("someFile.zip")); - } + verifyZipContent(output, "someFile.txt"); } } @@ -50,17 +47,13 @@ public void shouldZipSingleFile() throws Exception { public void shouldZipDir() throws Exception { Path toZipDir = temporaryFolder.resolve("toZip"); toZipDir.toFile().mkdirs(); - File toZipFile = toZipDir.resolve("a/b/someFile.zip").toFile(); + File toZipFile = toZipDir.resolve("a/b/someFile.txt").toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(toZipDir.toFile(), output, true); output.close(); - try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { - ZipEntry entry = zipInputStream.getNextEntry(); - assertThat(entry, notNullValue()); - assertThat(entry.getName(), is("toZip/a/b/someFile.zip")); - } + verifyZipContent(output, "toZip/a/b/someFile.txt"); } } @@ -68,17 +61,40 @@ public void shouldZipDir() throws Exception { public void shouldZipDirWithoutRoot() throws Exception { Path toZipDir = temporaryFolder.resolve("toZip"); toZipDir.toFile().mkdirs(); - File toZipFile = toZipDir.resolve("a/b/someFile.zip").toFile(); + File toZipFile = toZipDir.resolve("a/b/someFile.txt").toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(toZipDir.toFile(), output); output.close(); - try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(output.toByteArray()))) { - ZipEntry entry = zipInputStream.getNextEntry(); - assertThat(entry, notNullValue()); - assertThat(entry.getName(), is("a/b/someFile.zip")); - } + verifyZipContent(output, "a/b/someFile.txt"); + } + } + + @Test + public void shouldNotZipAlreadyZipped() throws Exception { + // first prepare zipped file + final File file = temporaryFolder.resolve("someFile.txt").toFile(); + file.createNewFile(); + final File zipped = temporaryFolder.resolve("zipped.zip").toFile(); + try (FileOutputStream zipStream = new FileOutputStream(zipped)) { + ZipUtils.zip(file, zipStream); + zipStream.close(); + } + + // actual test + try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { + ZipUtils.zip(zipped, output); + output.close(); + verifyZipContent(output, "someFile.txt"); + } + } + + private static void verifyZipContent(ByteArrayOutputStream zip, String shouldContain) throws Exception { + try (ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(zip.toByteArray()))) { + ZipEntry entry = zipInputStream.getNextEntry(); + assertThat(entry, notNullValue()); + assertThat(entry.getName(), is(shouldContain)); } } } \ No newline at end of file From a46f521e141dd5d43d649e881e3a0adb43faeb19 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 27 Nov 2014 08:19:33 +0100 Subject: [PATCH 0113/1191] Fix work with relative paths in DataStoreService --- src/main/java/com/gooddata/UriPrefixer.java | 4 ++- .../java/com/gooddata/UriPrefixerTest.java | 28 +++++++++++++++++++ .../com/gooddata/gdc/DataStoreServiceIT.java | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/test/java/com/gooddata/UriPrefixerTest.java diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 748c61917..a129e490c 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -5,6 +5,7 @@ import org.springframework.web.util.UriComponentsBuilder; +import java.io.File; import java.net.URI; import static com.gooddata.util.Validate.notEmpty; @@ -52,8 +53,9 @@ public URI getUriPrefix() { */ public URI mergeUris(URI uri) { notNull(uri, "uri"); + final String path = new File(uriPrefix.getRawPath(), uri.getRawPath()).getAbsolutePath(); return UriComponentsBuilder.fromUri(uriPrefix) - .path(uri.getRawPath()) + .replacePath(path) .query(uri.getRawQuery()) .fragment(uri.getRawFragment()) .build().toUri(); diff --git a/src/test/java/com/gooddata/UriPrefixerTest.java b/src/test/java/com/gooddata/UriPrefixerTest.java new file mode 100644 index 000000000..8f02c9ab2 --- /dev/null +++ b/src/test/java/com/gooddata/UriPrefixerTest.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import org.testng.annotations.Test; + +import java.net.URI; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class UriPrefixerTest { + + @Test + public void testMergeUrisWithSlash() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads"); + final URI result = prefixer.mergeUris("/test"); + assertThat(result.toString(), is("http://localhost:1/uploads/test")); + } + + @Test + public void testMergeUrisWithoutSlash() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads"); + final URI result = prefixer.mergeUris("test"); + assertThat(result.toString(), is("http://localhost:1/uploads/test")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 92ae3ae64..8e4a8b804 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -36,7 +36,7 @@ public void shouldUploadAbsolute() throws Exception { gd.getDataStoreService().upload("/test", content); } - @Test(enabled = false) // todo #91 + @Test public void shouldUploadRelative() throws Exception { gd.getDataStoreService().upload("test", content); } From f302a42c96d45190685ab55db7282cf3a6c8347b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 28 Nov 2014 23:04:06 +0100 Subject: [PATCH 0114/1191] export report --- .../gooddata/report/ExecuteDefinition.java | 20 ++++++++++ .../com/gooddata/report/ExecuteReport.java | 20 ++++++++++ .../com/gooddata/report/ReportRequest.java | 13 +------ .../com/gooddata/report/ReportService.java | 39 +++++++++++++++---- .../report/ExecuteDefinitionTest.java | 18 +++++++++ ...equestTest.java => ExecuteReportTest.java} | 6 +-- .../com/gooddata/report/ReportServiceIT.java | 18 ++++++++- ...ortRequest.json => executeDefinition.json} | 0 src/test/resources/report/executeReport.json | 5 +++ 9 files changed, 115 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/gooddata/report/ExecuteDefinition.java create mode 100644 src/main/java/com/gooddata/report/ExecuteReport.java create mode 100644 src/test/java/com/gooddata/report/ExecuteDefinitionTest.java rename src/test/java/com/gooddata/report/{ReportRequestTest.java => ExecuteReportTest.java} (75%) rename src/test/resources/report/{reportRequest.json => executeDefinition.json} (100%) create mode 100644 src/test/resources/report/executeReport.json diff --git a/src/main/java/com/gooddata/report/ExecuteDefinition.java b/src/main/java/com/gooddata/report/ExecuteDefinition.java new file mode 100644 index 000000000..cec602c19 --- /dev/null +++ b/src/main/java/com/gooddata/report/ExecuteDefinition.java @@ -0,0 +1,20 @@ +package com.gooddata.report; + + +import org.codehaus.jackson.annotate.JsonProperty; + +import static com.gooddata.util.Validate.notNull; + +class ExecuteDefinition extends ReportRequest { + + private final String reportDefinitionUri; + + public ExecuteDefinition(final String reportDefinitionUri) { + this.reportDefinitionUri = notNull(reportDefinitionUri, "reportDefinitionUri"); + } + + @JsonProperty("reportDefinition") + public String getReportDefinitionUri() { + return reportDefinitionUri; + } +} diff --git a/src/main/java/com/gooddata/report/ExecuteReport.java b/src/main/java/com/gooddata/report/ExecuteReport.java new file mode 100644 index 000000000..467aa34c5 --- /dev/null +++ b/src/main/java/com/gooddata/report/ExecuteReport.java @@ -0,0 +1,20 @@ +package com.gooddata.report; + + +import org.codehaus.jackson.annotate.JsonProperty; + +import static com.gooddata.util.Validate.notNull; + +class ExecuteReport extends ReportRequest { + + private final String reportUri; + + public ExecuteReport(final String reportUri) { + this.reportUri = notNull(reportUri, "reportUri"); + } + + @JsonProperty("report") + public String getReportUri() { + return reportUri; + } +} diff --git a/src/main/java/com/gooddata/report/ReportRequest.java b/src/main/java/com/gooddata/report/ReportRequest.java index dedd847f5..63aeb075b 100644 --- a/src/main/java/com/gooddata/report/ReportRequest.java +++ b/src/main/java/com/gooddata/report/ReportRequest.java @@ -4,7 +4,6 @@ package com.gooddata.report; import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -17,18 +16,8 @@ @JsonTypeName("report_req") @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ReportRequest { +abstract class ReportRequest { public static final String URI = "/gdc/xtab2/executor3"; - private final String reportDefinitionUri; - - public ReportRequest(String reportDefinitionUri) { - this.reportDefinitionUri = reportDefinitionUri; - } - - @JsonProperty("reportDefinition") - public String getReportDefinitionUri() { - return reportDefinitionUri; - } } \ No newline at end of file diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 9d63a6c8c..de4f963ae 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -8,6 +8,7 @@ import com.gooddata.GoodDataException; import com.gooddata.SimplePollHandler; import com.gooddata.gdc.UriResponse; +import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.node.ObjectNode; @@ -26,7 +27,7 @@ import static org.springframework.http.HttpMethod.POST; /** - * Service for report execution and export + * Service for report export */ public class ReportService extends AbstractService { @@ -36,12 +37,38 @@ public ReportService(final RestTemplate restTemplate) { super(restTemplate); } + /** + * Export the given report definition in the given format to the given output strream + * @param reportDefinition report definition + * @param format export format + * @param output target + * @return polling result + */ public FutureResult exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format, final OutputStream output) { - notNull(output, "output"); notNull(reportDefinition, "reportDefinition"); + final ReportRequest request = new ExecuteDefinition(reportDefinition.getUri()); + return exportReport(request, format, output); + } + + /** + * Export the given report in the given format to the given output strream + * @param report report + * @param format export format + * @param output target + * @return polling result + */ + public FutureResult exportReport(final Report report, final ReportExportFormat format, + final OutputStream output) { + notNull(report, "report"); + final ReportRequest request = new ExecuteReport(report.getUri()); + return exportReport(request, format, output); + } + + private FutureResult exportReport(final ReportRequest request, final ReportExportFormat format, final OutputStream output) { + notNull(output, "output"); notNull(format, "format"); - final JsonNode execResult = executeReport(reportDefinition.getUri()); + final JsonNode execResult = executeReport(request); final String uri = exportReport(execResult, format); return new FutureResult<>(this, new SimplePollHandler(uri, Void.class) { @Override @@ -64,12 +91,10 @@ protected void onFinish() { }); } - private JsonNode executeReport(final String reportDefinitionUri) { - notEmpty(reportDefinitionUri, "reportDefinitionUri"); + private JsonNode executeReport(final ReportRequest request) { try { final ResponseEntity entity = restTemplate - .exchange(ReportRequest.URI, POST, new HttpEntity<>(new ReportRequest(reportDefinitionUri)), - String.class); + .exchange(ReportRequest.URI, POST, new HttpEntity<>(request), String.class); return mapper.readTree(entity.getBody()); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to execute report", e); diff --git a/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java new file mode 100644 index 000000000..804bf922c --- /dev/null +++ b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java @@ -0,0 +1,18 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.report; + +import com.gooddata.JsonMatchers; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; + +public class ExecuteDefinitionTest { + + @Test + public void testSerialization() throws Exception { + final ReportRequest request = new ExecuteDefinition("DEF-URI"); + assertThat(request, JsonMatchers.serializesToJson("/report/executeDefinition.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/report/ReportRequestTest.java b/src/test/java/com/gooddata/report/ExecuteReportTest.java similarity index 75% rename from src/test/java/com/gooddata/report/ReportRequestTest.java rename to src/test/java/com/gooddata/report/ExecuteReportTest.java index ac9f88a2a..ed723afdd 100644 --- a/src/test/java/com/gooddata/report/ReportRequestTest.java +++ b/src/test/java/com/gooddata/report/ExecuteReportTest.java @@ -8,11 +8,11 @@ import static org.hamcrest.MatcherAssert.assertThat; -public class ReportRequestTest { +public class ExecuteReportTest { @Test public void testSerialization() throws Exception { - final ReportRequest request = new ReportRequest("DEF-URI"); - assertThat(request, JsonMatchers.serializesToJson("/report/reportRequest.json")); + final ReportRequest request = new ExecuteReport("DEF-URI"); + assertThat(request, JsonMatchers.serializesToJson("/report/executeReport.json")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 390e684b3..b50ba1089 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -2,10 +2,13 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.gdc.UriResponse; +import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.nio.charset.StandardCharsets; import static net.jadler.Jadler.onRequest; @@ -18,8 +21,8 @@ public class ReportServiceIT extends AbstractGoodDataIT { private static final String URI = ReportService.EXPORTING_URI + "/123"; private static final String RESPONSE = "abc"; - @Test - public void shouldExportReport() throws Exception { + @BeforeMethod + public void setUp() throws IOException { onRequest() .havingPathEqualTo(ReportRequest.URI) .havingMethodEqualTo("POST") @@ -40,10 +43,21 @@ public void shouldExportReport() throws Exception { .withStatus(200) .withBody(RESPONSE) ; + } + @Test + public void shouldExportReportDefinition() throws Exception { final ReportDefinition rd = MAPPER.readValue(readResource("/md/report/gridReportDefinition.json"), ReportDefinition.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); } + + @Test + public void shouldExportReport() throws Exception { + final Report rd = MAPPER.readValue(readResource("/md/report/report.json"), Report.class); + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); + assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); + } } \ No newline at end of file diff --git a/src/test/resources/report/reportRequest.json b/src/test/resources/report/executeDefinition.json similarity index 100% rename from src/test/resources/report/reportRequest.json rename to src/test/resources/report/executeDefinition.json diff --git a/src/test/resources/report/executeReport.json b/src/test/resources/report/executeReport.json new file mode 100644 index 000000000..284cb79ed --- /dev/null +++ b/src/test/resources/report/executeReport.json @@ -0,0 +1,5 @@ +{ + "report_req": { + "report": "DEF-URI" + } +} From 7bc9c569e7e4309a0faa4eef8733c5859615b53c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 28 Nov 2014 00:30:32 +0100 Subject: [PATCH 0115/1191] add code coverage with JaCoCo and Coveralls closes #66 --- .travis.yml | 2 +- pom.xml | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b4d18b51e..45b7d3d5b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ language: java install: true -script: mvn verify +script: mvn verify coveralls:report -Pcoverage jdk: - openjdk7 diff --git a/pom.xml b/pom.xml index 95b21e6a0..453db3eda 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 cz.geek @@ -144,6 +145,56 @@ + + coverage + + + + org.eluder.coveralls + coveralls-maven-plugin + 3.0.1 + + + org.jacoco + jacoco-maven-plugin + 0.7.2.201409121644 + + + jacoco-prepare-agent + + prepare-agent + + + + jacoco-prepare-agent-integration + + prepare-agent-integration + + + ${project.build.directory}/jacoco.exec + true + + + + jacoco-report + + report + + + + jacoco-check + + check + + + + + + + + + + From 1e7a75c439df32c39f40d72ccf13589f37970b79 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 8 Jan 2015 16:55:11 +0100 Subject: [PATCH 0116/1191] Update readme - HTTP client with SNI support --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 974bd8c88..f43e795df 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info The *GoodData Java SDK* uses: * the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) (version 0.8.2 or later) -* the *Apache HTTP Client* (version 4.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 *Spring Framework* (version 3.x) * the *Jackson JSON Processor* (version 1.9) From 06c667f17ee52c872bce5eb943df1a79b92b9fd5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 9 Jan 2015 11:03:23 +0100 Subject: [PATCH 0117/1191] Fix example in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f43e795df..1c4e27c63 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ Execute and export reports. ```java ReportService reportService = gd.getReportService(); -reportService.exportReport(definition, PNG, new FileOutputStream("report.png")); +reportService.exportReport(definition, PNG, new FileOutputStream("report.png")).get(); ``` ### DataStore API From 7ffa8b2f9094652914b5db4f3b75f62340f149b4 Mon Sep 17 00:00:00 2001 From: Michal Vanco Date: Fri, 9 Jan 2015 15:29:59 +0100 Subject: [PATCH 0118/1191] REFACTOR: Added static method for the creation of OneNumber report definition --- .../md/report/OneNumberReportDefinitionContent.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index 7c5f8eb40..9e71f6158 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -3,11 +3,14 @@ */ package com.gooddata.md.report; +import com.gooddata.md.Meta; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.List; + /** * One number report definition */ @@ -71,4 +74,10 @@ public String getDescription() { return description; } } + + public static ReportDefinition create(String title, List columns, List rows, + List metrics) { + return new ReportDefinition(new Meta(title), new OneNumberReportDefinitionContent( + new Grid(columns, rows, metrics), title)); + } } From 202a9f95d5b12517a29207f3a62d51230456396e Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 5 Feb 2015 09:34:52 +0100 Subject: [PATCH 0119/1191] fix windows related path and uri bugs --- src/main/java/com/gooddata/UriPrefixer.java | 5 ++-- .../java/com/gooddata/util/ZipUtilsTest.java | 27 ++++++++++--------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index a129e490c..67d348f15 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -3,10 +3,12 @@ */ package com.gooddata; +import org.apache.commons.lang.StringUtils; import org.springframework.web.util.UriComponentsBuilder; import java.io.File; import java.net.URI; +import java.nio.file.Paths; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -53,9 +55,8 @@ public URI getUriPrefix() { */ public URI mergeUris(URI uri) { notNull(uri, "uri"); - final String path = new File(uriPrefix.getRawPath(), uri.getRawPath()).getAbsolutePath(); return UriComponentsBuilder.fromUri(uriPrefix) - .replacePath(path) + .pathSegment(StringUtils.strip(uri.getRawPath(), "/")) .query(uri.getRawQuery()) .fragment(uri.getRawFragment()) .build().toUri(); diff --git a/src/test/java/com/gooddata/util/ZipUtilsTest.java b/src/test/java/com/gooddata/util/ZipUtilsTest.java index 96fc7383a..9bffabac0 100644 --- a/src/test/java/com/gooddata/util/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/util/ZipUtilsTest.java @@ -1,5 +1,8 @@ package com.gooddata.util; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + import org.apache.commons.io.FileUtils; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; @@ -11,15 +14,15 @@ import java.io.FileOutputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; - public class ZipUtilsTest { + private static final String SOME_FILE = "someFile.txt"; + private static final String SOME_FILE_PATH = Paths.get("a", "b", SOME_FILE).toString(); + private Path temporaryFolder; @BeforeClass @@ -34,12 +37,12 @@ public void tearDown() throws Exception { @Test public void shouldZipSingleFile() throws Exception { - final File file = temporaryFolder.resolve("someFile.txt").toFile(); + final File file = temporaryFolder.resolve(SOME_FILE).toFile(); file.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(file, output); output.close(); - verifyZipContent(output, "someFile.txt"); + verifyZipContent(output, SOME_FILE); } } @@ -47,13 +50,13 @@ public void shouldZipSingleFile() throws Exception { public void shouldZipDir() throws Exception { Path toZipDir = temporaryFolder.resolve("toZip"); toZipDir.toFile().mkdirs(); - File toZipFile = toZipDir.resolve("a/b/someFile.txt").toFile(); + File toZipFile = toZipDir.resolve(SOME_FILE_PATH).toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(toZipDir.toFile(), output, true); output.close(); - verifyZipContent(output, "toZip/a/b/someFile.txt"); + verifyZipContent(output, Paths.get("toZip", "a", "b", SOME_FILE).toString()); } } @@ -61,20 +64,20 @@ public void shouldZipDir() throws Exception { public void shouldZipDirWithoutRoot() throws Exception { Path toZipDir = temporaryFolder.resolve("toZip"); toZipDir.toFile().mkdirs(); - File toZipFile = toZipDir.resolve("a/b/someFile.txt").toFile(); + File toZipFile = toZipDir.resolve(SOME_FILE_PATH).toFile(); toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(toZipDir.toFile(), output); output.close(); - verifyZipContent(output, "a/b/someFile.txt"); + verifyZipContent(output, Paths.get("a", "b", SOME_FILE).toString()); } } @Test public void shouldNotZipAlreadyZipped() throws Exception { // first prepare zipped file - final File file = temporaryFolder.resolve("someFile.txt").toFile(); + final File file = temporaryFolder.resolve(SOME_FILE).toFile(); file.createNewFile(); final File zipped = temporaryFolder.resolve("zipped.zip").toFile(); try (FileOutputStream zipStream = new FileOutputStream(zipped)) { @@ -86,7 +89,7 @@ public void shouldNotZipAlreadyZipped() throws Exception { try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { ZipUtils.zip(zipped, output); output.close(); - verifyZipContent(output, "someFile.txt"); + verifyZipContent(output, SOME_FILE); } } From 781aae15147c6c6904abc6d0787b82c18e5cd4a4 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 25 Dec 2014 10:26:45 +0100 Subject: [PATCH 0120/1191] deploy large processes through webdav --- src/main/java/com/gooddata/GoodData.java | 2 +- .../dataload/processes/DataloadProcess.java | 14 +++ .../dataload/processes/ProcessService.java | 41 +++++-- .../com/gooddata/gdc/DataStoreService.java | 9 +- .../processes/DataloadProcessTest.java | 3 + .../processes/ProcessServiceTest.java | 107 ++++++++++++++++++ .../processes/process-input-withPath.json | 7 ++ 7 files changed, 171 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java create mode 100644 src/test/resources/dataload/processes/process-input-withPath.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index dea4b1c28..6ef93bbcb 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -133,7 +133,7 @@ public GoodData(String hostname, String login, String password, int port) { dataStoreService = new DataStoreService(httpClientBuilder, gdcService, new HttpHost(hostname, port, protocol).toURI(), login, password); datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); - processService = new ProcessService(getRestTemplate(), accountService); + processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); warehouseService = new WarehouseService(getRestTemplate(), hostname, port); connectorService = new ConnectorService(getRestTemplate(), projectService); } diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 25f357b0f..ff3fd2b54 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -35,12 +35,18 @@ public class DataloadProcess { private String type; private Set executables; private Map links; + private String path; public DataloadProcess(String name, String type) { this.name = notEmpty(name, "name"); this.type = notEmpty(type, "type"); } + DataloadProcess(String name, String type, String path) { + this(name, type); + this.path = path; + } + public DataloadProcess(String name, ProcessType type) { this(name, notNull(type, "type").toString()); } @@ -70,6 +76,14 @@ public void setType(String type) { this.type = type; } + public String getPath() { + return path; + } + + void setPath(String path) { + this.path = path; + } + @JsonIgnore public Set getExecutables() { return executables; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 250531899..0b71349e0 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -9,6 +9,7 @@ import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.DataStoreService; import com.gooddata.util.ZipUtils; import com.gooddata.account.AccountService; import com.gooddata.project.Project; @@ -25,6 +26,8 @@ import org.springframework.web.client.RestTemplate; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; @@ -37,18 +40,21 @@ public class ProcessService extends AbstractService { private static final MediaType MEDIA_TYPE_ZIP = MediaType.parseMediaType("application/zip"); + private static final long MAX_MULTIPART_SIZE = 1024 * 1024; private final AccountService accountService; + private final DataStoreService dataStoreService; /** * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending * this abstract one. - * * @param restTemplate RESTful HTTP Spring template * @param accountService service to access accounts + * @param dataStoreService service for upload process data */ - public ProcessService(RestTemplate restTemplate, AccountService accountService) { + public ProcessService(RestTemplate restTemplate, AccountService accountService, DataStoreService dataStoreService) { super(restTemplate); + this.dataStoreService = dataStoreService; this.accountService = notNull(accountService, "accountService"); } @@ -251,20 +257,37 @@ private static URI getProcessesUri(Project project) { private DataloadProcess postProcess(DataloadProcess process, File processData, URI postUri) { File tempFile = createTempFile("process", ".zip"); - final MultiValueMap parts = new LinkedMultiValueMap<>(2); - parts.add("process", process); - final HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MEDIA_TYPE_ZIP); - parts.add("data", new HttpEntity<>(new FileSystemResource(tempFile), headers)); - try (FileOutputStream output = new FileOutputStream(tempFile)) { ZipUtils.zip(processData, output); } catch (IOException e) { throw new GoodDataException("Unable to zip process data", e); } + Object processToSend; + HttpMethod method = HttpMethod.POST; + if (tempFile.length() > MAX_MULTIPART_SIZE) { + try { + process.setPath(dataStoreService.getUri(tempFile.getName()).getPath()); + dataStoreService.upload(tempFile.getName(), new FileInputStream(tempFile)); + processToSend = process; + if (DataloadProcess.TEMPLATE.matches(postUri.toString())) { + method = HttpMethod.PUT; + } + } catch (FileNotFoundException e) { + throw new GoodDataException("Unable to access zipped process data at " + + tempFile.getAbsolutePath(), e); + } + } else { + final MultiValueMap parts = new LinkedMultiValueMap<>(2); + parts.add("process", process); + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MEDIA_TYPE_ZIP); + parts.add("data", new HttpEntity<>(new FileSystemResource(tempFile), headers)); + processToSend = parts; + } + try { - return restTemplate.postForObject(postUri, parts, DataloadProcess.class); + return restTemplate.exchange(postUri, method, new HttpEntity<>(processToSend), DataloadProcess.class).getBody(); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to post dataload process.", e); } finally { diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index bc30023d9..9ac1d58c8 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -50,8 +50,13 @@ private UriPrefixer getPrefixer() { return prefixer; } - private URI getUri(String uri) { - return getPrefixer().mergeUris(uri); + /** + * Returns uri for given path (which is used by this service for upload, download or delete) + * @param path path the uri is constructed for + * @return uri for given path + */ + public URI getUri(String path) { + return getPrefixer().mergeUris(path); } /** diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 1f86f7370..46b175831 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -30,5 +30,8 @@ public void testDeserialization() throws Exception { public void testSerialization() { final DataloadProcess process = new DataloadProcess("testProcess", "GROOVY"); assertThat(process, serializesToJson("/dataload/processes/process-input.json")); + + final DataloadProcess processWithPath = new DataloadProcess("testProcess", "GROOVY", "/uploads/process.zip"); + assertThat(processWithPath, serializesToJson("/dataload/processes/process-input-withPath.json")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java new file mode 100644 index 000000000..98b2054ce --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -0,0 +1,107 @@ +package com.gooddata.dataload.processes; + +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.notNull; +import static org.mockito.Mockito.*; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import com.gooddata.account.AccountService; +import com.gooddata.gdc.DataStoreService; +import com.gooddata.project.Project; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.URI; +import java.util.Random; + +public class ProcessServiceTest { + + private static final String PROJECT_ID = "PROJECT_ID"; + + @Mock + private RestTemplate restTemplate; + + @Mock + private AccountService accountService; + + @Mock + private DataStoreService dataStoreService; + + @Mock + private Project project; + + private ProcessService processService; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + processService = new ProcessService(restTemplate, accountService, dataStoreService); + when(project.getId()).thenReturn(PROJECT_ID); + + } + + @Test + public void testCreateProcess() throws Exception { + + final DataloadProcess process = new DataloadProcess("test", ProcessType.GRAPH); + + final ArgumentCaptor entityCaptor = ArgumentCaptor.forClass(HttpEntity.class); + + when(restTemplate.exchange(any(URI.class), eq(HttpMethod.POST), entityCaptor.capture(), eq(DataloadProcess.class))) + .thenReturn(new ResponseEntity<>(process, HttpStatus.CREATED)); + + processService.createProcess(project, process, createProcessOfSize(1)); + + assertNotNull(entityCaptor.getValue()); + assertNotNull(entityCaptor.getValue().getBody()); + assertTrue(entityCaptor.getValue().getBody() instanceof MultiValueMap); + + verifyZeroInteractions(dataStoreService); + } + + @Test + public void testCreateProcessLargerThan1MB() throws Exception { + + final DataloadProcess process = new DataloadProcess("test", ProcessType.GRAPH); + + when(dataStoreService.getUri(anyString())).thenReturn(URI.create("URI")); + when(restTemplate.exchange(any(URI.class), eq(HttpMethod.POST), eq(new HttpEntity<>(process)), eq(DataloadProcess.class))) + .thenReturn(new ResponseEntity<>(process, HttpStatus.CREATED)); + + processService.createProcess(project, process, createProcessOfSize(2048)); + + verify(dataStoreService).upload(anyString(), notNull(InputStream.class)); + } + + + + private static File createProcessOfSize(int size) throws Exception { + final Random r = new Random(); + final File file = File.createTempFile("process", ".txt"); + try (FileOutputStream s = new FileOutputStream(file)) { + for (int i = 0; i < size; i++) { + final byte[] b = new byte[1024]; + r.nextBytes(b); + s.write(b); + } + } + + file.deleteOnExit(); + + return file; + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/process-input-withPath.json b/src/test/resources/dataload/processes/process-input-withPath.json new file mode 100644 index 000000000..ccc522404 --- /dev/null +++ b/src/test/resources/dataload/processes/process-input-withPath.json @@ -0,0 +1,7 @@ +{ + "process" : { + "type" : "GROOVY", + "name" : "testProcess", + "path" : "/uploads/process.zip" + } +} \ No newline at end of file From 868fcec613cc5c054eb932273467239b526ebbf8 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Sun, 8 Feb 2015 21:37:40 +0100 Subject: [PATCH 0121/1191] add updating and retrieving connector integrations --- .../gooddata/connector/ConnectorService.java | 55 +++++++++++++++++++ .../com/gooddata/connector/Integration.java | 4 ++ .../IntegrationNotFoundException.java | 30 ++++++++++ .../connector/ConnectorServiceIT.java | 47 ++++++++++++++++ .../gooddata/connector/IntegrationTest.java | 1 + 5 files changed, 137 insertions(+) create mode 100644 src/main/java/com/gooddata/connector/IntegrationNotFoundException.java diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 843188b58..502c3b1aa 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -12,6 +12,7 @@ import com.gooddata.project.Project; import com.gooddata.project.ProjectService; import com.gooddata.project.ProjectTemplate; +import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -33,6 +34,31 @@ public ConnectorService(final RestTemplate restTemplate, final ProjectService pr this.projectService = notNull(projectService, "projectService"); } + /** + * Retrieve connector integration + * + * @param project project + * @param connectorType connector type + * @return integration + * @throws ConnectorException if integration can't be retrieved + */ + public Integration getIntegration(final Project project, final ConnectorType connectorType) { + notNull(project, "project"); + notNull(connectorType, "connector"); + + try { + return restTemplate.getForObject(Integration.URL, Integration.class, project.getId(), connectorType.getName()); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new IntegrationNotFoundException(project, connectorType, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new ConnectorException("Unable to get " + connectorType + " integration", e); + } + } + /** * Create connector integration with given settings * @@ -79,6 +105,33 @@ public Integration createIntegration(final Project project, final ConnectorType } } + /** + * Update connector integration + * + * @param project project + * @param connectorType connector type + * @param integration integration + * @throws ConnectorException if integration can't be updated + */ + public void updateIntegration(final Project project, final ConnectorType connectorType, + final Integration integration) { + notNull(project, "project"); + notNull(connectorType, "connector"); + notNull(integration, "integration"); + + try { + restTemplate.put(Integration.URL, integration, project.getId(), connectorType.getName()); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new IntegrationNotFoundException(project, connectorType, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new ConnectorException("Unable to update " + connectorType + " integration", e); + } + } + /** * Update integration settings * @@ -133,4 +186,6 @@ public void handlePollResult(final ProcessStatus pollResult) { throw new ConnectorException("Unable to execute " + connectorType + " process", e); } } + + } diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index e68ad1cd1..f965b97eb 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -4,6 +4,7 @@ package com.gooddata.connector; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -61,14 +62,17 @@ public void setActive(final boolean active) { this.active = active; } + @JsonIgnore public IntegrationProcessStatus getLastFinishedProcess() { return lastFinishedProcess; } + @JsonIgnore public IntegrationProcessStatus getLastSuccessfulProcess() { return lastSuccessfulProcess; } + @JsonIgnore public IntegrationProcessStatus getRunningProcess() { return runningProcess; } diff --git a/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java new file mode 100644 index 000000000..f705320b8 --- /dev/null +++ b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java @@ -0,0 +1,30 @@ +package com.gooddata.connector; + +import com.gooddata.GoodDataException; +import com.gooddata.project.Project; + +import static java.lang.String.format; + +/** + * Integration for given project and connector type doesn't exist + */ +public class IntegrationNotFoundException extends GoodDataException { + + private final String projectUri; + + private final ConnectorType connectorType; + + public IntegrationNotFoundException(Project project, ConnectorType connectorType, Throwable e) { + super(format("Integration %s was not found for project %s", connectorType.getName(), project.getUri()), e); + this.projectUri = project.getUri(); + this.connectorType = connectorType; + } + + public String getProjectUri() { + return projectUri; + } + + public ConnectorType getConnectorType() { + return connectorType; + } +} diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index ad0a55f6b..0710833f7 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -48,6 +48,53 @@ public void shouldCreateIntegration() throws Exception { assertThat(integration, notNullValue()); } + @Test + public void shouldGetIntegration() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") + .respond() + .withBody(readResource("/connector/integration.json")); + + final Integration integration = connectors.getIntegration(project, ConnectorType.ZENDESK4); + assertThat(integration, notNullValue()); + } + + @Test(expectedExceptions = IntegrationNotFoundException.class) + public void shouldFailGetIntegrationNotFount() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") + .respond() + .withStatus(404); + + connectors.getIntegration(project, ConnectorType.ZENDESK4); + } + + @Test + public void shouldUpdateIntegration() throws Exception { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") + .respond() + .withBody(readResource("/connector/integration.json")); + + final Integration integration = new Integration("/projectTemplates/template"); + connectors.updateIntegration(project, ConnectorType.ZENDESK4, integration); + } + + @Test(expectedExceptions = IntegrationNotFoundException.class) + public void shouldFailUpdateIntegrationNotFound() throws Exception { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") + .respond() + .withStatus(404); + + final Integration integration = new Integration("/projectTemplates/template"); + connectors.updateIntegration(project, ConnectorType.ZENDESK4, integration); + } + @Test public void shouldExecuteProcess() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index 818ff9111..6b06ffe2b 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -37,4 +37,5 @@ public void testSimplifiedConstructor() throws Exception { assertThat(integration.getProjectTemplate(), is("template")); assertThat(integration.isActive(), is(true)); } + } \ No newline at end of file From d5d254c3a81d247a0718b9152f06ca312e560b45 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 11 Feb 2015 10:23:06 +0100 Subject: [PATCH 0122/1191] add optimize SLI hash method --- .../com/gooddata/dataset/DatasetService.java | 42 ++++++++++++++ .../gooddata/dataset/DatasetTaskStatus.java | 27 +++++++++ .../java/com/gooddata/dataset/EtlMode.java | 36 ++++++++++++ .../com/gooddata/dataset/EtlModeType.java | 16 ++++++ .../java/com/gooddata/dataset/LookupMode.java | 16 ++++++ .../com/gooddata/gdc/AbstractTaskStatus.java | 55 +++++++++++++++++++ .../com/gooddata/model/MaqlDdlTaskStatus.java | 37 +------------ .../gooddata/dataset/DatasetServiceIT.java | 45 +++++++++++++++ .../dataset/DatasetTaskStatusTest.java | 39 +++++++++++++ 9 files changed, 279 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/DatasetTaskStatus.java create mode 100644 src/main/java/com/gooddata/dataset/EtlMode.java create mode 100644 src/main/java/com/gooddata/dataset/EtlModeType.java create mode 100644 src/main/java/com/gooddata/dataset/LookupMode.java create mode 100644 src/main/java/com/gooddata/gdc/AbstractTaskStatus.java create mode 100644 src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index c614f764b..b1ce061ac 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -3,6 +3,7 @@ */ package com.gooddata.dataset; +import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; @@ -10,6 +11,7 @@ import com.gooddata.SimplePollHandler; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; +import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; import org.apache.commons.lang.RandomStringUtils; import org.springframework.http.client.ClientHttpResponse; @@ -196,4 +198,44 @@ public Collection listDatasets(Project project) { throw new GoodDataException("Unable to list datasets for project " + project.getId(), e); } } + + /** + * Optimize SLI hash. This feature is useful only if data warehouse was reduced somehow. Remove unused values from + * the existing SLI hash. + * + * @param project project to optimize SLI hash in + * @return {@link com.gooddata.FutureResult} of the task + */ + public FutureResult optimizeSliHash(final Project project) { + notNull(project, "project"); + + final UriResponse uriResponse = restTemplate.postForObject( + EtlMode.URL, new EtlMode(EtlModeType.SLI, LookupMode.RECREATE), UriResponse.class, project.getId()); + + return new FutureResult<>(this, + new AbstractPollHandler(uriResponse.getUri(), DatasetTaskStatus.class, Void.class) { + @Override + public void handlePollResult(final DatasetTaskStatus pollResult) { + if (!pollResult.isSuccess()) { + throw new GoodDataException("Unable to optimize SLI hash for project " + project.getId()); + } + setResult(null); + } + + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + if (!super.isFinished(response)) { + return false; + } + final DatasetTaskStatus maqlDdlTaskStatus = extractData(response, DatasetTaskStatus.class); + if (maqlDdlTaskStatus.isSuccess()) { + return true; + } + throw new GoodDataException("Unable to optimize SLI hash: " + maqlDdlTaskStatus.getMessages()); + } + + }); + + + } } diff --git a/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java b/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java new file mode 100644 index 000000000..da6a6bdde --- /dev/null +++ b/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java @@ -0,0 +1,27 @@ +package com.gooddata.dataset; + +import com.gooddata.gdc.AbstractTaskStatus; +import com.gooddata.gdc.GdcError; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.Collection; +import java.util.Collections; + +/** + * Dataset asynchronous task status. + * Deserialization only. + */ +class DatasetTaskStatus extends AbstractTaskStatus { + + @JsonCreator + private DatasetTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, + @JsonProperty("messages") Collection messages) { + super(status, pollUri, messages); + } + + DatasetTaskStatus(String status, String pollUri) { + this(status, pollUri, Collections.emptyList()); + } + +} diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java new file mode 100644 index 000000000..c8ac53c6c --- /dev/null +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -0,0 +1,36 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +@JsonTypeName("etlMode") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class EtlMode { + + public static final String URL = "/gdc/md/{project}/etl/mode"; + + private final EtlModeType mode; + + private final LookupMode lookup; + + @JsonCreator + public EtlMode(@JsonProperty("mode") final EtlModeType mode, + @JsonProperty("lookup") final LookupMode lookup) { + this.mode = mode; + this.lookup = lookup; + } + + public EtlModeType getMode() { + return mode; + } + + public LookupMode getLookup() { + return lookup; + } +} diff --git a/src/main/java/com/gooddata/dataset/EtlModeType.java b/src/main/java/com/gooddata/dataset/EtlModeType.java new file mode 100644 index 000000000..f4803bd6f --- /dev/null +++ b/src/main/java/com/gooddata/dataset/EtlModeType.java @@ -0,0 +1,16 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonValue; + +/** + * Enum containing ETL mode types. + */ +enum EtlModeType { + + SLI, DLI, VOID; + + @JsonValue + public String getName() { + return name(); + } +} diff --git a/src/main/java/com/gooddata/dataset/LookupMode.java b/src/main/java/com/gooddata/dataset/LookupMode.java new file mode 100644 index 000000000..f5b88a8aa --- /dev/null +++ b/src/main/java/com/gooddata/dataset/LookupMode.java @@ -0,0 +1,16 @@ +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonValue; + +/** + * Enum containing ETL lookup modes. + */ +enum LookupMode { + + RECREATE; + + @JsonValue + public String getName() { + return name().toLowerCase(); + } +} diff --git a/src/main/java/com/gooddata/gdc/AbstractTaskStatus.java b/src/main/java/com/gooddata/gdc/AbstractTaskStatus.java new file mode 100644 index 000000000..2c7b3af80 --- /dev/null +++ b/src/main/java/com/gooddata/gdc/AbstractTaskStatus.java @@ -0,0 +1,55 @@ +package com.gooddata.gdc; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; + +/** + * Abstract asynchronous task status. + * Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("wTaskStatus") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public abstract class AbstractTaskStatus { + + private static final String OK = "OK"; + private static final String RUNNING = "RUNNING"; + + private final String status; + + private final String pollUri; + + private final Collection messages; + + protected AbstractTaskStatus(final String status, final String pollUri, final Collection messages) { + this.status = status; + this.pollUri = pollUri; + this.messages = messages; + } + + public String getStatus() { + return status; + } + + public String getPollUri() { + return pollUri; + } + + public Collection getMessages() { + return messages; + } + + public boolean isSuccess() { + return OK.equals(status); + } + + public boolean isRunning() { + return RUNNING.equals(status); + } + +} diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java index 43bf593b2..40c320f2f 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java @@ -3,13 +3,10 @@ */ package com.gooddata.model; +import com.gooddata.gdc.AbstractTaskStatus; import com.gooddata.gdc.GdcError; import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -18,45 +15,17 @@ * MAQL DDL asynchronous task status. * Deserialization only. */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("wTaskStatus") -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class MaqlDdlTaskStatus { +class MaqlDdlTaskStatus extends AbstractTaskStatus { - private static final String OK = "OK"; - - private final String status; - - private final String pollUri; - - private final Collection messages; @JsonCreator private MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, @JsonProperty("messages") Collection messages) { - this.status = status; - this.pollUri = pollUri; - this.messages = messages; + super(status, pollUri, messages); } MaqlDdlTaskStatus(String status, String pollUri) { this(status, pollUri, Collections.emptyList()); } - public String getStatus() { - return status; - } - - public String getPollUri() { - return pollUri; - } - - public Collection getMessages() { - return messages; - } - - public boolean isSuccess() { - return OK.equals(status); - } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 51ecb2630..826812527 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -1,6 +1,7 @@ package com.gooddata.dataset; import com.gooddata.AbstractGoodDataIT; +import com.gooddata.GoodDataException; import com.gooddata.project.Project; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; @@ -20,6 +21,8 @@ public class DatasetServiceIT extends AbstractGoodDataIT { + private static final String STATUS_URI = "/gdc/md/PROJECT_ID/tasks/TASK_ID/status"; + private Project project; @BeforeClass @@ -132,4 +135,46 @@ public void shouldListDatasets() throws Exception { final Collection datasets = gd.getDatasetService().listDatasets(project); assertThat(datasets, hasSize(1)); } + + @Test + public void shouldOptimizeSliHash() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/mode") + .respond() + .withStatus(202) + .withBody("{\"uri\" : \"" + STATUS_URI + "\"}"); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("RUNNING", STATUS_URI))) + .thenRespond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("OK", STATUS_URI))); + + gd.getDatasetService().optimizeSliHash(project).get(); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailOptimizeSliHash() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/mode") + .respond() + .withStatus(202) + .withBody("{\"uri\" : \"" + STATUS_URI + "\"}"); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("RUNNING", STATUS_URI))) + .thenRespond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("ERROR", STATUS_URI))); + + gd.getDatasetService().optimizeSliHash(project).get(); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java b/src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java new file mode 100644 index 000000000..5ca3d1218 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java @@ -0,0 +1,39 @@ +package com.gooddata.dataset; + +import com.gooddata.gdc.GdcError; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + +public class DatasetTaskStatusTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeser() throws Exception { + final DatasetTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), DatasetTaskStatus.class); + assertThat(status.getStatus(), is("OK")); + assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); + } + + @Test + public void testDeserMessages() throws Exception { + final DatasetTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), DatasetTaskStatus.class); + assertThat(status.getStatus(), is("ERROR")); + assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); + assertThat(status.getMessages(), hasSize(1)); + final GdcError error = status.getMessages().iterator().next(); + assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); + } + + @Test + public void testSerialize() throws Exception { + final String json = MAPPER.writeValueAsString(new DatasetTaskStatus("OK", "foo")); + final DatasetTaskStatus status = MAPPER.readValue(json, DatasetTaskStatus.class); + assertThat(status.getStatus(), is("OK")); + assertThat(status.getPollUri(), is("foo")); + } +} From 95c9b5597ce4bd2a2e143218ee35319c6e05e2b0 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Feb 2015 00:23:07 +0100 Subject: [PATCH 0123/1191] update gooddata-http-client close #70 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 453db3eda..d8d82da41 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ com.gooddata gooddata-http-client - 0.8.2 + 0.8.3 org.apache.httpcomponents From 33b9310554d2c9f8d22c286e1aea47ad857d980d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Feb 2015 11:07:32 +0100 Subject: [PATCH 0124/1191] remove javadoc and sources plugins --- pom.xml | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/pom.xml b/pom.xml index d8d82da41..6607c21b1 100644 --- a/pom.xml +++ b/pom.xml @@ -73,30 +73,6 @@ - - maven-source-plugin - 2.2.1 - - - install - - jar - - - - - - maven-javadoc-plugin - 2.9 - - - install - - jar - - - - org.apache.maven.plugins maven-failsafe-plugin From 73662e3451bd86f9c713a91b4a622742e322408d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Feb 2015 11:16:23 +0100 Subject: [PATCH 0125/1191] [maven-release-plugin] prepare release gooddata-java-0.11.0 --- pom.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 6607c21b1..2190e9ab3 100644 --- a/pom.xml +++ b/pom.xml @@ -1,11 +1,10 @@ - + 4.0.0 cz.geek gooddata-java - 0.10.1-SNAPSHOT + 0.11.0 ${project.artifactId} GoodData Java SDK @@ -163,7 +162,7 @@ check - + From 2ed4e82b3914d11f43818953eda2a24958aecae0 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Feb 2015 11:17:37 +0100 Subject: [PATCH 0126/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2190e9ab3..8f0983eb6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.11.0 + 0.11.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From a9fbb52e116d0be88d30aad53ab401b9ff523841 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Feb 2015 11:43:25 +0100 Subject: [PATCH 0127/1191] updated version in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1c4e27c63..53753b57a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.10.0 + 0.11.0 ``` From 5c7c5e77404a70633d6d53f4753e474f9f8113a9 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 22 Oct 2014 00:52:03 +0200 Subject: [PATCH 0128/1191] usedby resource support --- src/main/java/com/gooddata/md/InUse.java | 93 +++++++++++++++++++ .../java/com/gooddata/md/InUseEntries.java | 28 ++++++ .../java/com/gooddata/md/MetadataService.java | 33 +++++++ .../com/gooddata/md/MetadataServiceIT.java | 52 +++++++++++ .../com/gooddata/md/MetadataServiceTest.java | 10 +- 5 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gooddata/md/InUse.java create mode 100644 src/main/java/com/gooddata/md/InUseEntries.java create mode 100644 src/test/java/com/gooddata/md/MetadataServiceIT.java diff --git a/src/main/java/com/gooddata/md/InUse.java b/src/main/java/com/gooddata/md/InUse.java new file mode 100644 index 000000000..fedcb9e2f --- /dev/null +++ b/src/main/java/com/gooddata/md/InUse.java @@ -0,0 +1,93 @@ +package com.gooddata.md; + +import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanStringSerializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.HashSet; +import java.util.Set; + +import static com.gooddata.util.Validate.noNullElements; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static java.beans.Introspector.decapitalize; + +/** + * UsedBy/Using result + */ +@JsonTypeName("inUse") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class InUse { + + public static final String USEDBY_URI = "/gdc/md/{projectId}/usedby2"; + + private final String uri; + + private final Set types; + + private final boolean nearest; + + @JsonCreator + InUse(@JsonProperty("uri") String uri, + @JsonProperty("nearest") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean nearest, + @JsonProperty("types") Set types) { + + this.uri = notEmpty(uri, "uri"); + this.types = types; + this.nearest = nearest; + } + + @SafeVarargs + public InUse(String uri, boolean nearest, Class... type) { + this.uri = notNull(uri, "uri"); + noNullElements(type, "type"); + this.types = new HashSet<>(); + for (Class t: type) { + this.types.add(decapitalize(t.getSimpleName())); + } + this.nearest = nearest; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + InUse inUse = (InUse) o; + + if (nearest != inUse.nearest) return false; + if (!types.equals(inUse.types)) return false; + if (!uri.equals(inUse.uri)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = uri.hashCode(); + result = 31 * result + types.hashCode(); + result = 31 * result + (nearest ? 1 : 0); + return result; + } + + public String getUri() { + return uri; + } + + public Set getTypes() { + return types; + } + + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean isNearest() { + return nearest; + } +} diff --git a/src/main/java/com/gooddata/md/InUseEntries.java b/src/main/java/com/gooddata/md/InUseEntries.java new file mode 100644 index 000000000..cc0daa830 --- /dev/null +++ b/src/main/java/com/gooddata/md/InUseEntries.java @@ -0,0 +1,28 @@ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; + +/** + * UsedBy/Using result + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class InUseEntries { + + private final Collection entries; + + @JsonCreator + InUseEntries(@JsonProperty("entries") Collection entries) { + this.entries = entries; + } + + public Collection getEntries() { + return entries; + } + +} diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index a5d7fdfcb..bb006bd93 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -225,4 +225,37 @@ public Collection findUris(Project project, return result; } + /** + * Find all objects which use the given object. + * @param obj object to find using objects for + * @param nearest find nearest objects only + * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', + * 'table'...) + * @return objects using given objects. + */ + public Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { + notNull(obj, "obj"); + return usedBy(project, obj.getUri(), nearest, types); + } + + /** + * Find all objects which use the given object. + * @param uri URI of object to find using objects for + * @param nearest find nearest objects only + * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', + * 'table'...) + * @return objects using given objects. + */ + public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { + notNull(uri, "uri"); + notNull(project, "project"); + + final InUseEntries response; + try { + response = restTemplate.postForObject(InUse.USEDBY_URI, new InUse(uri, nearest, types), InUseEntries.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to find objects.", e); + } + return response.getEntries(); + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java new file mode 100644 index 000000000..44a404548 --- /dev/null +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -0,0 +1,52 @@ +package com.gooddata.md; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.md.report.ReportDefinition; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class MetadataServiceIT extends AbstractGoodDataIT { + + private static final String USEDBY_URI = "/gdc/md/PROJECT_ID/usedby2"; + private static final String OBJ_URI = "OBJ_URI"; + private static final String TITLE = "TITLE"; + + private Project project; + + @BeforeClass + public void setUp() throws Exception { + project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + } + + @Test + public void testUsedBy() throws Exception { + final List entryList = new ArrayList<>(); + final Entry entry = new Entry(null, TITLE, null, null, null, null, false, null, null, null, null, false, false); + entryList.add(entry); + final InUseEntries entries = new InUseEntries(entryList); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(USEDBY_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(entries)); + + final Collection result = gd.getMetadataService().usedBy(project, OBJ_URI, false, ReportDefinition.class); + + assertThat(result, is(notNullValue())); + assertThat(result.size(), is(1)); + assertThat(result.iterator().next().getTitle(), is(TITLE)); + } + +} diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index bfcd4d34c..52e3c01f4 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -5,14 +5,15 @@ import com.gooddata.GoodDataRestException; import com.gooddata.gdc.UriResponse; +import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; -import org.testng.annotations.BeforeMethod; -import org.testng.annotations.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; import static java.lang.String.format; import static org.hamcrest.CoreMatchers.is; @@ -131,6 +132,11 @@ public void testGetObjById() throws Exception { assertThat(result, is(resultObj)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUsedByNullProject() { + service.usedBy(null, URI, false, ReportDefinition.class); + } + //TODO the other methods } \ No newline at end of file From 6bac7b1449bdc530bf5f2561d4fadba69f95de74 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Sat, 28 Feb 2015 12:44:13 +0100 Subject: [PATCH 0129/1191] metadata identifiers resource support --- .../com/gooddata/md/IdentifierAndUri.java | 28 ++++++++++++ .../java/com/gooddata/md/IdentifierToUri.java | 43 +++++++++++++++++++ .../com/gooddata/md/IdentifiersAndUris.java | 25 +++++++++++ .../java/com/gooddata/md/MetadataService.java | 37 ++++++++++++++++ .../com/gooddata/md/MetadataServiceIT.java | 22 ++++++++++ .../com/gooddata/md/MetadataServiceTest.java | 12 +++++- 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/md/IdentifierAndUri.java create mode 100644 src/main/java/com/gooddata/md/IdentifierToUri.java create mode 100644 src/main/java/com/gooddata/md/IdentifiersAndUris.java diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java new file mode 100644 index 000000000..4ec6e3938 --- /dev/null +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -0,0 +1,28 @@ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * Encapsulates identifier and its uri. + */ +class IdentifierAndUri { + + private String identifier; + + private String uri; + + @JsonCreator + IdentifierAndUri(@JsonProperty("identifier") String identifier, @JsonProperty("uri") String uri) { + this.identifier = identifier; + this.uri = uri; + } + + public String getIdentifier() { + return identifier; + } + + public String getUri() { + return uri; + } +} diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java new file mode 100644 index 000000000..6f9677bbf --- /dev/null +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -0,0 +1,43 @@ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; + +import static com.gooddata.util.Validate.notNull; + +/** + * Strucuture with list of symbolic names to be expanded by related uri. + */ +class IdentifierToUri { + + private final List identifierToUri; + + @JsonCreator + IdentifierToUri(@JsonProperty("identifierToUri") final List identifierToUri) { + notNull(identifierToUri, "identifierToUri"); + this.identifierToUri = identifierToUri; + } + + public List getIdentifierToUri() { + return identifierToUri; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + IdentifierToUri that = (IdentifierToUri) o; + + if (!identifierToUri.equals(that.identifierToUri)) return false; + + return true; + } + + @Override + public int hashCode() { + return identifierToUri.hashCode(); + } +} diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java new file mode 100644 index 000000000..8fc829234 --- /dev/null +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -0,0 +1,25 @@ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; + +/** + * Encapsulates list of identifier and its uri. + */ +class IdentifiersAndUris { + + public static final String URI = "/gdc/md/{projectId}/identifiers"; + + private final List identifiers; + + @JsonCreator + IdentifiersAndUris(@JsonProperty("identifiers") List identifiers) { + this.identifiers = identifiers; + } + + public List getIdentifiers() { + return identifiers; + } +} diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index bb006bd93..a35d5c354 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -15,7 +15,9 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; /** @@ -258,4 +260,39 @@ public Collection usedBy(Project project, String uri, boolean nearest, Cl } return response.getEntries(); } + + /** + * Find metadata URIs by restrictions. Identifier is the only supported restriction. + * + * @param project project where to search for the metadata + * @param restrictions query restrictions + * @return the collection of metadata URIs + * @throws com.gooddata.GoodDataException if unable to query metadata + */ + public Collection findUris(Project project, Restriction... restrictions) { + notNull(project, "project" ); + noNullElements(restrictions, "restrictions"); + + final List ids = new ArrayList<>(restrictions.length); + for (Restriction restriction: restrictions) { + if (!Restriction.Type.IDENTIFIER.equals(restriction.getType())) { + throw new IllegalArgumentException("All restrictions have to be of type " + Restriction.Type.IDENTIFIER); + } + ids.add(restriction.getValue()); + } + + final IdentifiersAndUris response; + try { + response = restTemplate.postForObject(IdentifiersAndUris.URI, new IdentifierToUri(ids), IdentifiersAndUris.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to get URIs from identifiers.", e); + } + + final List uris = new ArrayList<>(); + for (IdentifierAndUri idAndUri : response.getIdentifiers()) { + uris.add(idAndUri.getUri()); + } + + return uris; + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 44a404548..31717758a 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -6,6 +6,7 @@ import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -18,7 +19,9 @@ public class MetadataServiceIT extends AbstractGoodDataIT { private static final String USEDBY_URI = "/gdc/md/PROJECT_ID/usedby2"; + private static final String IDENTIFIERS_URI = "/gdc/md/PROJECT_ID/identifiers"; private static final String OBJ_URI = "OBJ_URI"; + private static final String ID = "ID"; private static final String TITLE = "TITLE"; private Project project; @@ -49,4 +52,23 @@ public void testUsedBy() throws Exception { assertThat(result.iterator().next().getTitle(), is(TITLE)); } + @Test + public void testFindIdentifierUris() throws IOException { + final IdentifierAndUri identifierAndUri = new IdentifierAndUri(ID, OBJ_URI); + + final List identifiersAndUris = new ArrayList<>(); + identifiersAndUris.add(identifierAndUri); + IdentifiersAndUris response = new IdentifiersAndUris(identifiersAndUris); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(IDENTIFIERS_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(response)); + + final Collection uris = gd.getMetadataService().findUris(project, Restriction.identifier(ID)); + assertThat(uris.size(), is(1)); + assertThat(uris.iterator().next(), is(OBJ_URI)); + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 52e3c01f4..cae915810 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -137,6 +137,16 @@ public void testUsedByNullProject() { service.usedBy(null, URI, false, ReportDefinition.class); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void testFindIdentifierUrisNullProject() { + service.findUris(null, Restriction.identifier(ID)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testFindIdentifierUrisNullRestriction() { + service.findUris(project, null); + } + //TODO the other methods -} \ No newline at end of file +} From 5a7bba7dd0ca16e0575f60071efaafe5501c529e Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 5 Feb 2015 15:04:50 +0100 Subject: [PATCH 0130/1191] Make reusable constructs in GoodData protected to be accessible in descendants. --- src/main/java/com/gooddata/GoodData.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 6ef93bbcb..5eb1f0c15 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -52,9 +52,9 @@ public class GoodData { public static final String GDC_REQUEST_ID_HEADER = "X-GDC-REQUEST"; - private static final String PROTOCOL = "https"; - private static final int PORT = 443; - private static final String HOSTNAME = "secure.gooddata.com"; + protected static final String PROTOCOL = "https"; + protected static final int PORT = 443; + protected static final String HOSTNAME = "secure.gooddata.com"; private static final String UNKNOWN_VERSION = "UNKNOWN"; private final RestTemplate restTemplate; @@ -116,7 +116,7 @@ public GoodData(String hostname, String login, String password, int port) { * @param port GoodData Platform's API port (e.g. 443) * @param protocol GoodData Platform's API protocol (e.g. https) */ - GoodData(String hostname, String login, String password, int port, String protocol) { + protected GoodData(String hostname, String login, String password, int port, String protocol) { notEmpty(hostname, "hostname"); notEmpty(login, "login"); notEmpty(password, "password"); @@ -166,7 +166,7 @@ private RestTemplate createRestTemplate(String login, String password, String ho return restTemplate; } - HttpClient createHttpClient(final String login, final String password, final String hostname, + protected HttpClient createHttpClient(final String login, final String password, final String hostname, final int port, final String protocol, final HttpClientBuilder builder) { final HttpHost host = new HttpHost(hostname, port, protocol); final HttpClient httpClient = builder.build(); From f961b04604b9176ea31f6ae54fcd1a2d3de0ec77 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Mar 2015 18:52:30 +0200 Subject: [PATCH 0131/1191] explicitly set RestTemplate's message converters Jackson2 on classpath breaks de/serialization this time via AllEncompassingFormHttpMessageConverter which uses classpath detection and favours Jackson2 over Jackson1. Closes: #121 Relates: #80 --- pom.xml | 6 ++++ src/main/java/com/gooddata/GoodData.java | 38 +++++++++++++++--------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 8f0983eb6..5fb5b68a8 100644 --- a/pom.xml +++ b/pom.xml @@ -211,6 +211,12 @@ jackson-mapper-asl 1.9.12 + + com.fasterxml.jackson.core + jackson-databind + 2.5.1 + test + com.github.lookfirst sardine diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 5eb1f0c15..a61fe7eb4 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -24,12 +24,17 @@ import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.ResourceHttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.web.client.RestTemplate; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Iterator; +import java.util.List; import static com.gooddata.util.Validate.notEmpty; import static java.util.Collections.singletonMap; @@ -149,19 +154,24 @@ private RestTemplate createRestTemplate(String login, String password, String ho new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); - // make sure jackson1 converter is present and remove all converters conflicting with it (eg. jackson2) - final MappingJacksonHttpMessageConverter jacksonConverter = new MappingJacksonHttpMessageConverter(); - final Iterator> it = restTemplate.getMessageConverters().iterator(); - while (it.hasNext()) { - final HttpMessageConverter converter = it.next(); - for (MediaType type: converter.getSupportedMediaTypes()) { - if (jacksonConverter.getSupportedMediaTypes().contains(type)) { - it.remove(); - break; - } - } - } - restTemplate.getMessageConverters().add(jacksonConverter); + // avoid jackson2 auto-detection and ensure jackson1 converter is present + final List> partConverters = new ArrayList<>(); + partConverters.add(new ByteArrayHttpMessageConverter()); + final StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); + stringHttpMessageConverter.setWriteAcceptCharset(false); + partConverters.add(stringHttpMessageConverter); + partConverters.add(new ResourceHttpMessageConverter()); + partConverters.add(new MappingJacksonHttpMessageConverter()); + final FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); + formHttpMessageConverter.setPartConverters(partConverters); + + final List> messageConverters = new ArrayList<>(); + messageConverters.add(new ByteArrayHttpMessageConverter()); + messageConverters.add(new StringHttpMessageConverter()); + messageConverters.add(new ResourceHttpMessageConverter()); + messageConverters.add(formHttpMessageConverter); + messageConverters.add(new MappingJacksonHttpMessageConverter()); + restTemplate.setMessageConverters(messageConverters); return restTemplate; } From c48462d21e3850e297ca11a763baf76c5ac3d01e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Mar 2015 19:01:52 +0200 Subject: [PATCH 0132/1191] don't build all branches in travis but master --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 45b7d3d5b..63868983a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,3 +3,6 @@ install: true script: mvn verify coveralls:report -Pcoverage jdk: - openjdk7 +branches: + only: + - master From 9b3af8953eade6289386b8dde4359a9c549f2745 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 31 Mar 2015 16:46:38 +0200 Subject: [PATCH 0133/1191] unify TaskStatus --- .../com/gooddata/dataset/DatasetService.java | 7 +-- .../gooddata/dataset/DatasetTaskStatus.java | 27 ------------ ...bstractTaskStatus.java => TaskStatus.java} | 13 +++++- .../com/gooddata/model/MaqlDdlTaskStatus.java | 31 ------------- .../java/com/gooddata/model/ModelService.java | 3 +- .../gooddata/dataset/DatasetServiceIT.java | 9 ++-- .../TaskStatusTest.java} | 22 +++++----- .../gooddata/model/MaqlDdlTaskStatusTest.java | 43 ------------------- .../com/gooddata/model/ModelServiceIT.java | 5 ++- 9 files changed, 36 insertions(+), 124 deletions(-) delete mode 100644 src/main/java/com/gooddata/dataset/DatasetTaskStatus.java rename src/main/java/com/gooddata/gdc/{AbstractTaskStatus.java => TaskStatus.java} (71%) delete mode 100644 src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java rename src/test/java/com/gooddata/{dataset/DatasetTaskStatusTest.java => gdc/TaskStatusTest.java} (56%) delete mode 100644 src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index b1ce061ac..373e054ea 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -11,6 +11,7 @@ import com.gooddata.SimplePollHandler; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; +import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; import org.apache.commons.lang.RandomStringUtils; @@ -213,9 +214,9 @@ public FutureResult optimizeSliHash(final Project project) { EtlMode.URL, new EtlMode(EtlModeType.SLI, LookupMode.RECREATE), UriResponse.class, project.getId()); return new FutureResult<>(this, - new AbstractPollHandler(uriResponse.getUri(), DatasetTaskStatus.class, Void.class) { + new AbstractPollHandler(uriResponse.getUri(), TaskStatus.class, Void.class) { @Override - public void handlePollResult(final DatasetTaskStatus pollResult) { + public void handlePollResult(final TaskStatus pollResult) { if (!pollResult.isSuccess()) { throw new GoodDataException("Unable to optimize SLI hash for project " + project.getId()); } @@ -227,7 +228,7 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException if (!super.isFinished(response)) { return false; } - final DatasetTaskStatus maqlDdlTaskStatus = extractData(response, DatasetTaskStatus.class); + final TaskStatus maqlDdlTaskStatus = extractData(response, TaskStatus.class); if (maqlDdlTaskStatus.isSuccess()) { return true; } diff --git a/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java b/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java deleted file mode 100644 index da6a6bdde..000000000 --- a/src/main/java/com/gooddata/dataset/DatasetTaskStatus.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.gooddata.dataset; - -import com.gooddata.gdc.AbstractTaskStatus; -import com.gooddata.gdc.GdcError; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; - -import java.util.Collection; -import java.util.Collections; - -/** - * Dataset asynchronous task status. - * Deserialization only. - */ -class DatasetTaskStatus extends AbstractTaskStatus { - - @JsonCreator - private DatasetTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, - @JsonProperty("messages") Collection messages) { - super(status, pollUri, messages); - } - - DatasetTaskStatus(String status, String pollUri) { - this(status, pollUri, Collections.emptyList()); - } - -} diff --git a/src/main/java/com/gooddata/gdc/AbstractTaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java similarity index 71% rename from src/main/java/com/gooddata/gdc/AbstractTaskStatus.java rename to src/main/java/com/gooddata/gdc/TaskStatus.java index 2c7b3af80..3b0fb8942 100644 --- a/src/main/java/com/gooddata/gdc/AbstractTaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -1,11 +1,14 @@ package com.gooddata.gdc; +import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.Collection; +import java.util.Collections; /** * Abstract asynchronous task status. @@ -15,7 +18,7 @@ @JsonTypeName("wTaskStatus") @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public abstract class AbstractTaskStatus { +public class TaskStatus { private static final String OK = "OK"; private static final String RUNNING = "RUNNING"; @@ -26,12 +29,18 @@ public abstract class AbstractTaskStatus { private final Collection messages; - protected AbstractTaskStatus(final String status, final String pollUri, final Collection messages) { + @JsonCreator + private TaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, + @JsonProperty("messages") Collection messages) { this.status = status; this.pollUri = pollUri; this.messages = messages; } + public TaskStatus(final String status, final String pollUri) { + this(status, pollUri, Collections.emptyList()); + } + public String getStatus() { return status; } diff --git a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java b/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java deleted file mode 100644 index 40c320f2f..000000000 --- a/src/main/java/com/gooddata/model/MaqlDdlTaskStatus.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.model; - -import com.gooddata.gdc.AbstractTaskStatus; -import com.gooddata.gdc.GdcError; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; - -import java.util.Collection; -import java.util.Collections; - -/** - * MAQL DDL asynchronous task status. - * Deserialization only. - */ -class MaqlDdlTaskStatus extends AbstractTaskStatus { - - - @JsonCreator - private MaqlDdlTaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") String pollUri, - @JsonProperty("messages") Collection messages) { - super(status, pollUri, messages); - } - - MaqlDdlTaskStatus(String status, String pollUri) { - this(status, pollUri, Collections.emptyList()); - } - -} diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index d534193c8..4c05f73f4 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -9,6 +9,7 @@ import com.gooddata.AbstractPollHandlerBase; import com.gooddata.SimplePollHandler; import com.gooddata.gdc.AsyncTask; +import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.FileCopyUtils; @@ -148,7 +149,7 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException if (!super.isFinished(response)) { return false; } - final MaqlDdlTaskStatus maqlDdlTaskStatus = extractData(response, MaqlDdlTaskStatus.class); + final TaskStatus maqlDdlTaskStatus = extractData(response, TaskStatus.class); if (!maqlDdlTaskStatus.isSuccess()) { throw new ModelException("Unable to update project model: " + maqlDdlTaskStatus.getMessages()); } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 826812527..e29f34a1f 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -2,6 +2,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; @@ -149,10 +150,10 @@ public void shouldOptimizeSliHash() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("RUNNING", STATUS_URI))) + .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("OK", STATUS_URI))); + .withBody(MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))); gd.getDatasetService().optimizeSliHash(project).get(); } @@ -170,10 +171,10 @@ public void shouldFailOptimizeSliHash() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("RUNNING", STATUS_URI))) + .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new DatasetTaskStatus("ERROR", STATUS_URI))); + .withBody(MAPPER.writeValueAsString(new TaskStatus("ERROR", STATUS_URI))); gd.getDatasetService().optimizeSliHash(project).get(); } diff --git a/src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java similarity index 56% rename from src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java rename to src/test/java/com/gooddata/gdc/TaskStatusTest.java index 5ca3d1218..41815adf2 100644 --- a/src/test/java/com/gooddata/dataset/DatasetTaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -1,27 +1,26 @@ -package com.gooddata.dataset; +package com.gooddata.gdc; -import com.gooddata.gdc.GdcError; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; +import static org.testng.Assert.*; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.MatcherAssert.*; -public class DatasetTaskStatusTest { +public class TaskStatusTest { private static final ObjectMapper MAPPER = new ObjectMapper(); @Test public void testDeser() throws Exception { - final DatasetTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), DatasetTaskStatus.class); + final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), TaskStatus.class); assertThat(status.getStatus(), is("OK")); assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); } @Test public void testDeserMessages() throws Exception { - final DatasetTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), DatasetTaskStatus.class); + final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), TaskStatus.class); assertThat(status.getStatus(), is("ERROR")); assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); assertThat(status.getMessages(), hasSize(1)); @@ -31,9 +30,10 @@ public void testDeserMessages() throws Exception { @Test public void testSerialize() throws Exception { - final String json = MAPPER.writeValueAsString(new DatasetTaskStatus("OK", "foo")); - final DatasetTaskStatus status = MAPPER.readValue(json, DatasetTaskStatus.class); + final String json = MAPPER.writeValueAsString(new TaskStatus("OK", "foo")); + final TaskStatus status = MAPPER.readValue(json, TaskStatus.class); assertThat(status.getStatus(), is("OK")); assertThat(status.getPollUri(), is("foo")); } -} + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java b/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java deleted file mode 100644 index 6c4d1fca4..000000000 --- a/src/test/java/com/gooddata/model/MaqlDdlTaskStatusTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.model; - -import com.gooddata.gdc.GdcError; -import org.codehaus.jackson.map.ObjectMapper; -import org.testng.annotations.Test; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -public class MaqlDdlTaskStatusTest { - - private static final ObjectMapper MAPPER = new ObjectMapper(); - - @Test - public void testDeser() throws Exception { - final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), MaqlDdlTaskStatus.class); - assertThat(status.getStatus(), is("OK")); - assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); - } - - @Test - public void testDeserMessages() throws Exception { - final MaqlDdlTaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), MaqlDdlTaskStatus.class); - assertThat(status.getStatus(), is("ERROR")); - assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); - assertThat(status.getMessages(), hasSize(1)); - final GdcError error = status.getMessages().iterator().next(); - assertThat(error.getFormattedMessage(), is("The object (attr.person.id) doesn't exists.")); - } - - @Test - public void testSerialize() throws Exception { - final String json = MAPPER.writeValueAsString(new MaqlDdlTaskStatus("OK", "foo")); - final MaqlDdlTaskStatus status = MAPPER.readValue(json, MaqlDdlTaskStatus.class); - assertThat(status.getStatus(), is("OK")); - assertThat(status.getPollUri(), is("foo")); - - } -} diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 37b0ba108..90cab7ca0 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -2,6 +2,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.gdc.AsyncTask; +import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -64,10 +65,10 @@ public void shouldUpdateModel() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new MaqlDdlTaskStatus("RUNNING", STATUS_URI))) + .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new MaqlDdlTaskStatus("OK", STATUS_URI))) + .withBody(MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))) ; final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, From 2fb7b7ab2b67d63e767bc83d1514a4260c061651 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 31 Mar 2015 17:04:17 +0200 Subject: [PATCH 0134/1191] make pollingUri mutable --- src/main/java/com/gooddata/AbstractPollHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/AbstractPollHandler.java b/src/main/java/com/gooddata/AbstractPollHandler.java index 959af7769..304343c47 100644 --- a/src/main/java/com/gooddata/AbstractPollHandler.java +++ b/src/main/java/com/gooddata/AbstractPollHandler.java @@ -19,7 +19,7 @@ */ public abstract class AbstractPollHandler extends AbstractPollHandlerBase { - private final String pollingUri; + private String pollingUri; /** * Creates a new instance of polling handler @@ -37,4 +37,7 @@ public final String getPollingUri() { return pollingUri; } + protected void setPollingUri(final String pollingUri) { + this.pollingUri = pollingUri; + } } From 3fda31aa3a96b03f6cf527de50b0bc471a65f676 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 30 Mar 2015 09:21:11 +0200 Subject: [PATCH 0135/1191] use newest json-unit --- pom.xml | 2 +- src/test/java/com/gooddata/JsonMatchers.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 8f0983eb6..84f167f87 100644 --- a/pom.xml +++ b/pom.xml @@ -249,7 +249,7 @@ net.javacrumbs.json-unit json-unit - 0.1.6 + 1.5.3 test diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index 0065268e6..a10405437 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -1,6 +1,8 @@ package com.gooddata; import net.javacrumbs.jsonunit.JsonAssert; +import net.javacrumbs.jsonunit.core.Configuration; +import net.javacrumbs.jsonunit.core.Option; import net.javacrumbs.jsonunit.core.internal.Diff; import org.codehaus.jackson.map.ObjectMapper; import org.hamcrest.BaseMatcher; @@ -13,6 +15,8 @@ import java.nio.file.Paths; import static java.lang.String.format; +import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER; +import static net.javacrumbs.jsonunit.core.Option.TREATING_NULL_AS_ABSENT; import static net.javacrumbs.jsonunit.core.internal.Diff.create; /** @@ -69,8 +73,7 @@ public boolean matches(final Object actual) { } this.expectedJsonString = expectedJsonString; - final Diff diff = create(expectedJsonString, actual, "fullJson", "", JsonAssert.getIgnorePlaceholder(), - JsonAssert.getTolerance(), JsonAssert.getTreatNullAsAbsent()); + final Diff diff = create(expectedJsonString, actual, "fullJson", "", Configuration.empty().withOptions(TREATING_NULL_AS_ABSENT, IGNORING_ARRAY_ORDER)); if (!diff.similar()) { differences = diff.differences(); } From c941da60c669af3941244cfe4468cb7f0312f8e9 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 30 Mar 2015 09:42:32 +0200 Subject: [PATCH 0136/1191] Add support for project validation --- README.md | 6 + pom.xml | 6 + .../com/gooddata/project/ProjectService.java | 86 +++ .../project/ProjectValidationResult.java | 94 ++++ .../ProjectValidationResultElParam.java | 37 ++ ...ProjectValidationResultGdcTimeElParam.java | 36 ++ .../project/ProjectValidationResultItem.java | 43 ++ .../ProjectValidationResultObjectParam.java | 56 ++ .../project/ProjectValidationResultParam.java | 19 + .../ProjectValidationResultSliElParam.java | 36 ++ .../ProjectValidationResultStringParam.java | 47 ++ .../project/ProjectValidationResults.java | 93 ++++ .../project/ProjectValidationType.java | 47 ++ .../gooddata/project/ProjectValidations.java | 39 ++ src/test/java/com/gooddata/JsonMatchers.java | 12 +- src/test/java/com/gooddata/ShowcaseAT.java | 8 + .../gooddata/project/ProjectServiceIT.java | 113 ++++ .../ProjectValidationResultItemTest.java | 22 + .../ProjectValidationResultParamTest.java | 27 + .../project/ProjectValidationResultTest.java | 23 + .../project/ProjectValidationResultsTest.java | 23 + .../project/ProjectValidationTypeTest.java | 24 + .../project/ProjectValidationsTest.java | 37 ++ .../resources/project/project-validate.json | 11 + .../project/project-validationAvail.json | 11 + .../project/project-validationResultItem.json | 164 ++++++ .../project/project-validationResultLog.json | 52 ++ .../project-validationResultParam.json | 24 + .../project/project-validationResults.json | 492 ++++++++++++++++++ 29 files changed, 1687 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResult.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultElParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultItem.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationResults.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidationType.java create mode 100644 src/main/java/com/gooddata/project/ProjectValidations.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationResultTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationResultsTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationTypeTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationsTest.java create mode 100644 src/test/resources/project/project-validate.json create mode 100644 src/test/resources/project/project-validationAvail.json create mode 100644 src/test/resources/project/project-validationResultItem.json create mode 100644 src/test/resources/project/project-validationResultLog.json create mode 100644 src/test/resources/project/project-validationResultParam.json create mode 100644 src/test/resources/project/project-validationResults.json diff --git a/README.md b/README.md index 53753b57a..c672c355b 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,12 @@ Collection projects = projectService.getProjects(); Project project = projectService.createProject(new Project("my project", "MyToken")).get(); ``` +Validate project +```java +Set types = projectService.getAvailableProjectValidationTypes(project); +ProjectValidationResults results = projectService.validateProject(project, types).get(); +``` + ### Project Model API Create and update the project model, execute MAQL DDL,... diff --git a/pom.xml b/pom.xml index 84f167f87..86a2ba4b4 100644 --- a/pom.xml +++ b/pom.xml @@ -264,6 +264,12 @@ 1.1.0 test + + com.shazam + shazamcrest + 0.7 + test + diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index f64380a1a..c9d2166b6 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -3,12 +3,14 @@ */ package com.gooddata.project; +import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; import com.gooddata.account.AccountService; +import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; @@ -16,11 +18,15 @@ import org.springframework.web.client.RestTemplate; import java.io.IOException; +import java.net.URI; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static java.util.Arrays.asList; /** * List projects, create a project, ... @@ -158,4 +164,84 @@ public Collection getProjectTemplates(Project project) { throw new GoodDataException("Unable to get project templates", e); } } + + /** + * Get available validation types for project. Which can be passed to {@link #validateProject(Project, ProjectValidationType...)}. + * + * @param project project to fetch validation types for + * @return available validations + */ + public Set getAvailableProjectValidationTypes(Project project) { + notNull(project, "project"); + try { + return restTemplate.getForObject(ProjectValidations.URI, ProjectValidations.class, project.getId()).getValidations(); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to get project available validation types", e); + } + } + + /** + * Validate project using all available validations. + * + * @param project project to validate + * @return results of validation + */ + public FutureResult validateProject(final Project project) { + return validateProject(project, getAvailableProjectValidationTypes(project)); + } + + /** + * Validate project with given validations + * + * @param project project to validate + * @param validations validations to use + * @return results of validation + */ + public FutureResult validateProject(final Project project, ProjectValidationType... validations) { + return validateProject(project, new HashSet<>(asList(validations))); + } + + /** + * Validate project with given validations + * + * @param project project to validate + * @param validations validations to use + * @return results of validation + */ + public FutureResult validateProject(final Project project, Set validations) { + notNull(project, "project"); + final AsyncTask task; + try { + task = restTemplate.postForObject(ProjectValidations.URI, new ProjectValidations(validations), AsyncTask.class, project.getId()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to to start project validation", e); + } + return new FutureResult<>(this, + // PollHandler able to poll on different URIs (by the Location header) + // poll class is Void because the object returned varies between invocations (even on the same URI) + new AbstractPollHandler(task.getUri(), Void.class, ProjectValidationResults.class) { + + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + final URI location = response.getHeaders().getLocation(); + if (location != null) { + setPollingUri(location.toString()); + } + final boolean finished = super.isFinished(response); + if (finished) { + try { + final ProjectValidationResults result = restTemplate.getForObject(getPollingUri(), getResultClass()); + setResult(result); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to obtain validation results from " + getPollingUri()); + } + } + return finished; + } + + @Override + public void handlePollResult(final Void pollResult) { + } + }); + } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/src/main/java/com/gooddata/project/ProjectValidationResult.java new file mode 100644 index 000000000..6d206fa7e --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResult.java @@ -0,0 +1,94 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; + +/** + * Represents one validation result. + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResult { + + private final String category; + private final String level; + private final String message; + private final List params; + + private static final String LEVEL_WARNING = "WARN"; + private static final String LEVEL_ERROR = "ERROR"; + + private ProjectValidationType validation; + + @JsonCreator + private ProjectValidationResult(@JsonProperty("ecat") String category, @JsonProperty("level") String level, + @JsonProperty("msg") String message, @JsonProperty("pars") List params) { + this.category = category; + this.level = level; + this.message = message; + this.params = params; + } + + public String getCategory() { + return category; + } + + public String getLevel() { + return level; + } + + public String getMessage() { + return message; + } + + public List getParams() { + return params; + } + + public boolean isError() { + return LEVEL_ERROR.equals(level); + } + + public ProjectValidationType getValidation() { + return validation; + } + + // package protected by design (used inside ProjectValidationResults deserialization constructor) + void setValidation(ProjectValidationType validation) { + this.validation = validation; + } + + public boolean isWarning() { + return LEVEL_WARNING.equals(level); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ProjectValidationResult that = (ProjectValidationResult) o; + + if (!category.equals(that.category)) return false; + if (!level.equals(that.level)) return false; + if (!message.equals(that.message)) return false; + if (params != null ? !params.equals(that.params) : that.params != null) return false; + if (validation != null ? !validation.equals(that.validation) : that.validation != null) return false; + + return true; + } + + @Override + public int hashCode() { + int result = category.hashCode(); + result = 31 * result + level.hashCode(); + result = 31 * result + message.hashCode(); + result = 31 * result + (params != null ? params.hashCode() : 0); + result = 31 * result + (validation != null ? validation.hashCode() : 0); + return result; + } + +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java new file mode 100644 index 000000000..e37e1540d --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import java.util.List; + +abstract class ProjectValidationResultElParam extends ProjectValidationResultParam { + + private final List ids; + private final List vals; + + protected ProjectValidationResultElParam(final List ids, final List vals) { + this.ids = ids; + this.vals = vals; + } + + public List getIds() { + return ids; + } + + public List getVals() { + return vals; + } + + @Override + public int hashCode() { + int result = ids != null ? ids.hashCode() : 0; + result = 31 * result + (vals != null ? vals.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return ids + " " + vals; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java new file mode 100644 index 000000000..beaf7c0e5 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -0,0 +1,36 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.util.List; + +@JsonTypeName("gdctime_el") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResultGdcTimeElParam extends ProjectValidationResultElParam { + + ProjectValidationResultGdcTimeElParam(final List ids, final List vals) { + super(ids, vals); + } + + @JsonCreator + private static ProjectValidationResultGdcTimeElParam create(@JsonProperty("ids") List ids, @JsonProperty("vals") List vals) { + return new ProjectValidationResultGdcTimeElParam(ids, vals); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof ProjectValidationResultGdcTimeElParam)) return false; + + ProjectValidationResultGdcTimeElParam that = (ProjectValidationResultGdcTimeElParam) o; + + if (getIds() != null ? !getIds().equals(that.getIds()) : that.getIds() != null) return false; + if (getVals() != null ? !getVals().equals(that.getVals()) : that.getVals() != null) return false; + + return true; + } + +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java new file mode 100644 index 000000000..0dce72e29 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java @@ -0,0 +1,43 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.List; + +/** + * Validation result body helper dto. Not exposed to user. + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +class ProjectValidationResultItem { + + private final Body body; + private final ProjectValidationType validation; + + @JsonCreator + private ProjectValidationResultItem(@JsonProperty("body") Body body, @JsonProperty("from") ProjectValidationType validation) { + this.body = body; + this.validation = validation; + } + + List getLogs() { + return body.logs; + } + + ProjectValidationType getValidation() { + return validation; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Body { + + private final List logs; + + @JsonCreator + private Body(@JsonProperty("log") List logs) { + this.logs = logs; + } + } +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java new file mode 100644 index 000000000..eb2c642a0 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java @@ -0,0 +1,56 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeName; + +@JsonTypeName("object") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResultObjectParam extends ProjectValidationResultParam { + private final String name; + private final String uri; + + ProjectValidationResultObjectParam(String name, String uri) { + this.name = name; + this.uri = uri; + } + + @JsonCreator + private static ProjectValidationResultObjectParam create(@JsonProperty("name") String name, @JsonProperty("uri") String uri) { + return new ProjectValidationResultObjectParam(name, uri); + } + + public String getName() { + return name; + } + + public String getUri() { + return uri; + } + + @Override + public String toString() { + return name + " (" + uri + ")"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ProjectValidationResultObjectParam that = (ProjectValidationResultObjectParam) o; + + if (!name.equals(that.name)) return false; + if (!uri.equals(that.uri)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = name.hashCode(); + result = 31 * result + uri.hashCode(); + return result; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java new file mode 100644 index 000000000..0c93f14bd --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java @@ -0,0 +1,19 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonSubTypes; +import org.codehaus.jackson.annotate.JsonTypeInfo; + +/** + * Represents validation result message param, must be of certain type. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSubTypes({ + @JsonSubTypes.Type(name = "common", value = ProjectValidationResultStringParam.class), + @JsonSubTypes.Type(name = "object", value = ProjectValidationResultObjectParam.class), + @JsonSubTypes.Type(name = "sli_el", value = ProjectValidationResultSliElParam.class), + @JsonSubTypes.Type(name = "gdctime_el", value = ProjectValidationResultGdcTimeElParam.class), +}) +public abstract class ProjectValidationResultParam { +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java new file mode 100644 index 000000000..a0f0daf06 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -0,0 +1,36 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeName; + +import java.util.List; + +@JsonTypeName("sli_el") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResultSliElParam extends ProjectValidationResultElParam { + + ProjectValidationResultSliElParam(final List ids, final List vals) { + super(ids, vals); + } + + @JsonCreator + private static ProjectValidationResultSliElParam create(@JsonProperty("ids") List ids, @JsonProperty("vals") List vals) { + return new ProjectValidationResultSliElParam(ids, vals); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (!(o instanceof ProjectValidationResultSliElParam)) return false; + + ProjectValidationResultSliElParam that = (ProjectValidationResultSliElParam) o; + + if (getIds() != null ? !getIds().equals(that.getIds()) : that.getIds() != null) return false; + if (getVals() != null ? !getVals().equals(that.getVals()) : that.getVals() != null) return false; + + return true; + } + +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java new file mode 100644 index 000000000..73e2195ac --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java @@ -0,0 +1,47 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeName; + +@JsonTypeName("common") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResultStringParam extends ProjectValidationResultParam { + private final String value; + + ProjectValidationResultStringParam(String value) { + this.value = value; + } + + // TODO is there some BUG in jackson preventing use the contructor as creator? + @JsonCreator + private static ProjectValidationResultStringParam create(String value) { + return new ProjectValidationResultStringParam(value); + } + + public String getValue() { + return value; + } + + @Override + public String toString() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ProjectValidationResultStringParam that = (ProjectValidationResultStringParam) o; + + if (!value.equals(that.value)) return false; + + return true; + } + + @Override + public int hashCode() { + return value.hashCode(); + } +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java new file mode 100644 index 000000000..5a2a6e7df --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -0,0 +1,93 @@ +package com.gooddata.project; + +import com.gooddata.util.BooleanIntegerDeserializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; + +import java.util.LinkedList; +import java.util.List; + +/** + * Results of project validation. + * + * Deserialization only. + */ +@JsonTypeName("projectValidateResult") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectValidationResults { + + private final boolean error; + private final boolean fatalError; + private final boolean warning; + + private final List results = new LinkedList<>(); + + @JsonCreator + private ProjectValidationResults(@JsonProperty("error_found") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean error, + @JsonProperty("fatal_error_found") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean fatalError, + @JsonProperty("results") List resultItems) { + this.error = error; + this.fatalError = fatalError; + + boolean hasWarning = false; + for (ProjectValidationResultItem resultItem : resultItems) { + final List itemResults = resultItem.getLogs(); + if (itemResults != null) { + for (ProjectValidationResult log : itemResults) { + log.setValidation(resultItem.getValidation()); + this.results.add(log); + hasWarning = hasWarning || log.isWarning(); + } + } + } + + this.warning = hasWarning; + } + + /** + * True if validation found some error + * @return true in case of validation error, false otherwise + */ + public boolean isError() { + return error; + } + + /** + * True in case some part of validation crashed (not executed at all) + * @return true if validation crashed, false otherwise + */ + public boolean isFatalError() { + return fatalError; + } + + /** + * True if some warning was found during validation. + * @return true if some warning was found during validation, false otherwise + */ + public boolean isWarning() { + return warning; + } + + /** + * True if no warning or error is in the validation results. + * @return true if no warning or error is in the validation results, false otherwise + */ + public boolean isValid() { + return ! (error || fatalError || warning); + } + + /** + * Get validation results, describing output of all validations executed. + * Can return empty list, in case the validation had no error or warning (is valid)- + * @return validation results list + */ + public List getResults() { + return results; + } + +} diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/src/main/java/com/gooddata/project/ProjectValidationType.java new file mode 100644 index 000000000..422cff02f --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidationType.java @@ -0,0 +1,47 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonValue; + +/** + * Represents project validation type. + */ +public class ProjectValidationType { + + private final String value; + + public static final ProjectValidationType PDM_VS_DWH = new ProjectValidationType("pdm::pdm_vs_dwh"); + public static final ProjectValidationType METRIC_FILTER = new ProjectValidationType("metric_filter"); + public static final ProjectValidationType PDM_TRANSITIVITY = new ProjectValidationType("pdm::transitivity"); + public static final ProjectValidationType LDM = new ProjectValidationType("ldm"); + public static final ProjectValidationType INVALID_OBJECTS = new ProjectValidationType("invalid_objects"); + public static final ProjectValidationType PDM_ELEM = new ProjectValidationType("pdm::elem_validation"); + public static final ProjectValidationType PDM_PK_FK_CONSISTENCY = new ProjectValidationType("pdm::pk_fk_consistency"); + + @JsonCreator + public ProjectValidationType(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ProjectValidationType that = (ProjectValidationType) o; + + if (!value.equals(that.value)) return false; + + return true; + } + + @Override + public int hashCode() { + return value.hashCode(); + } +} diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java new file mode 100644 index 000000000..6a7e3d25d --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -0,0 +1,39 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.HashSet; +import java.util.Set; + +import static java.util.Arrays.asList; + +/** + * Possible validations for project. + * Helper dto, to fetch available validations or start validations. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class ProjectValidations { + + public static final String URI = "/gdc/md/{projectId}/validate"; + + private final Set validations; + + ProjectValidations(ProjectValidationType... validations) { + this(new HashSet<>(asList(validations))); + } + + @JsonCreator + ProjectValidations(@JsonProperty("availableValidations") final Set validations) { + this.validations = validations; + } + + @JsonProperty("validateProject") + public Set getValidations() { + return validations; + } + +} diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index a10405437..290bd80f9 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -41,6 +41,16 @@ public static Matcher serializesToJson(final String expectedResourceName) return new JsonFileMatcher<>(expectedResourceName); } + /** + * Creates a matcher that matches String against JSON in given resource file. + * @param expectedResourceName name of resource (relative patch in resource folder) + * @return matcher that matches String against JSON in given resource file + */ + @Factory + public static Matcher isJsonString(final String expectedResourceName) { + return new JsonFileMatcher<>(expectedResourceName); + } + private static class JsonFileMatcher extends BaseMatcher { private String expectedResourceName; @@ -58,7 +68,7 @@ private JsonFileMatcher(final String expectedResourceName) { public boolean matches(final Object actual) { String expectedJsonString; try { - actualJsonString = new ObjectMapper().writeValueAsString(actual); + actualJsonString = actual instanceof String ? (String) actual : new ObjectMapper().writeValueAsString(actual); final URL resourceUrl = getClass().getResource(expectedResourceName); if (resourceUrl == null) { diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 9d856aa67..8d18f31c4 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -23,6 +23,7 @@ import com.gooddata.model.ModelService; import com.gooddata.project.Project; import com.gooddata.project.ProjectService; +import com.gooddata.project.ProjectValidationResults; import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; import com.gooddata.warehouse.Warehouse; @@ -132,6 +133,13 @@ public void getProjectByUri() throws Exception { assertThat(project, hasSameIdAs(this.project)); } + @Test(groups = "project", dependsOnMethods = "createProject") + public void validateProject() throws Exception { + final ProjectValidationResults results = gd.getProjectService().validateProject(project).get(); + assertThat(results, is(notNullValue())); + assertThat(results.getResults(), is(notNullValue())); + } + @Test(groups = "model", dependsOnGroups = "project") public void createModel() throws Exception { final ModelService modelService = gd.getModelService(); diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index eaa9e0692..bde34acbb 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -3,11 +3,14 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.AsyncTask; +import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import static com.gooddata.JsonMatchers.isJsonString; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; @@ -15,6 +18,7 @@ import static org.hamcrest.Matchers.notNullValue; import java.util.Collection; +import java.util.Set; public class ProjectServiceIT extends AbstractGoodDataIT { @@ -130,4 +134,113 @@ public void shouldReturnProjectTemplates() throws Exception { assertThat(templates, is(notNullValue())); assertThat(templates, hasSize(1)); } + + @Test + public void shouldReturnAvailableValidations() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/validate") + .respond() + .withBody(readResource("/project/project-validationAvail.json")); + + final Set validations = gd.getProjectService().getAvailableProjectValidationTypes(enabled); + assertThat(validations, notNullValue()); + assertThat(validations, hasSize(7)); + + } + + @Test + public void shouldValidateProject() throws Exception { + final String validateUri = "/gdc/md/PROJECT_ID/validate"; + final String task1Uri = validateUri + "/task/TASK_ID"; + final String task2Uri = validateUri + "/task/TASK_ID2"; + final String resultUri = validateUri + "/result/RESULT_ID"; + + onRequest() + .havingPathEqualTo(validateUri) + .respond() + .withBody(readResource("/project/project-validationAvail.json")); + + onRequest() + .havingPathEqualTo(validateUri) + .havingMethodEqualTo("POST") + .havingBody(isJsonString("/project/project-validate.json")) + .respond() + .withBody(MAPPER.writeValueAsString(new AsyncTask(task1Uri))) + .withStatus(201); + + onRequest() + .havingPathEqualTo(task1Uri) + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse(task2Uri))) + .withHeader("Location", task2Uri) + .withStatus(303); + + onRequest() + .havingPathEqualTo(task2Uri) + .respond() + .withBody(MAPPER.writeValueAsString(new AsyncTask(task2Uri))) + .withStatus(202) + .thenRespond() + .withBody(MAPPER.writeValueAsString(new UriResponse(resultUri))) + .withHeader("Location", resultUri) + .withStatus(303); + + onRequest() + .havingPathEqualTo(resultUri) + .respond() + .withBody(readResource("/project/project-validationResults.json")) + .withStatus(200); + + final ProjectValidationResults validateResult = gd.getProjectService().validateProject(enabled).get(); + + assertThat(validateResult, notNullValue()); + } + + @Test + public void shouldValidateProject2() throws Exception { + final String validateUri = "/gdc/md/PROJECT_ID/validate"; + final String task1Uri = validateUri + "/task/TASK_ID"; + final String task2Uri = validateUri + "/task/TASK_ID2"; + final String resultUri = validateUri + "/result/RESULT_ID"; + + onRequest() + .havingPathEqualTo(validateUri) + .respond() + .withBody(readResource("/project/project-validationAvail.json")); + + onRequest() + .havingPathEqualTo(validateUri) + .havingMethodEqualTo("POST") + .havingBody(isJsonString("/project/project-validate.json")) + .respond() + .withBody(MAPPER.writeValueAsString(new AsyncTask(task1Uri))) + .withStatus(201); + + onRequest() + .havingPathEqualTo(task1Uri) + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse(task2Uri))) + .withHeader("Location", task1Uri) + .withStatus(303) + .thenRespond() + .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", task2Uri))) + .withHeader("Location", task1Uri) + .withStatus(202) + .thenRespond() + .withBody(MAPPER.writeValueAsString(new UriResponse(resultUri))) + .withHeader("Location", resultUri) + .withStatus(303) + ; + onRequest() + .havingPathEqualTo(resultUri) + .respond() + .withBody(readResource("/project/project-validationResults.json")) + .withStatus(200); + + final ProjectValidationResults validateResult = gd.getProjectService().validateProject(enabled).get(); + + assertThat(validateResult, notNullValue()); + } + + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java new file mode 100644 index 000000000..69bae8838 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -0,0 +1,22 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class ProjectValidationResultItemTest { + + @Test + public void testDeserialize() throws Exception { + final ProjectValidationResultItem item = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationResultItem.json"), ProjectValidationResultItem.class); + + assertThat(item.getValidation(), is(ProjectValidationType.PDM_TRANSITIVITY)); + assertThat(item.getLogs(), hasSize(3)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java new file mode 100644 index 000000000..aba3755b5 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -0,0 +1,27 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; +import org.testng.annotations.Test; + +import java.util.List; + +import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; +import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; + +public class ProjectValidationResultParamTest { + + @Test + public void testDeser() throws Exception { + final List result = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationResultParam.json"), + new TypeReference>() { }); + + assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultStringParam("report")))); + assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultObjectParam("Historical backlog", "/gdc/md/d45dlwq6fixqsgbukrlnir1qsw8y44q6/obj/41886")))); + assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultSliElParam(asList("4761"), asList("Deleted"))))); + assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultGdcTimeElParam(asList("4762"), asList("Deleted"))))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java new file mode 100644 index 000000000..bb9ee6a9f --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -0,0 +1,23 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; + +public class ProjectValidationResultTest { + + @Test + public void testDeserialize() throws Exception { + final ProjectValidationResult log = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationResultLog.json"), ProjectValidationResult.class); + + assertThat(log.getCategory(), is("TRANSITIVITY")); + assertThat(log.getLevel(), is("WARN")); + assertThat(log.getMessage(), is("There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.")); + assertThat(log.getParams(), hasSize(7)); + + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java new file mode 100644 index 000000000..06a261882 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java @@ -0,0 +1,23 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class ProjectValidationResultsTest { + + @Test + public void testDeserialize() throws Exception { + final ProjectValidationResults result = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationResults.json"), ProjectValidationResults.class); + + assertThat(result.isError(), is(true)); + assertThat(result.isFatalError(), is(true)); + assertThat(result.isWarning(), is(true)); + assertThat(result.isValid(), is(false)); + assertThat(result.getResults(), notNullValue()); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java new file mode 100644 index 000000000..896edd337 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java @@ -0,0 +1,24 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class ProjectValidationTypeTest { + + @Test + public void testSerialize() throws Exception { + final String myValidationType = new ObjectMapper().writeValueAsString(new ProjectValidationType("myValidationType")); + assertThat(myValidationType, is("\"myValidationType\"")); + } + + @Test + public void testDeserialize() throws Exception { + final ProjectValidationType myValidationType = new ObjectMapper().readValue("\"myValidationType\"", ProjectValidationType.class); + assertThat(myValidationType, notNullValue()); + assertThat(myValidationType.getValue(), is("myValidationType")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationsTest.java b/src/test/java/com/gooddata/project/ProjectValidationsTest.java new file mode 100644 index 000000000..32c35b00e --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationsTest.java @@ -0,0 +1,37 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.project.ProjectValidationType.INVALID_OBJECTS; +import static com.gooddata.project.ProjectValidationType.LDM; +import static com.gooddata.project.ProjectValidationType.METRIC_FILTER; +import static com.gooddata.project.ProjectValidationType.PDM_ELEM; +import static com.gooddata.project.ProjectValidationType.PDM_PK_FK_CONSISTENCY; +import static com.gooddata.project.ProjectValidationType.PDM_TRANSITIVITY; +import static com.gooddata.project.ProjectValidationType.PDM_VS_DWH; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class ProjectValidationsTest { + + @Test + public void testSerialize() throws Exception { + assertThat(new ProjectValidations(PDM_VS_DWH, METRIC_FILTER, PDM_TRANSITIVITY, LDM, + INVALID_OBJECTS, PDM_ELEM, PDM_PK_FK_CONSISTENCY), + serializesToJson("/project/project-validate.json")); + } + + @Test + public void testDeserialize() throws Exception { + final ProjectValidations validations = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationAvail.json"), ProjectValidations.class); + + assertThat(validations, is(notNullValue())); + assertThat(validations.getValidations(), hasItems(PDM_VS_DWH, METRIC_FILTER, PDM_TRANSITIVITY, LDM, + INVALID_OBJECTS, PDM_ELEM, PDM_PK_FK_CONSISTENCY)); + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-validate.json b/src/test/resources/project/project-validate.json new file mode 100644 index 000000000..384c1de5f --- /dev/null +++ b/src/test/resources/project/project-validate.json @@ -0,0 +1,11 @@ +{ + "validateProject": [ + "pdm::pdm_vs_dwh", + "metric_filter", + "pdm::transitivity", + "ldm", + "invalid_objects", + "pdm::elem_validation", + "pdm::pk_fk_consistency" + ] +} \ No newline at end of file diff --git a/src/test/resources/project/project-validationAvail.json b/src/test/resources/project/project-validationAvail.json new file mode 100644 index 000000000..431b7260a --- /dev/null +++ b/src/test/resources/project/project-validationAvail.json @@ -0,0 +1,11 @@ +{ + "availableValidations": [ + "pdm::pdm_vs_dwh", + "metric_filter", + "pdm::transitivity", + "ldm", + "invalid_objects", + "pdm::elem_validation", + "pdm::pk_fk_consistency" + ] +} \ No newline at end of file diff --git a/src/test/resources/project/project-validationResultItem.json b/src/test/resources/project/project-validationResultItem.json new file mode 100644 index 000000000..d4ab5d472 --- /dev/null +++ b/src/test/resources/project/project-validationResultItem.json @@ -0,0 +1,164 @@ +{ + "body": { + "error": 0, + "log": [ + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "56", + "name": "Warehouse City", + "uri": "/gdc/md/FoodMartDemo/obj/56" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "common": "00968" + } + ] + }, + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "object": { + "id": "42", + "name": "Store City", + "uri": "/gdc/md/FoodMartDemo/obj/42" + } + }, + { + "object": { + "id": "61", + "name": "Store County", + "uri": "/gdc/md/FoodMartDemo/obj/61" + } + }, + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "object": { + "id": "61", + "name": "Store County", + "uri": "/gdc/md/FoodMartDemo/obj/61" + } + }, + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "common": "00968" + } + ] + }, + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "object": { + "id": "68", + "name": "Customer City", + "uri": "/gdc/md/FoodMartDemo/obj/68" + } + }, + { + "object": { + "id": "53", + "name": "Customer County", + "uri": "/gdc/md/FoodMartDemo/obj/53" + } + }, + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "object": { + "id": "53", + "name": "Customer County", + "uri": "/gdc/md/FoodMartDemo/obj/53" + } + }, + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "common": "00968" + } + ] + } + ] + }, + "from": "pdm::transitivity" +} \ No newline at end of file diff --git a/src/test/resources/project/project-validationResultLog.json b/src/test/resources/project/project-validationResultLog.json new file mode 100644 index 000000000..60e008ded --- /dev/null +++ b/src/test/resources/project/project-validationResultLog.json @@ -0,0 +1,52 @@ +{ + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "56", + "name": "Warehouse City", + "uri": "/gdc/md/FoodMartDemo/obj/56" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "common": "00968" + } + ] +} \ No newline at end of file diff --git a/src/test/resources/project/project-validationResultParam.json b/src/test/resources/project/project-validationResultParam.json new file mode 100644 index 000000000..08d800fcb --- /dev/null +++ b/src/test/resources/project/project-validationResultParam.json @@ -0,0 +1,24 @@ +[ + { + "common": "report" + }, + { + "object": { + "name": "Historical backlog", + "id": "41886", + "uri": "/gdc/md/d45dlwq6fixqsgbukrlnir1qsw8y44q6/obj/41886" + } + }, + { + "sli_el": { + "ids": ["4761"], + "vals": ["Deleted"] + } + }, + { + "gdctime_el": { + "ids": ["4762"], + "vals": ["Deleted"] + } + } +] diff --git a/src/test/resources/project/project-validationResults.json b/src/test/resources/project/project-validationResults.json new file mode 100644 index 000000000..11c654e58 --- /dev/null +++ b/src/test/resources/project/project-validationResults.json @@ -0,0 +1,492 @@ +{ + "projectValidateResult": { + "error_found": 1, + "fatal_error_found": 1, + "meta": { + "finished_time": 1427280574, + "start_time": 1427280565 + }, + "results": [ + { + "body": { + "error": 0, + "log": [] + }, + "from": "invalid_objects" + }, + { + "body": { + "error": 0, + "log": [] + }, + "from": "pdm" + }, + { + "body": { + "error": 0, + "log": [] + }, + "from": "pdm::elem_validation" + }, + { + "body": { + "error": 0, + "log": [] + }, + "from": "metric_filter" + }, + { + "body": { + "error": 1, + "log": [ + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "3000", + "name": "Promotion Scope", + "uri": "/gdc/md/FoodMartDemo/obj/3000" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "43", + "name": "Customer Houseowner", + "uri": "/gdc/md/FoodMartDemo/obj/43" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "57", + "name": "Employee Marital Status", + "uri": "/gdc/md/FoodMartDemo/obj/57" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "65", + "name": "Recyclable Package", + "uri": "/gdc/md/FoodMartDemo/obj/65" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "70", + "name": "Customer Gender", + "uri": "/gdc/md/FoodMartDemo/obj/70" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "73", + "name": "Day of Week", + "uri": "/gdc/md/FoodMartDemo/obj/73" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "78", + "name": "Employee Gender", + "uri": "/gdc/md/FoodMartDemo/obj/78" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "87", + "name": "Low Fat", + "uri": "/gdc/md/FoodMartDemo/obj/87" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "MISSING", + "level": "ERROR", + "msg": "[%s:%s;origin:%s] %s attribute '%s'.", + "pars": [ + { + "common": "attribute" + }, + { + "object": { + "id": "90", + "name": "Customer Marital Status", + "uri": "/gdc/md/FoodMartDemo/obj/90" + } + }, + { + "common": "" + }, + { + "common": "is missing" + }, + { + "common": "pk" + } + ] + }, + { + "ecat": "TOO_MANY_EDGES", + "level": "ERROR", + "msg": "origin:%s, [%s:%s] violates EDGE CARDINALITY constraint: [ '%s' --- '%s', role:%s, %s:%s ]. Referenced instances '%s\\'.", + "pars": [ + { + "common": "" + }, + { + "common": "tableDataLoad" + }, + { + "object": { + "id": "3152", + "name": "tableDataLoad education", + "uri": "/gdc/md/FoodMartDemo/obj/3152" + } + }, + { + "common": "table" + }, + { + "common": "tableDataLoad" + }, + { + "common": "_generic" + }, + { + "common": "0,1" + }, + { + "common": "0,*" + }, + { + "common": "3153,3503" + } + ] + } + ] + }, + "from": "ldm" + }, + { + "body": { + "error": 0, + "log": [] + }, + "from": "pdm::pk_fk_consistency" + }, + { + "body": { + "error": 0, + "log": [ + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "56", + "name": "Warehouse City", + "uri": "/gdc/md/FoodMartDemo/obj/56" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "object": { + "id": "35", + "name": "Warehouse County", + "uri": "/gdc/md/FoodMartDemo/obj/35" + } + }, + { + "object": { + "id": "86", + "name": "Warehouse ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/86" + } + }, + { + "common": "00968" + } + ] + }, + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "object": { + "id": "42", + "name": "Store City", + "uri": "/gdc/md/FoodMartDemo/obj/42" + } + }, + { + "object": { + "id": "61", + "name": "Store County", + "uri": "/gdc/md/FoodMartDemo/obj/61" + } + }, + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "object": { + "id": "61", + "name": "Store County", + "uri": "/gdc/md/FoodMartDemo/obj/61" + } + }, + { + "object": { + "id": "82", + "name": "Store ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/82" + } + }, + { + "common": "00968" + } + ] + }, + { + "ecat": "TRANSITIVITY", + "level": "WARN", + "msg": "There are inconsistent values between %s->%s->%s and %s->%s for %s value '%s'.", + "pars": [ + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "object": { + "id": "68", + "name": "Customer City", + "uri": "/gdc/md/FoodMartDemo/obj/68" + } + }, + { + "object": { + "id": "53", + "name": "Customer County", + "uri": "/gdc/md/FoodMartDemo/obj/53" + } + }, + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "object": { + "id": "53", + "name": "Customer County", + "uri": "/gdc/md/FoodMartDemo/obj/53" + } + }, + { + "object": { + "id": "47", + "name": "Customer ZIP", + "uri": "/gdc/md/FoodMartDemo/obj/47" + } + }, + { + "common": "00968" + } + ] + } + ] + }, + "from": "pdm::transitivity" + } + ] + } +} + From 845531f607de946434977cec94d8759eb2b5da31 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 2 Apr 2015 14:23:14 +0200 Subject: [PATCH 0137/1191] Add notice about README.md --- CONTRIBUTE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTE.md b/CONTRIBUTE.md index 43d247f2e..64e84dffa 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTE.md @@ -6,6 +6,7 @@ Below are few **rules, recommendations and best practices** we try to follow whe * Every pull request with non-trivial change must be **associated with an issue**. * Every closed non-rejected pull request and issue must be marked with exactly **one milestone version**. * Issue must be **properly labeled** (bug/enhancement/backward incompatible/...). +* Add usage examples of new high level functionality to [README.md](README.md) ## Design From 897ee7a9bb19d7dafcedfd48cdfa0f35dcc23f8f Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Tue, 24 Mar 2015 14:18:51 +0100 Subject: [PATCH 0138/1191] add MAQL DML support --- README.md | 6 +++ .../com/gooddata/dataset/DatasetService.java | 43 +++++++++++++++ .../java/com/gooddata/dataset/MaqlDml.java | 20 +++++++ .../java/com/gooddata/dataset/TaskState.java | 52 +++++++++++++++++++ .../java/com/gooddata/gdc/AbstractMaql.java | 33 ++++++++++++ src/main/java/com/gooddata/model/MaqlDdl.java | 22 ++------ .../java/com/gooddata/model/ModelService.java | 7 ++- src/test/java/com/gooddata/ShowcaseAT.java | 6 +++ .../gooddata/dataset/DatasetServiceIT.java | 47 +++++++++++++++++ .../com/gooddata/dataset/MaqlDmlTest.java | 21 ++++++++ .../com/gooddata/dataset/TaskStateTest.java | 25 +++++++++ src/test/resources/dataset/maqlDml.json | 1 + src/test/resources/dataset/taskStateOK.json | 6 +++ 13 files changed, 270 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/MaqlDml.java create mode 100644 src/main/java/com/gooddata/dataset/TaskState.java create mode 100644 src/main/java/com/gooddata/gdc/AbstractMaql.java create mode 100644 src/test/java/com/gooddata/dataset/MaqlDmlTest.java create mode 100644 src/test/java/com/gooddata/dataset/TaskStateTest.java create mode 100644 src/test/resources/dataset/maqlDml.json create mode 100644 src/test/resources/dataset/taskStateOK.json diff --git a/README.md b/README.md index 53753b57a..5e458d201 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,12 @@ DatasetService datasetService = gd.getDatasetService(); datasetService.loadDataset(project, "datasetId", new FileInputStream("data.csv")).get(); ``` +Update data in dataset +```java +DatasetService datasetService = gd.getDatasetService(); +datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); +``` + ### Report API Execute and export reports. diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index b1ce061ac..bf2ac4283 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -29,6 +29,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -236,6 +237,48 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException }); + } + + /** + * Update project data with the given update script (MAQL). This method can be used for data manipulation only, + * for model changes use {@link com.gooddata.model.ModelService#updateProjectModel}. + * + * @param project project to be updated + * @param maqlDml update script to be executed in the project + * @return poll result + * + * @see com.gooddata.model.ModelService#updateProjectModel + */ + public FutureResult updateProjectData(final Project project, final String maqlDml) { + notNull(project, "project"); + final UriResponse uriResponse = restTemplate.postForObject( + MaqlDml.URI, new MaqlDml(maqlDml), UriResponse.class, project.getId()); + + final String errorMessage = format("Unable to update data for project '%s'", project.getId()); + + return new FutureResult<>(this, + new AbstractPollHandler(uriResponse.getUri(), TaskState.class, Void.class) { + @Override + public void handlePollResult(final TaskState pollResult) { + if (!pollResult.isSuccess()) { + throw new GoodDataException(errorMessage); + } + setResult(null); + } + + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + if (!super.isFinished(response)) { + return false; + } + final TaskState taskState = extractData(response, TaskState.class); + if (taskState.isSuccess()) { + return true; + } + throw new GoodDataException(errorMessage + ": " + taskState.getMessage()); + } + }); } + } diff --git a/src/main/java/com/gooddata/dataset/MaqlDml.java b/src/main/java/com/gooddata/dataset/MaqlDml.java new file mode 100644 index 000000000..28934118d --- /dev/null +++ b/src/main/java/com/gooddata/dataset/MaqlDml.java @@ -0,0 +1,20 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.dataset; + +import com.gooddata.gdc.AbstractMaql; + +/** + * MAQL DML statement. + * Serialization only. + */ +class MaqlDml extends AbstractMaql { + + public static final String URI = "/gdc/md/{project}/dml/manage"; + + public MaqlDml(final String maql) { + super(maql); + } +} diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java new file mode 100644 index 000000000..77721b942 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * ETL Pull task status (for internal use). + * Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("taskState") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class TaskState { + + private static final String OK = "OK"; + private static final String ERROR = "ERROR"; + + private final String message; + + private final String status; + + @JsonCreator + public TaskState(@JsonProperty("status") final String status, @JsonProperty("msg") final String message) { + this.message = message; + this.status = status; + } + + public String getMessage() { + return message; + } + + public String getStatus() { + return status; + } + + public boolean isSuccess() { + return OK.equals(status); + } + + public boolean isFinished() { + return OK.equals(status) || ERROR.equals(status); + } +} diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/src/main/java/com/gooddata/gdc/AbstractMaql.java new file mode 100644 index 000000000..80ff3e8da --- /dev/null +++ b/src/main/java/com/gooddata/gdc/AbstractMaql.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Abstract MAQL statement. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("manage") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public abstract class AbstractMaql { + + @JsonProperty("maql") + private final String maql; + + public AbstractMaql(String maql) { + this.maql = maql; + } + + public String getMaql() { + return maql; + } + + +} diff --git a/src/main/java/com/gooddata/model/MaqlDdl.java b/src/main/java/com/gooddata/model/MaqlDdl.java index 6e82f264e..0e0b19195 100644 --- a/src/main/java/com/gooddata/model/MaqlDdl.java +++ b/src/main/java/com/gooddata/model/MaqlDdl.java @@ -3,32 +3,18 @@ */ package com.gooddata.model; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.gooddata.gdc.AbstractMaql; /** * MAQL DDL statement. * Serialization only. */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("manage") -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class MaqlDdl { +class MaqlDdl extends AbstractMaql { public static final String URI = "/gdc/md/{project}/ldm/manage2"; - @JsonProperty("maql") - private final String maql; - - public MaqlDdl(String maql) { - this.maql = maql; + public MaqlDdl(final String maql) { + super(maql); } - public String getMaql() { - return maql; - } } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index d534193c8..8ffcaf786 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -88,11 +88,14 @@ public FutureResult updateProjectModel(Project project, UpdateScript updat } /** - * Update project model with the given update script(s) (MAQL). + * Update project model with the given update script(s) (MAQL). For data manipulation use + * {@link com.gooddata.model.ModelService#updateProjectModel}. * * @param project project to be updated * @param maqlDdl update script to be executed in the project * @return poll result + * + * @see com.gooddata.dataset.DatasetService#updateProjectData */ public FutureResult updateProjectModel(final Project project, final String... maqlDdl) { return updateProjectModel(project, asList(maqlDdl)); @@ -104,6 +107,8 @@ public FutureResult updateProjectModel(final Project project, final String * @param project project to be updated * @param maqlDdl update script to be executed in the project * @return poll result + * + * @see com.gooddata.dataset.DatasetService#updateProjectData */ public FutureResult updateProjectModel(final Project project, final Collection maqlDdl) { notNull(project, "project"); diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 9d856aa67..0bcdfbe85 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -203,6 +203,12 @@ public void loadDataset() throws Exception { datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/person.csv")).get(); } + @Test(groups = "dataset", dependsOnMethods = "loadDataset") + public void updateData() { + final DatasetService datasetService = gd.getDatasetService(); + datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); + } + @Test(groups = "report", dependsOnGroups = "dataset") public void exportReportDefinition() throws Exception { final ReportService reportService = gd.getReportService(); diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 826812527..a1dbcd722 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -8,6 +8,7 @@ import org.testng.annotations.Test; import java.io.ByteArrayInputStream; +import java.io.IOException; import java.util.Collection; import static net.jadler.Jadler.onRequest; @@ -23,6 +24,8 @@ public class DatasetServiceIT extends AbstractGoodDataIT { private static final String STATUS_URI = "/gdc/md/PROJECT_ID/tasks/TASK_ID/status"; + private static final String DML_MAQL = "DELETE FROM {attr.logs.phase_id} WHERE {created.date.yyyymmdd} < \"2015-01-18\""; + private Project project; @BeforeClass @@ -177,4 +180,48 @@ public void shouldFailOptimizeSliHash() throws Exception { gd.getDatasetService().optimizeSliHash(project).get(); } + + @Test + public void shouldUpdateProjectData() throws IOException { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/md/PROJECT_ID/dml/manage") + .respond() + .withStatus(202) + .withBody("{\"uri\" : \"" + STATUS_URI + "\"}"); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) + .thenRespond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new TaskState("OK", STATUS_URI))) + ; + + gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailUpdateProjectData() throws IOException { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/md/PROJECT_ID/dml/manage") + .respond() + .withStatus(202) + .withBody("{\"uri\" : \"" + STATUS_URI + "\"}"); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) + .thenRespond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new TaskState("ERROR", STATUS_URI))) + ; + + gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java new file mode 100644 index 000000000..a229e1816 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import org.apache.commons.io.IOUtils; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class MaqlDmlTest { + + @Test + public void testSerialization() throws Exception { + final String json = IOUtils.toString(getClass().getResourceAsStream("/dataset/maqlDml.json"), "UTF-8"); + assertThat(new ObjectMapper().writeValueAsString(new MaqlDml("maqlddl")), + is(json)); + } +} diff --git a/src/test/java/com/gooddata/dataset/TaskStateTest.java b/src/test/java/com/gooddata/dataset/TaskStateTest.java new file mode 100644 index 000000000..73ed4d31c --- /dev/null +++ b/src/test/java/com/gooddata/dataset/TaskStateTest.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.dataset; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TaskStateTest { + + @Test + public void testDeserialize() throws IOException { + final InputStream stream = getClass().getResourceAsStream("/dataset/taskStateOK.json"); + TaskState taskState = new ObjectMapper().readValue(stream, TaskState.class); + assertThat(taskState.getStatus(), is("OK")); + assertThat(taskState.getMessage(), is("ok message")); + } +} diff --git a/src/test/resources/dataset/maqlDml.json b/src/test/resources/dataset/maqlDml.json new file mode 100644 index 000000000..f4eeb7c25 --- /dev/null +++ b/src/test/resources/dataset/maqlDml.json @@ -0,0 +1 @@ +{"manage":{"maql":"maqlddl"}} \ No newline at end of file diff --git a/src/test/resources/dataset/taskStateOK.json b/src/test/resources/dataset/taskStateOK.json new file mode 100644 index 000000000..d2112b8f3 --- /dev/null +++ b/src/test/resources/dataset/taskStateOK.json @@ -0,0 +1,6 @@ +{ + "taskState" : { + "msg" : "ok message", + "status" : "OK" + } +} From 97d70f1d73b82954b1c8a4b45603192f9b54439f Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Thu, 2 Apr 2015 13:33:38 +0200 Subject: [PATCH 0139/1191] Added support for paged collections --- .../java/com/gooddata/collections/Page.java | 19 +++++++ .../com/gooddata/collections/PageRequest.java | 33 ++++++++++++ .../gooddata/collections/PageableList.java | 53 +++++++++++++++++++ .../java/com/gooddata/collections/Paging.java | 46 ++++++++++++++++ .../com/gooddata/collections/UriPage.java | 36 +++++++++++++ .../gooddata/collections/PageRequestTest.java | 22 ++++++++ .../collections/PageableListTest.java | 41 ++++++++++++++ .../com/gooddata/collections/PagingTest.java | 36 +++++++++++++ .../com/gooddata/collections/UriPageTest.java | 26 +++++++++ src/test/resources/collections/paging.json | 5 ++ .../resources/collections/paging_no_next.json | 4 ++ 11 files changed, 321 insertions(+) create mode 100644 src/main/java/com/gooddata/collections/Page.java create mode 100644 src/main/java/com/gooddata/collections/PageRequest.java create mode 100644 src/main/java/com/gooddata/collections/PageableList.java create mode 100644 src/main/java/com/gooddata/collections/Paging.java create mode 100644 src/main/java/com/gooddata/collections/UriPage.java create mode 100644 src/test/java/com/gooddata/collections/PageRequestTest.java create mode 100644 src/test/java/com/gooddata/collections/PageableListTest.java create mode 100644 src/test/java/com/gooddata/collections/PagingTest.java create mode 100644 src/test/java/com/gooddata/collections/UriPageTest.java create mode 100644 src/test/resources/collections/paging.json create mode 100644 src/test/resources/collections/paging_no_next.json diff --git a/src/main/java/com/gooddata/collections/Page.java b/src/main/java/com/gooddata/collections/Page.java new file mode 100644 index 000000000..08c02317c --- /dev/null +++ b/src/main/java/com/gooddata/collections/Page.java @@ -0,0 +1,19 @@ +package com.gooddata.collections; + +import org.springframework.web.util.UriComponentsBuilder; + +import java.net.URI; + +/** + * Defines logic for generating page URIs. + */ +public interface Page { + + /** + * Creates {@link URI} for this page request. + * + * @param uriBuilder URI builder used for generating page URI + * @return compiled page URI + */ + URI getPageUri(final UriComponentsBuilder uriBuilder); +} diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java new file mode 100644 index 000000000..c8366972d --- /dev/null +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -0,0 +1,33 @@ +package com.gooddata.collections; + +import org.springframework.web.util.UriComponentsBuilder; + +import java.net.URI; + +/** + * User defined page with desired offset and limit. + */ +public class PageRequest implements Page { + + private final int offset; + private final int limit; + + /** + * Creates new page with provided values. + * + * @param offset page offset + * @param limit item count on a page + */ + public PageRequest(final int offset, final int limit) { + this.offset = offset; + this.limit = limit; + } + + @Override + public URI getPageUri(final UriComponentsBuilder uriBuilder) { + return uriBuilder + .queryParam("offset", offset) + .queryParam("limit", limit) + .build().toUri(); + } +} diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java new file mode 100644 index 000000000..f98071abf --- /dev/null +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -0,0 +1,53 @@ +package com.gooddata.collections; + +import java.util.Collections; +import java.util.List; + +import static com.gooddata.util.Validate.notNull; + +/** + * Wrapper over pageable GDC list. + * + * @param type of collection elements + */ +public class PageableList { + + private final List items; + private final Paging paging; + + /** + * Creates empty list with no next page. + */ + public PageableList() { + this(Collections.emptyList(), null); + } + + /** + * Creates list wrapping provided items and next page. + * + * @param items to be wrapped + * @param paging page description + */ + public PageableList(final List items, final Paging paging) { + this.items = notNull(items, "items"); + this.paging = paging; + } + + /** + * Return page items. + * + * @return page items + */ + public List getItems() { + return items; + } + + /** + * Returns description of the next page. + * + * @return next page, might be null + */ + public Page getNextPage() { + return paging == null ? null : paging.getNext(); + } +} diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java new file mode 100644 index 000000000..e63152c1b --- /dev/null +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -0,0 +1,46 @@ +package com.gooddata.collections; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeInfo.As; +import org.codehaus.jackson.annotate.JsonTypeInfo.Id; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Description of the current collection page. Deserialization only. + */ +@JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NONE) +@JsonTypeName("paging") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Paging { + + private final int offset; + private final int count; + private final UriPage next; + + @JsonCreator + public Paging(@JsonProperty("offset") final int offset, + @JsonProperty("count") final int count, + @JsonProperty("next") final String next) { + this.offset = offset; + this.count = count; + this.next = next == null ? null : new UriPage(next); + } + + public int getOffset() { + return offset; + } + + public int getCount() { + return count; + } + + public UriPage getNext() { + return next; + } +} diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java new file mode 100644 index 000000000..8905a49a3 --- /dev/null +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -0,0 +1,36 @@ +package com.gooddata.collections; + +import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriTemplate; + +import java.net.URI; + +import static com.gooddata.util.Validate.notNull; + +/** + * {@link Page} implementation wrapping next page link from REST API. + */ +class UriPage implements Page { + + private final URI pageUri; + + /** + * Creates new instance with defined page URI. + * + * @param pageUri page URI + */ + public UriPage(final String pageUri) { + this.pageUri = new UriTemplate(notNull(pageUri, "pageUri")).expand(); + } + + /** + * This is effectively no-op. Returns internal URI provided by REST API. + * + * @param uriBuilder not used internally, can be null + * @return next page URI provided by REST API + */ + @Override + public URI getPageUri(final UriComponentsBuilder uriBuilder) { + return pageUri; + } +} diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java new file mode 100644 index 000000000..450a60ce2 --- /dev/null +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -0,0 +1,22 @@ +package com.gooddata.collections; + +import org.springframework.web.util.UriComponentsBuilder; +import org.testng.annotations.Test; + +import java.net.URI; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +public class PageRequestTest { + + @Test + public void testGetPageUri() throws Exception { + final PageRequest pageRequest = new PageRequest(12, 10); + final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("test_uri"); + final URI pageUri = pageRequest.getPageUri(uriBuilder); + assertThat(pageUri, notNullValue()); + assertThat(pageUri.toString(), is("test_uri?offset=12&limit=10")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/collections/PageableListTest.java b/src/test/java/com/gooddata/collections/PageableListTest.java new file mode 100644 index 000000000..f87a230de --- /dev/null +++ b/src/test/java/com/gooddata/collections/PageableListTest.java @@ -0,0 +1,41 @@ +package com.gooddata.collections; + +import org.testng.annotations.Test; + +import java.util.Arrays; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Is.is; + +public class PageableListTest { + + @Test + public void testCollectionEmpty() { + final PageableList collection = new PageableList<>(); + assertThat(collection.getItems(), notNullValue()); + assertThat(collection.getItems(), empty()); + assertThat(collection.getNextPage(), nullValue()); + } + + @Test + public void testCollection() { + final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), null); + assertThat(collection.getItems(), notNullValue()); + assertThat(collection.getItems(), hasSize(3)); + assertThat(collection.getNextPage(), nullValue()); + } + + @Test + public void testCollectionWithPaging() { + final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), new Paging(1, 2, "next")); + assertThat(collection.getItems(), notNullValue()); + assertThat(collection.getItems(), hasSize(3)); + assertThat(collection.getNextPage(), notNullValue()); + assertThat(collection.getNextPage().getPageUri(null).toString(), is("next")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java new file mode 100644 index 000000000..c7dc5dbf5 --- /dev/null +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -0,0 +1,36 @@ +package com.gooddata.collections; + +import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.CoreMatchers; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +public class PagingTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/collections/paging.json"); + final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + + assertThat(paging.getOffset(), is(0)); + assertThat(paging.getCount(), is(1)); + assertThat(paging.getNext(), notNullValue()); + assertThat(paging.getNext().getPageUri(null).toString(), is("next")); + } + + @Test + public void testDeserializationNullNext() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/collections/paging_no_next.json"); + final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + + assertThat(paging.getOffset(), is(0)); + assertThat(paging.getCount(), is(1)); + assertThat(paging.getNext(), nullValue()); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java new file mode 100644 index 000000000..a068da13c --- /dev/null +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -0,0 +1,26 @@ +package com.gooddata.collections; + +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.testng.Assert.fail; + +public class UriPageTest { + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = ".*pageUri can't be null.*" + ) + public void testNullConstructorArgument() { + new UriPage(null); + } + + @Test + public void testGetPageUri() throws Exception { + final UriPage uri = new UriPage("uri"); + assertThat(uri.getPageUri(null).toString(), is("uri")); + } + +} \ No newline at end of file diff --git a/src/test/resources/collections/paging.json b/src/test/resources/collections/paging.json new file mode 100644 index 000000000..fd991fd0f --- /dev/null +++ b/src/test/resources/collections/paging.json @@ -0,0 +1,5 @@ +{ + "offset": 0, + "count": 1, + "next": "next" +} \ No newline at end of file diff --git a/src/test/resources/collections/paging_no_next.json b/src/test/resources/collections/paging_no_next.json new file mode 100644 index 000000000..ba8a78e29 --- /dev/null +++ b/src/test/resources/collections/paging_no_next.json @@ -0,0 +1,4 @@ +{ + "offset": 0, + "count": 1 +} \ No newline at end of file From e15b6f69d7b813dbb601e4185f9388fac11f189a Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Fri, 3 Apr 2015 11:07:20 +0200 Subject: [PATCH 0140/1191] Added support for schedules --- README.md | 4 +- .../com/gooddata/collections/PageRequest.java | 4 +- .../dataload/processes/DataloadProcess.java | 8 + .../dataload/processes/ProcessExecution.java | 6 +- .../dataload/processes/ProcessService.java | 143 +++++++++++++++ .../gooddata/dataload/processes/Schedule.java | 169 ++++++++++++++++++ .../processes/ScheduleNotFoundException.java | 20 +++ .../dataload/processes/ScheduleState.java | 8 + .../dataload/processes/Schedules.java | 31 ++++ src/test/java/com/gooddata/ShowcaseAT.java | 18 ++ .../dataload/processes/ProcessServiceIT.java | 93 ++++++++++ .../dataload/processes/ScheduleTest.java | 128 +++++++++++++ .../dataload/processes/SchedulesTest.java | 40 +++++ .../dataload/processes/schedule-disabled.json | 42 +++++ .../dataload/processes/schedule-input.json | 11 ++ .../dataload/processes/schedule.json | 42 +++++ .../dataload/processes/schedules.json | 53 ++++++ .../dataload/processes/schedules_page1.json | 54 ++++++ .../dataload/processes/schedules_page2.json | 53 ++++++ 19 files changed, 920 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gooddata/dataload/processes/Schedule.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ScheduleState.java create mode 100644 src/main/java/com/gooddata/dataload/processes/Schedules.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ScheduleTest.java create mode 100644 src/test/java/com/gooddata/dataload/processes/SchedulesTest.java create mode 100644 src/test/resources/dataload/processes/schedule-disabled.json create mode 100644 src/test/resources/dataload/processes/schedule-input.json create mode 100644 src/test/resources/dataload/processes/schedule.json create mode 100644 src/test/resources/dataload/processes/schedules.json create mode 100644 src/test/resources/dataload/processes/schedules_page1.json create mode 100644 src/test/resources/dataload/processes/schedules_page2.json diff --git a/README.md b/README.md index 53753b57a..396209f03 100644 --- a/README.md +++ b/README.md @@ -120,11 +120,13 @@ warehouseService.removeWarehouse(warehouse); ``` ### Dataload processes API -Manage dataload processes - create, update, list, delete, and process executions - execute, get logs,... +Manage dataload processes - create, update, list, delete, and process executions - execute, get logs, schedules, ... ```java ProcessService processService = gd.getProcessService(); DataloadProcess process = processService.createProcess(project, new DataloadProcess("name", "GRAPH"), new File("path/to/processdatadir")); ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten")); + +processService.createSchedule(project, new Schedule(process, "myGraph.grf", "0 0 * * *")); ``` diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index c8366972d..a5829fb7a 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -4,6 +4,8 @@ import java.net.URI; +import static com.gooddata.util.Validate.notNull; + /** * User defined page with desired offset and limit. */ @@ -25,7 +27,7 @@ public PageRequest(final int offset, final int limit) { @Override public URI getPageUri(final UriComponentsBuilder uriBuilder) { - return uriBuilder + return notNull(uriBuilder, "uriBuilder") .queryParam("offset", offset) .queryParam("limit", limit) .build().toUri(); diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index ff3fd2b54..314e60237 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -10,6 +10,7 @@ import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.util.CollectionUtils; import org.springframework.web.util.UriTemplate; import java.util.Collections; @@ -108,4 +109,11 @@ public String getExecutionsLink() { public String getSourceLink() { return getUri() != null ? getUri() + "/source" : null; } + + public void validateExecutable(final String executable) { + if (!CollectionUtils.isEmpty(getExecutables()) && + !getExecutables().contains(executable)) { + throw new IllegalArgumentException("Executable " + executable + " not found in process executables " + getExecutables()); + } + } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 72e2d5786..852aec405 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -7,7 +7,6 @@ import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; -import org.springframework.util.CollectionUtils; import java.util.HashMap; import java.util.Map; @@ -41,10 +40,7 @@ public ProcessExecution(DataloadProcess process, String executable, Map(schedule), Schedule.class).getBody(); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new ScheduleNotFoundException(uri, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get schedule " + uri, e); + } + } + + /** + * Get schedule by given URI. + * + * @param uri schedule uri + * @return found schedule + * @throws ScheduleNotFoundException when the schedule doesn't exist + */ + public Schedule getScheduleByUri(String uri) { + notEmpty(uri, "uri"); + try { + return restTemplate.getForObject(uri, Schedule.class); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new ScheduleNotFoundException(uri, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get schedule " + uri, e); + } + } + + /** + * Get schedule by given id and project. + * + * @param project project to which the schedule belongs + * @param id schedule id + * @return found schedule + * @throws ScheduleNotFoundException when the process doesn't exist + */ + public Schedule getScheduleById(Project project, String id) { + notEmpty(id, "id"); + notNull(project, "project"); + return getScheduleByUri(getScheduleUri(project, id).toString()); + } + + /** + * Get first page of paged list of schedules by given project. + * + * @param project project of schedules + * @return list of found schedules or empty list + */ + public PageableList listSchedules(Project project) { + notNull(project, "project"); + return listSchedules(getSchedulesUri(project)); + } + + /** + * Get defined page of paged list of schedules by given project. + * + * @param project project of schedules + * @param page page to be retrieved + * @return list of found schedules or empty list + */ + public PageableList listSchedules(Project project, Page page) { + notNull(project, "project"); + notNull(page, "page"); + return listSchedules(page.getPageUri(UriComponentsBuilder.fromUri(getSchedulesUri(project)))); + } + + /** + * Delete given schedule + * + * @param schedule to delete + */ + public void removeSchedule(Schedule schedule) { + notNull(schedule, "schedule"); + try { + restTemplate.delete(schedule.getUri()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to remove schedule " + schedule.getUri(), e); + } + } + + private PageableList listSchedules(URI uri) { + try { + final Schedules schedules = restTemplate.getForObject(uri, Schedules.class); + if (schedules == null) { + return new PageableList<>(); + } + return schedules; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list schedules", e); + } + } + + private static URI getScheduleUri(Project project, String id) { + return Schedule.TEMPLATE.expand(project.getId(), id); + } + + private static URI getSchedulesUri(Project project) { + return Schedules.TEMPLATE.expand(project.getId()); + } + + private Schedule postSchedule(Schedule schedule, URI postUri) { + try { + return restTemplate.postForObject(postUri, schedule, Schedule.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to post schedule.", e); + } } private Collection listProcesses(URI uri) { diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java new file mode 100644 index 000000000..b410633f7 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -0,0 +1,169 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.util.ISODateTimeDeserializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.springframework.web.util.UriTemplate; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Schedule. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("schedule") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Schedule { + + public static final String URI = "/gdc/projects/{projectId}/schedules/{scheduleId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + + private static final String MSETL_TYPE = "MSETL"; + private static final String PROCESS_ID = "PROCESS_ID"; + private static final String EXECUTABLE = "EXECUTABLE"; + + private String type; + private String state; + private String cron; + private String timezone; + private final DateTime nextExecutionTime; + private final int consecutiveFailedExecutionCount; + private final Map params; + private final Map links; + + public Schedule(final DataloadProcess process, final String executable, final String cron) { + notNull(process, "process"); + + this.type = MSETL_TYPE; + this.state = ScheduleState.ENABLED.name(); + this.cron = notEmpty(cron, "cron"); + this.params = new HashMap<>(); + this.params.put(PROCESS_ID, process.getId()); + process.validateExecutable(executable); + this.nextExecutionTime = null; + this.consecutiveFailedExecutionCount = 0; + this.params.put(EXECUTABLE, executable); + this.links = Collections.emptyMap(); + } + + @JsonCreator + private Schedule(@JsonProperty("type") final String type, + @JsonProperty("state") final String state, + @JsonProperty("cron") final String cron, + @JsonProperty("timezone") final String timezone, + @JsonProperty("nextExecutionTime") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime nextExecutionTime, + @JsonProperty("consecutiveFailedExecutionCount") final int consecutiveFailedExecutionCount, + @JsonProperty("params") final Map params, + @JsonProperty("links") final Map links) { + this.type = type; + this.state = state; + this.cron = cron; + this.timezone = timezone; + this.nextExecutionTime = nextExecutionTime; + this.consecutiveFailedExecutionCount = consecutiveFailedExecutionCount; + this.params = params; + this.links = links; + } + + public String getType() { + return type; + } + + public String getState() { + return state; + } + + public void setState(final String state) { + this.state = notEmpty(state, "state"); + } + + public void setState(final ScheduleState state) { + this.state = notNull(state, "state").name(); + } + + @JsonIgnore + public boolean isEnabled() { + return ScheduleState.ENABLED.name().equals(state); + } + + @JsonIgnore + public String getProcessId() { + return params.get(PROCESS_ID); + } + + public void setProcessId(final DataloadProcess process) { + params.put(PROCESS_ID, process.getId()); + } + + @JsonIgnore + public String getExecutable() { + return params.get(EXECUTABLE); + } + + public void setExecutable(final DataloadProcess process, final String executable) { + notNull(executable, "executable"); + notNull(process, "process").validateExecutable(executable); + params.put(EXECUTABLE, executable); + } + + public Map getParams() { + return Collections.unmodifiableMap(params); + } + + public String getCron() { + return cron; + } + + public void setCron(final String cron) { + this.cron = notEmpty(cron, "cron"); + } + + public String getTimezone() { + return timezone; + } + + public void setTimezone(final String timezone) { + this.timezone = timezone; + } + + public void setTimezone(final DateTimeZone timezone) { + this.timezone = notNull(timezone, "timezone").getID(); + } + + @JsonIgnore + public DateTime getNextExecutionTime() { + return nextExecutionTime; + } + + @JsonIgnore + public int getConsecutiveFailedExecutionCount() { + return consecutiveFailedExecutionCount; + } + + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK) : null; + } + + @JsonIgnore + public String getId() { + return TEMPLATE.match(getUri()).get("scheduleId"); + } + +} diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java new file mode 100644 index 000000000..d8a165aac --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java @@ -0,0 +1,20 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.GoodDataException; + +/** + * Schedule of the given URI doesn't exist + */ +public class ScheduleNotFoundException extends GoodDataException { + + private final String uri; + + public ScheduleNotFoundException(String uri, Throwable cause) { + super("Schedule " + uri + " was not found", cause); + this.uri = uri; + } + + public String getUri() { + return uri; + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java new file mode 100644 index 000000000..0fcc8a89b --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java @@ -0,0 +1,8 @@ +package com.gooddata.dataload.processes; + +/** + * Dataload schedule state. + */ +public enum ScheduleState { + ENABLED, DISABLED +} diff --git a/src/main/java/com/gooddata/dataload/processes/Schedules.java b/src/main/java/com/gooddata/dataload/processes/Schedules.java new file mode 100644 index 000000000..4d7e0dd2c --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/Schedules.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataload.processes; + +import com.gooddata.collections.PageableList; +import com.gooddata.collections.Paging; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.List; + +/** + * List of schedules. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("schedules") +@JsonIgnoreProperties(ignoreUnknown = true) +class Schedules extends PageableList { + public static final String URI = "/gdc/projects/{projectId}/schedules"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + @JsonCreator + Schedules(@JsonProperty("items") final List items, @JsonProperty("paging") final Paging paging) { + super(items, paging); + } +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 9d856aa67..590bbecf5 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -2,6 +2,7 @@ import com.gooddata.account.Account; import com.gooddata.account.AccountService; +import com.gooddata.collections.PageableList; import com.gooddata.dataload.processes.DataloadProcess; import com.gooddata.dataload.processes.ProcessExecution; import com.gooddata.dataload.processes.ProcessExecutionDetail; @@ -25,6 +26,8 @@ import com.gooddata.project.ProjectService; import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; +import com.gooddata.dataload.processes.Schedule; +import com.gooddata.dataload.processes.ScheduleState; import com.gooddata.warehouse.Warehouse; import com.gooddata.warehouse.WarehouseService; import org.apache.commons.io.FileUtils; @@ -53,9 +56,11 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; +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; public class ShowcaseAT { @@ -243,6 +248,19 @@ public void createProcess() throws Exception { copy("sdktest.grf", dir); copy("workspace.prm", dir); process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); + final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); + + assertThat(schedule, notNullValue()); + assertThat(schedule.getExecutable(), is("sdktest.grf")); + + final PageableList collection = gd.getProcessService().listSchedules(project); + assertThat(collection.getItems(), hasSize(1)); + assertThat(collection.getNextPage(), nullValue()); + + schedule.setState(ScheduleState.DISABLED); + assertThat(gd.getProcessService().updateSchedule(project, schedule).isEnabled(), is(false)); + + gd.getProcessService().removeSchedule(schedule); } finally { FileUtils.deleteDirectory(dir); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 5fcc767dc..589497ce0 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -2,8 +2,10 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.FutureResult; +import com.gooddata.collections.PageableList; import com.gooddata.project.Project; import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -16,6 +18,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; 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; @@ -29,17 +32,25 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private static final String EXECUTIONS_PATH = PROCESS_PATH + "/executions"; private static final String EXECUTION_PATH = EXECUTIONS_PATH + "/executionId"; private static final String EXECUTION_DETAIL_PATH = EXECUTION_PATH + "/detail"; + private static final String PROJECT_ID = "PROJECT_ID"; + private static final String SCHEDULES_PATH = Schedules.TEMPLATE.expand(PROJECT_ID).toString(); + private static final String SCHEDULE_ID = "SCHEDULE_ID"; + private static final String SCHEDULE_PATH = Schedule.TEMPLATE.expand(PROJECT_ID, SCHEDULE_ID).toString(); + private static final String EXECUTABLE = "test.groovy"; private Project project; private DataloadProcess process; + private Schedule schedule; + private File file; @BeforeClass public void setUp() throws Exception { project = MAPPER.readValue(readResource("/project/project.json"), Project.class); process = MAPPER.readValue(readResource("/dataload/processes/process.json"), DataloadProcess.class); + schedule = MAPPER.readValue(readResource("/dataload/processes/schedule.json"), Schedule.class); file = File.createTempFile("test", ".groovy"); } @@ -182,4 +193,86 @@ private void mockExecutionRequests() { .thenRespond() .withStatus(204); } + + @Test + public void shouldCreateSchedule() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(SCHEDULES_PATH) + .respond() + .withBody(readResource("/dataload/processes/schedule.json")) + .withStatus(201); + + final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, EXECUTABLE, "0 0 * * *")); + assertThat(schedule, notNullValue()); + assertThat(schedule.getId(), is(SCHEDULE_ID)); + } + + @Test + public void shouldUpdateSchedule() throws Exception { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(SCHEDULE_PATH) + .respond() + .withBody(readResource("/dataload/processes/schedule-disabled.json")) + .withStatus(200); + + schedule.setState(ScheduleState.DISABLED); + final Schedule updated = gd.getProcessService().updateSchedule(project, schedule); + assertThat(updated, notNullValue()); + assertThat(updated.isEnabled(), is(false)); + } + + @Test + public void shouldListPagedSchedules() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SCHEDULES_PATH) + .respond() + .withBody(readResource("/dataload/processes/schedules_page1.json")) + .withStatus(200); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SCHEDULES_PATH) + .havingQueryStringEqualTo("offset=1&limit=1") + .respond() + .withBody(readResource("/dataload/processes/schedules_page2.json")) + .withStatus(200); + + final PageableList firstPage = gd.getProcessService().listSchedules(project); + assertThat(firstPage, notNullValue()); + assertThat(firstPage.getItems(), Matchers.hasSize(1)); + assertThat(firstPage.getNextPage(), notNullValue()); + assertThat(firstPage.getNextPage().getPageUri(null).toString(), is("/gdc/projects/PROJECT_ID/schedules?offset=1&limit=1")); + + final PageableList secondPage = gd.getProcessService().listSchedules(project, firstPage.getNextPage()); + assertThat(secondPage, notNullValue()); + assertThat(secondPage.getItems(), Matchers.hasSize(1)); + assertThat(secondPage.getNextPage(), nullValue()); + } + + @Test + public void shouldGetSchedule() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SCHEDULE_PATH) + .respond() + .withBody(readResource("/dataload/processes/schedule.json")) + .withStatus(200); + + final Schedule schedule = gd.getProcessService().getScheduleById(project, SCHEDULE_ID); + assertThat(schedule, notNullValue()); + assertThat(schedule.isEnabled(), is(true)); + } + + @Test + public void shouldRemoveSchedule() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(SCHEDULE_PATH) + .respond() + .withStatus(204); + + gd.getProcessService().removeSchedule(schedule); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java new file mode 100644 index 000000000..5dd167ec1 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -0,0 +1,128 @@ +package com.gooddata.dataload.processes; + +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.when; +import static org.testng.Assert.fail; + +public class ScheduleTest { + + private static final String EXECUTABLE = "Twitter/graph/twitter.grf"; + + @Mock + private DataloadProcess process; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + + when(process.getExecutables()).thenReturn(Collections.singleton(EXECUTABLE)); + when(process.getId()).thenReturn("process_id"); + doThrow(new IllegalArgumentException("wrong executable")).when(process).validateExecutable(Matchers.argThat(not(is(EXECUTABLE)))); + } + + @Test + public void testDeserialization() throws Exception { + final Schedule schedule = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/schedule.json"), Schedule.class); + + assertThat(schedule, is(notNullValue())); + assertThat(schedule.getId(), is("SCHEDULE_ID")); + assertThat(schedule.getType(), is("MSETL")); + assertThat(schedule.getState(), is("ENABLED")); + assertThat(schedule.isEnabled(), is(true)); + assertThat(schedule.getCron(), is("0 0 * * *")); + assertThat(schedule.getTimezone(), is("UTC")); + assertThat(schedule.getConsecutiveFailedExecutionCount(), is(0)); + assertThat(schedule.getProcessId(), is("process_id")); + assertThat(schedule.getExecutable(), is(EXECUTABLE)); + assertThat(schedule.getNextExecutionTime(), is(DateTime.parse("2013-11-16T00:00:00.000Z"))); + assertThat(schedule.getUri(), is("/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID")); + } + + @Test + public void testSerialization() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + assertThat(schedule, serializesToJson("/dataload/processes/schedule-input.json")); + } + + @DataProvider(name = "scheduleParams") + public Object[][] scheduleParams() { + return new Object[][] { + new Object[] {null, EXECUTABLE, "0 0 * * *", "process"}, + new Object[] {process, "garbage", "0 0 * * *", "wrong executable"}, + new Object[] {process, EXECUTABLE, "", "cron can't be empty"} + }; + } + + @Test(dataProvider = "scheduleParams") + public void testIncorrectConstructorParams(final DataloadProcess process, final String executable, + final String cron, final String message) { + try { + new Schedule(process, executable, cron); + fail("IllegalArgumentException must be thrown"); + } catch (IllegalArgumentException expected) { + assertThat(expected.getMessage(), containsString(message)); + } + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = ".*cron can't be empty.*" + ) + public void testSetCron() { + new Schedule(process, EXECUTABLE, "0 0 * * *").setCron(""); + } + + @Test + public void testSetTimezoneAnyString() { + new Schedule(process, EXECUTABLE, "0 0 * * *").setTimezone("some nonsense garbage to prove a point"); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = ".*timezone can't be null.*" + ) + public void testSetTimezoneObject() { + new Schedule(process, EXECUTABLE, "0 0 * * *").setTimezone((DateTimeZone) null); + } + + @Test + public void testSetProcessId() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + when(process.getId()).thenReturn("other"); + assertThat(schedule.getProcessId(), is("process_id")); + schedule.setProcessId(process); + assertThat(schedule.getProcessId(), is("other")); + } + + @Test( + expectedExceptions = IllegalArgumentException.class, + expectedExceptionsMessageRegExp = ".*wrong executable.*" + ) + public void testSetExecutable() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + assertThat(schedule.getExecutable(), is(EXECUTABLE)); + schedule.setExecutable(process, EXECUTABLE); + assertThat(schedule.getExecutable(), is(EXECUTABLE)); + schedule.setExecutable(process, "garbage"); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java new file mode 100644 index 000000000..8aaf4378e --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -0,0 +1,40 @@ +package com.gooddata.dataload.processes; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.MatcherAssert.assertThat; +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; + +public class SchedulesTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules.json"); + final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); + + assertThat(schedules.getItems(), notNullValue()); + assertThat(schedules.getItems(), hasSize(1)); + assertThat(schedules.getItems().get(0).getId(), is("schedule_id")); + assertThat(schedules.getItems().get(0).getType(), is("MSETL")); + assertThat(schedules.getNextPage(), nullValue()); + } + + @Test + public void testDeserializationPaging() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules_page1.json"); + final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); + + assertThat(schedules.getItems(), notNullValue()); + assertThat(schedules.getItems(), hasSize(1)); + assertThat(schedules.getItems().get(0).getId(), is("schedule_id_1")); + assertThat(schedules.getItems().get(0).getType(), is("MSETL")); + assertThat(schedules.getNextPage(), notNullValue()); + assertThat(schedules.getNextPage().getPageUri(null).toString(), is("/gdc/projects/PROJECT_ID/schedules?offset=1&limit=1")); + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedule-disabled.json b/src/test/resources/dataload/processes/schedule-disabled.json new file mode 100644 index 000000000..f75828947 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule-disabled.json @@ -0,0 +1,42 @@ +{ + "schedule": { + "type": "MSETL", + "state": "DISABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "lastSuccessful": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/execution_id" + } + } + }, + "lastExecution": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/execution_id" + } + } + }, + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID", + "executions": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions" + } + } +} diff --git a/src/test/resources/dataload/processes/schedule-input.json b/src/test/resources/dataload/processes/schedule-input.json new file mode 100644 index 000000000..806f85ae6 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule-input.json @@ -0,0 +1,11 @@ +{ + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *" + } +} diff --git a/src/test/resources/dataload/processes/schedule.json b/src/test/resources/dataload/processes/schedule.json new file mode 100644 index 000000000..f26f971f9 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule.json @@ -0,0 +1,42 @@ +{ + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "lastSuccessful": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/execution_id" + } + } + }, + "lastExecution": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/execution_id" + } + } + }, + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID", + "executions": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions" + } + } +} diff --git a/src/test/resources/dataload/processes/schedules.json b/src/test/resources/dataload/processes/schedules.json new file mode 100644 index 000000000..41cd9407f --- /dev/null +++ b/src/test/resources/dataload/processes/schedules.json @@ -0,0 +1,53 @@ +{ + "schedules": { + "paging": { + "offset": 0, + "count": 1 + }, + "schedulesLink": "/gdc/projects/project_id/schedules", + "items": [ + { + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "lastSuccessful": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/project_id/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id/executions/execution_id" + } + } + }, + "lastExecution": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/project_id/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id/executions/execution_id" + } + } + }, + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id", + "executions": "/gdc/projects/project_id/schedules/schedule_id/executions" + } + } + } + ] + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedules_page1.json b/src/test/resources/dataload/processes/schedules_page1.json new file mode 100644 index 000000000..6534667c9 --- /dev/null +++ b/src/test/resources/dataload/processes/schedules_page1.json @@ -0,0 +1,54 @@ +{ + "schedules": { + "paging": { + "offset": 0, + "count": 1, + "next": "/gdc/projects/PROJECT_ID/schedules?offset=1&limit=1" + }, + "schedulesLink": "/gdc/projects/PROJECT_ID/schedules", + "items": [ + { + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "lastSuccessful": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/schedule_id_1/executions/schedule_execution_id" + } + } + }, + "lastExecution": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/PROJECT_ID/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/schedule_id_1/executions/schedule_execution_id" + } + } + }, + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/schedule_id_1", + "executions": "/gdc/projects/PROJECT_ID/schedules/schedule_id_1/executions" + } + } + } + ] + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedules_page2.json b/src/test/resources/dataload/processes/schedules_page2.json new file mode 100644 index 000000000..4f0e96661 --- /dev/null +++ b/src/test/resources/dataload/processes/schedules_page2.json @@ -0,0 +1,53 @@ +{ + "schedules": { + "paging": { + "offset": 1, + "count": 1 + }, + "schedulesLink": "/gdc/projects/project_id/schedules", + "items": [ + { + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "lastSuccessful": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/project_id/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id_2/executions/schedule_execution_id" + } + } + }, + "lastExecution": { + "execution": { + "startTime": "2013-11-15T00:00:40.355Z", + "endTime": "2013-11-15T00:00:49.030Z", + "log": "/gdc/projects/project_id/dataload/processes/process_id/executions/execution_id/log", + "status": "OK", + "trigger": "CRON", + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id_2/executions/schedule_execution_id" + } + } + }, + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/project_id/schedules/schedule_id_2", + "executions": "/gdc/projects/project_id/schedules/schedule_id_2/executions" + } + } + } + ] + } +} \ No newline at end of file From fac7fa2081395d378ecd1a4807c16665652698f9 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 29 Nov 2014 13:33:43 +0100 Subject: [PATCH 0141/1191] add missing MetadataService tests --- .../java/com/gooddata/md/MetadataService.java | 6 +- .../com/gooddata/md/MetadataServiceTest.java | 151 +++++++++++++++++- 2 files changed, 153 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index a35d5c354..3530bdaac 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -40,7 +40,7 @@ public MetadataService(RestTemplate restTemplate) { * @throws com.gooddata.md.ObjNotFoundException if new metadata object not found after creation * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code when getting * the new object - * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors when getting the new object + * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error when getting the new object */ @SuppressWarnings("unchecked") public T createObj(Project project, T obj) { @@ -69,7 +69,7 @@ public T createObj(Project project, T obj) { * @return the metadata object * @throws com.gooddata.md.ObjNotFoundException if metadata object not found * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code - * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors + * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error */ public T getObjByUri(String uri, Class cls) { notNull(uri, "uri"); @@ -103,7 +103,7 @@ public T getObjByUri(String uri, Class cls) { * @return the metadata object * @throws com.gooddata.md.ObjNotFoundException if metadata object not found * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code - * @throws com.gooddata.GoodDataException if it encounters client-side HTTP errors + * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error */ public T getObjById(Project project, String id, Class cls) { notNull(project, "project"); diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index cae915810..4d7154d4b 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -3,6 +3,7 @@ */ package com.gooddata.md; +import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; @@ -15,7 +16,12 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.util.Collection; + import static java.lang.String.format; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -107,6 +113,23 @@ public void testGetObjByUri() throws Exception { assertThat(result, is(resultObj)); } + @Test(expectedExceptions = GoodDataException.class) + public void testGetObjByUriWithClientSideHTTPError() throws Exception { + when(restTemplate.getForObject(URI, Obj.class)).thenThrow(new RestClientException("")); + service.getObjByUri(URI, Queryable.class); + } + + @Test(expectedExceptions = GoodDataRestException.class) + public void testGetObjByUriWithServerSideHTTPError() throws Exception { + when(restTemplate.getForObject(URI, Obj.class)).thenThrow(new GoodDataRestException(500, "", "", "", "")); + service.getObjByUri(URI, Obj.class); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetObjByUriWithNoResponseFromAPI() throws Exception { + service.getObjByUri(URI, Obj.class); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByIdNullProject() throws Exception { service.getObjById(null, ID, Obj.class); @@ -147,6 +170,132 @@ public void testFindIdentifierUrisNullRestriction() { service.findUris(project, null); } -//TODO the other methods + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetObjUriNullProject() throws Exception { + service.getObjUri(null, Queryable.class, Restriction.identifier("")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetObjUriNullClass() throws Exception { + service.getObjUri(project, null, Restriction.identifier("")); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetObjUriNoResponseFromAPI() throws Exception { + service.getObjUri(project, Queryable.class); + } + + @Test + public void testGetObjUriToFindOneObjByTitle() throws Exception { + final Query queryResult = mock(Query.class); + 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(queryResult.getEntries()).thenReturn(asList(resultEntry)); + when(resultEntry.getTitle()).thenReturn(title); + when(resultEntry.getLink()).thenReturn(uri); + + final String result = service.getObjUri(project, Queryable.class, Restriction.title(title)); + assertThat(result, is(uri)); + } + + @Test(expectedExceptions = NonUniqueObjException.class) + 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(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); + + service.getObjUri(project, Queryable.class); + } + + @Test(expectedExceptions = ObjNotFoundException.class) + 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(queryResult.getEntries()).thenReturn(asList(resultEntry)); + + service.getObjUri(project, Queryable.class, Restriction.title(title)); + } + + @Test + public void testGetObjToFindOneObjById() throws Exception { + final Queryable intendedResult = mock(Queryable.class); + final Query queryResult = mock(Query.class); + 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(queryResult.getEntries()).thenReturn(asList(resultEntry)); + when(resultEntry.getIdentifier()).thenReturn(id); + when(resultEntry.getLink()).thenReturn(uri); + when(restTemplate.getForObject(uri, Queryable.class)).thenReturn(intendedResult); + + final Queryable result = service.getObj(project, Queryable.class, Restriction.identifier(id)); + assertThat(result, is(intendedResult)); + } + + @Test(expectedExceptions = NonUniqueObjException.class) + 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(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); + + service.getObj(project, Queryable.class); + } + + @Test(expectedExceptions = ObjNotFoundException.class) + 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(queryResult.getEntries()).thenReturn(asList(resultEntry)); + + service.getObj(project, Queryable.class, Restriction.title(title)); + } + + @Test + 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(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); + + final Collection results = service.find(project, Queryable.class); + assertThat(results, allOf(hasItem(resultEntry1), hasItem(resultEntry2))); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testFindWithWithClientSideHTTPError() throws Exception { + when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenThrow(new RestClientException("")); + service.find(project, Queryable.class); + } + + @Test + public void testFindUrisBySummary() throws Exception { + final Query queryResult = mock(Query.class); + final Entry resultEntry1 = mock(Entry.class); + final Entry resultEntry2 = mock(Entry.class); + 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(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); + when(resultEntry1.getSummary()).thenReturn(summary); + when(resultEntry2.getSummary()).thenReturn(summary); + when(resultEntry1.getLink()).thenReturn(uri1); + when(resultEntry2.getLink()).thenReturn(uri2); + + final Collection results = service.findUris(project, Queryable.class, Restriction.summary(summary)); + assertThat(results, allOf(hasItem(uri1), hasItem(uri2))); + } } From 7924e5d69763f9c30db0394258b22be0f7555cb3 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sun, 30 Nov 2014 22:37:04 +0100 Subject: [PATCH 0142/1191] add ProjectServiceTest --- .../gooddata/project/ProjectServiceTest.java | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 src/test/java/com/gooddata/project/ProjectServiceTest.java diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java new file mode 100644 index 000000000..44e4a439d --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.account.Account; +import com.gooddata.account.AccountService; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.Collection; + +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.Mockito.when; + +public class ProjectServiceTest { + + private static final String ACCOUNT_ID = "17"; + private static final String ID = "11"; + private static final String URI = "/gdc/projects/11"; + + @Mock + private Project project; + @Mock + private RestTemplate restTemplate; + @Mock + private AccountService accountService; + @Mock + private Account account; + + private ProjectService service; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new ProjectService(restTemplate, accountService); + when(accountService.getCurrent()).thenReturn(account); + when(account.getId()).thenReturn(ACCOUNT_ID); + } + + @Test + public void testGetProjects() throws Exception { + when(restTemplate.getForObject(Project.PROJECTS_URI, Projects.class, ACCOUNT_ID)) + .thenReturn(new Projects(asList(project))); + final Collection result = service.getProjects(); + + assertThat(result, hasSize(1)); + assertThat(result, hasItem(project)); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetProjectsWithClientException() throws Exception { + when(restTemplate.getForObject(Project.PROJECTS_URI, Projects.class, ACCOUNT_ID)) + .thenThrow(new GoodDataException("")); + service.getProjects(); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetProjectByUriWithNullUri() throws Exception { + service.getProjectByUri(null); + } + + @Test + public void testGetProjectByUri() throws Exception { + when(restTemplate.getForObject(URI, Project.class)).thenReturn(project); + + final Project result = service.getProjectByUri(URI); + assertThat(result, is(project)); + } + + @Test(expectedExceptions = ProjectNotFoundException.class) + public void testGetProjectByUriNotFound() throws Exception { + when(restTemplate.getForObject(URI, Project.class)).thenThrow(new GoodDataRestException(404, "", "", "", "")); + service.getProjectByUri(URI); + } + + @Test(expectedExceptions = GoodDataRestException.class) + public void testGetProjectByUriServerError() throws Exception { + when(restTemplate.getForObject(URI, Project.class)).thenThrow(new GoodDataRestException(500, "", "", "", "")); + service.getProjectByUri(URI); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetProjectByUriClientError() throws Exception { + when(restTemplate.getForObject(URI, Project.class)).thenThrow(new RestClientException("")); + service.getProjectByUri(URI); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetProjectByUriWithNullId() throws Exception { + service.getProjectById(null); + } + + @Test + public void testGetProjectById() throws Exception { + when(restTemplate.getForObject(URI, Project.class)).thenReturn(project); + + final Project result = service.getProjectById(ID); + assertThat(result, is(project)); + } + +} \ No newline at end of file From faa55e9360689494076aa3d7ff6df0181b15fbb5 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 25 Mar 2015 22:04:30 +0100 Subject: [PATCH 0143/1191] add batch upload support --- README.md | 12 ++ .../gooddata/dataset/DatasetException.java | 34 ++++- .../com/gooddata/dataset/DatasetManifest.java | 26 +++- .../gooddata/dataset/DatasetManifests.java | 34 +++++ .../com/gooddata/dataset/DatasetService.java | 142 +++++++++++++----- src/main/java/com/gooddata/util/Validate.java | 16 ++ src/test/java/com/gooddata/ShowcaseAT.java | 14 +- .../gooddata/dataset/DatasetManifestTest.java | 12 ++ .../gooddata/dataset/DatasetServiceIT.java | 24 ++- src/test/resources/city.csv | 3 + src/test/resources/person.json | 21 +++ 11 files changed, 291 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/DatasetManifests.java create mode 100644 src/test/resources/city.csv diff --git a/README.md b/README.md index 5904a9626..0ece2fc82 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,18 @@ Upload data to datasets,.. DatasetService datasetService = gd.getDatasetService(); datasetService.loadDataset(project, "datasetId", new FileInputStream("data.csv")).get(); ``` +Upload data to datasets using batch upload ,.. + +```java +DatasetService datasetService = gd.getDatasetService(); +final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); +personManifest.setSource(getClass().getResourceAsStream("/person.csv")); + +final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); +cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); + +datasetService.loadDatasets(project, personManifest, cityManifest).get(); +``` Update data in dataset ```java diff --git a/src/main/java/com/gooddata/dataset/DatasetException.java b/src/main/java/com/gooddata/dataset/DatasetException.java index 5dbcd149f..11f42ae7a 100644 --- a/src/main/java/com/gooddata/dataset/DatasetException.java +++ b/src/main/java/com/gooddata/dataset/DatasetException.java @@ -5,23 +5,49 @@ import com.gooddata.GoodDataException; +import java.util.Collection; + +import static java.util.Arrays.asList; + /** * Represents error in DatasetService */ public class DatasetException extends GoodDataException { - private final String dataset; + private final Collection datasets; public DatasetException(String message, String dataset) { this(message, dataset, null); } public DatasetException(String message, String dataset, Throwable cause) { - super("Load dataset " + dataset + " failed: " + message, cause); - this.dataset = dataset; + this(message, asList(dataset), cause); + } + + public DatasetException(String message, Collection datasets, Throwable cause) { + super("Load datasets " + datasets + " failed: " + message, cause); + this.datasets = datasets; + } + + public DatasetException(String message, Collection datasets) { + this(message, datasets, null); + } + + /** + * Get datasets. + * @return dataset names + */ + public Collection getDatasets() { + return datasets; } + /** + * @return string representation of collection containing dataset names + * @deprecated since this exception may contain more than one dataset, use {@link #getDatasets} instead + * @see #getDatasets() + */ + @Deprecated public String getDataset() { - return dataset; + return datasets.toString(); } } diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 53d62842d..e8cca9d2a 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -6,6 +6,7 @@ import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanIntegerSerializer; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; @@ -13,9 +14,11 @@ import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.io.InputStream; import java.util.List; import java.util.Map; +import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -33,11 +36,22 @@ public class DatasetManifest { private final String dataSet; private String file; private List parts; + private InputStream source; public DatasetManifest(String dataSet) { this.dataSet = dataSet; } + /** + * Create dataset upload manifest. + * @param dataSet dataset name + * @param source source CSV + */ + public DatasetManifest(final String dataSet, final InputStream source) { + this.source = notNull(source, "source"); + this.dataSet = notEmpty(dataSet, "dataSet"); + } + @JsonCreator public DatasetManifest(@JsonProperty("dataSet") String dataSet, @JsonProperty("file") String file, @JsonProperty("parts") List parts) { @@ -63,7 +77,7 @@ public String getFile() { } public void setFile(String file) { - this.file = file; + this.file = notEmpty(file, "file"); } /** @@ -98,6 +112,16 @@ public void setMapping(final String columnName, final String populates) { throw new IllegalArgumentException("Dataset manifest parts doesn't contain populate value " + populates); } + @JsonIgnore + public InputStream getSource() { + return source; + } + + @JsonIgnore + public void setSource(final InputStream source) { + this.source = notNull(source, "source"); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public static class Part { diff --git a/src/main/java/com/gooddata/dataset/DatasetManifests.java b/src/main/java/com/gooddata/dataset/DatasetManifests.java new file mode 100644 index 000000000..eec6baf53 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/DatasetManifests.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.dataset; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.Collection; + +import static com.gooddata.util.Validate.notNull; + +/** + * Encapsulates list of {@link DatasetManifest}. + */ +class DatasetManifests { + + private final Collection manifests; + + /** + * Construct object. + * @param manifests dataset upload manifests + */ + @JsonCreator + public DatasetManifests(@JsonProperty("dataSetSLIManifestList") Collection manifests) { + this.manifests = notNull(manifests, "manifests"); + } + + @JsonProperty("dataSetSLIManifestList") + public Collection getManifests() { + return manifests; + } +} diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index d4ba0d571..b795eaec5 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -34,6 +34,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static org.apache.commons.lang.StringUtils.isEmpty; /** * Service to work with datasets and manifests. @@ -99,29 +100,7 @@ public FutureResult loadDataset(final Project project, final DatasetManife final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); - final PullTask pullTask = restTemplate - .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - return new FutureResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { - @Override - public boolean isFinished(ClientHttpResponse response) throws IOException { - final PullTaskStatus status = extractData(response, PullTaskStatus.class); - final boolean finished = status.isFinished(); - if (finished && !status.isSuccess()) { - final String message = getErrorMessage(status, dirPath); - throw new DatasetException(message, manifest.getDataSet()); - } - return finished; - } - - @Override - protected void onFinish() { - try { - dataStoreService.delete(dirPath.toString() + "/"); - } catch (DataStoreException ignored) { - // todo log? - } - } - }); + return pullLoad(project, dirPath, manifest.getDataSet()); } catch (IOException e) { throw new DatasetException("Unable to serialize manifest", manifest.getDataSet(), e); } catch (DataStoreException | GoodDataRestException | RestClientException e) { @@ -129,6 +108,107 @@ protected void onFinish() { } } + /** + * Gets DatasetManifest (using {@link #getDatasetManifest(com.gooddata.project.Project, String)} + * first and then calls {@link #loadDataset(com.gooddata.project.Project, DatasetManifest, java.io.InputStream)} + * + * @param project project to which dataset belongs + * @param datasetId datasetId to obtain a manifest + * @param dataset dataset to upload + * @return {@link com.gooddata.FutureResult} of the task + */ + public FutureResult loadDataset(Project project, String datasetId, InputStream dataset) { + notNull(project, "project"); + notEmpty(datasetId, "datasetId"); + notNull(dataset, "dataset"); + return loadDataset(project, getDatasetManifest(project, datasetId), dataset); + } + + public FutureResult loadDatasets(final Project project, DatasetManifest... datasets) { + return loadDatasets(project, asList(datasets)); + } + + /** + * Loads datasets into platform. Uploads given datasets and their manifests to staging area and triggers ETL pull. + * The call is asynchronous returning {@link com.gooddata.FutureResult} to let caller wait for results. + * Uploaded files are deleted from staging area when finished. + * + * @param project project to which dataset belongs + * @param datasets map dataset manifests + * @return {@link com.gooddata.FutureResult} of the task, which can throw {@link com.gooddata.dataset.DatasetException} + * in case the ETL pull task fails + * @throws com.gooddata.dataset.DatasetException if there is a problem to serialize manifest or upload dataset + * @see batch upload reference + */ + public FutureResult loadDatasets(final Project project, final Collection datasets) { + notNull(project, "project"); + validateUploadManifests(datasets); + final List datasetsNames = new ArrayList<>(datasets.size()); + try { + final Path dirPath = Paths.get("/", project.getId() + "_" + RandomStringUtils.randomAlphabetic(3), "/"); + for (DatasetManifest datasetManifest : datasets) { + datasetsNames.add(datasetManifest.getDataSet()); + dataStoreService.upload(dirPath.resolve(datasetManifest.getFile()).toString(), datasetManifest.getSource()); + } + + final String manifestJson = mapper.writeValueAsString(new DatasetManifests(datasets)); + final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); + dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); + + return pullLoad(project, dirPath, datasetsNames); + } catch (IOException e) { + throw new DatasetException("Unable to serialize manifest", datasetsNames, e); + } catch (DataStoreException | GoodDataRestException | RestClientException e) { + throw new DatasetException("Unable to load", datasetsNames, e); + } + } + + private void validateUploadManifests(final Collection datasets) { + notEmpty(datasets, "datasets"); + for (DatasetManifest datasetManifest : datasets) { + if (datasetManifest.getSource() == null) { + throw new IllegalArgumentException(format("Source for dataset '%s' is null", datasetManifest.getDataSet())); + } + if (datasetManifest.getFile() == null) { + throw new IllegalArgumentException(format("File for dataset '%s' is null", datasetManifest.getDataSet())); + } + if (isEmpty(datasetManifest.getDataSet())) { + throw new IllegalArgumentException("Dataset name is empty."); + } + } + } + + private FutureResult pullLoad(Project project, final Path dirPath, final String dataset) { + return pullLoad(project, dirPath, asList(dataset)); + } + + private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets) { + final PullTask pullTask = restTemplate + .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); + return new FutureResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + final PullTaskStatus status = extractData(response, PullTaskStatus.class); + final boolean finished = status.isFinished(); + if (finished && !status.isSuccess()) { + final String message = getErrorMessage(status, dirPath); + throw new DatasetException(message, datasets); + } + return finished; + } + + @Override + protected void onFinish() { + try { + dataStoreService.delete(dirPath.toString() + "/"); + } catch (DataStoreException ignored) { + // todo log? + } + } + }); + + } + private String getErrorMessage(final PullTaskStatus status, final Path dirPath) { String message = "status: " + status.getStatus(); try { @@ -166,22 +246,6 @@ private T download(final Path path, final Class type) throws IOException } } - /** - * Gets DatasetManifest (using {@link #getDatasetManifest(com.gooddata.project.Project, String)} - * first and then calls {@link #loadDataset(com.gooddata.project.Project, DatasetManifest, java.io.InputStream)} - * - * @param project project to which dataset belongs - * @param datasetId datasetId to obtain a manifest - * @param dataset dataset to upload - * @return {@link com.gooddata.FutureResult} of the task - */ - public FutureResult loadDataset(Project project, String datasetId, InputStream dataset) { - notNull(project, "project"); - notEmpty(datasetId, "datasetId"); - notNull(dataset, "dataset"); - return loadDataset(project, getDatasetManifest(project, datasetId), dataset); - } - /** * Lists datasets in project. Returns empty list in case there are no datasets. * diff --git a/src/main/java/com/gooddata/util/Validate.java b/src/main/java/com/gooddata/util/Validate.java index 22a60bc56..f83d85f51 100644 --- a/src/main/java/com/gooddata/util/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -39,6 +39,22 @@ public static T notEmpty(T value, String argumentName) return value; } + /** + * Throws IllegalArgumentException if the map is empty, otherwise returns the map. + * + * @param value input collection + * @param argumentName the name of the input argument + * @param the type of map + * @return map + */ + public static T notEmpty(T value, String argumentName) { + notNull(value, argumentName); + if (value.size() == 0) { + throw new IllegalArgumentException(argumentName + " can't be empty"); + } + return value; + } + /** * Throws IllegalArgumentException if the collection contains null elements (or is null), otherwise returns * the collection. diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 7de0c1986..fca86c5eb 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -211,7 +211,19 @@ public void loadDataset() throws Exception { datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/person.csv")).get(); } - @Test(groups = "dataset", dependsOnMethods = "loadDataset") + @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) + public void loadDatasetBatch() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + + final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); + personManifest.setSource(getClass().getResourceAsStream("/person.csv")); + final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); + cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); + + datasetService.loadDatasets(project, personManifest, cityManifest).get(); + } + + @Test(groups = "dataset", dependsOnMethods = "loadDatasetBatch") public void updateData() { final DatasetService datasetService = gd.getDatasetService(); datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index 86036ec75..caf9523d0 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -80,4 +80,16 @@ public void shouldFailOnMultiPopulates() throws Exception { )); manifest.setMapping("col", "attr2"); } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void shouldFailOnSetSourceNull() { + final DatasetManifest manifest = new DatasetManifest("dataset.name"); + manifest.setSource(null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void shouldFailOnSetFileNull() { + final DatasetManifest manifest = new DatasetManifest("dataset.name"); + manifest.setFile(null); + } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 2ea9a3002..0fa014bf4 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -9,6 +9,7 @@ import org.testng.annotations.Test; import java.io.ByteArrayInputStream; +import java.io.InputStream; import java.io.IOException; import java.util.Collection; @@ -69,6 +70,25 @@ public void shouldLoadDataset() throws Exception { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); } + @Test + public void shouldLoadDatasets() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(202) + .withBody(readResource("/dataset/pullTask.json")) + .thenRespond() + .withStatus(200) + .withBody(readResource("/dataset/pullTaskStatusOk.json")); + + final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final InputStream source = new ByteArrayInputStream(new byte[]{}); + manifest.setSource(source); + + gd.getDatasetService().loadDatasets(project, manifest).get(); + + } + @Test public void shouldFailLoading() throws Exception { onRequest() @@ -81,7 +101,7 @@ public void shouldFailLoading() throws Exception { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load dataset dataset.person failed: status: ERROR")); + assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: status: ERROR")); } } @@ -110,7 +130,7 @@ public void shouldReadErrorMessages() throws Exception { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load dataset dataset.person failed: [Very error indeed, 1 errors occured during csv import]")); + assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: [Very error indeed, 1 errors occured during csv import]")); } } diff --git a/src/test/resources/city.csv b/src/test/resources/city.csv new file mode 100644 index 000000000..96efde2ed --- /dev/null +++ b/src/test/resources/city.csv @@ -0,0 +1,3 @@ +f_city.nm_name +Brno +Praha \ No newline at end of file diff --git a/src/test/resources/person.json b/src/test/resources/person.json index de783f621..cf7c6c1c2 100644 --- a/src/test/resources/person.json +++ b/src/test/resources/person.json @@ -65,6 +65,27 @@ } ] } + }, + { + "dataset": { + "identifier": "dataset.city", + "title": "Person", + "description": "Dataset with City-related data", + "anchor": { + "attribute": { + "identifier": "attr.city.name", + "title": "City Name", + "labels": [ + { + "label": { + "identifier": "label.city.name", + "title": "City Name" + } + } + ] + } + } + } } ] } From ec9a206a9b214bead6eaced1ee4bd721ad43e5d5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 30 Jan 2015 22:08:39 +0100 Subject: [PATCH 0144/1191] chg: preserve original text in GoodDataRestException --- .../com/gooddata/GoodDataRestException.java | 12 +++- .../gooddata/GoodDataRestExceptionTest.java | 61 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/gooddata/GoodDataRestExceptionTest.java diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 398bc14cb..7d117f05f 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -18,6 +18,8 @@ public class GoodDataRestException extends GoodDataException { private final String errorClass; + private final String text; + /** * Construct a GoodDataRestException with specified details. * @@ -29,11 +31,12 @@ public class GoodDataRestException extends GoodDataException { */ public GoodDataRestException(int statusCode, String requestId, String message, String component, String errorClass) { - super(statusCode + (requestId != null ? ": [requestId=" + requestId + "] " : "") + message); + super(statusCode + (requestId != null ? ": [requestId=" + requestId + "] " : ": ") + message); this.statusCode = statusCode; this.requestId = requestId; this.component = component; this.errorClass = errorClass; + this.text = message; } /** @@ -88,4 +91,11 @@ public String getErrorClass() { return errorClass; } + /** + * Text message describing the error + * @return text message + */ + public String getText() { + return text; + } } diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java new file mode 100644 index 000000000..1f67fb2ee --- /dev/null +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -0,0 +1,61 @@ +package com.gooddata; + +import com.gooddata.gdc.GdcError; +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.testng.Assert.*; + +public class GoodDataRestExceptionTest { + @Test + public void shouldCreateDefaultInstance() throws Exception { + final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", "component", "gdc.error"); + assertThat(e.getMessage(), is("500: [requestId=a123] message")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getRequestId(), is("a123")); + assertThat(e.getText(), is("message")); + assertThat(e.getComponent(), is("component")); + assertThat(e.getErrorClass(), is("gdc.error")); + } + + @Test + public void shouldCreateInstanceWithoutRequestId() throws Exception { + final GoodDataRestException e = new GoodDataRestException(500, null, "message", "component", "gdc.error"); + assertThat(e.getMessage(), is("500: message")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getText(), is("message")); + assertThat(e.getComponent(), is("component")); + assertThat(e.getErrorClass(), is("gdc.error")); + } + + @Test + public void shouldCreateInstanceWithNullGdcError() throws Exception { + final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", null); + assertThat(e.getMessage(), is("500: [requestId=a123] message")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getRequestId(), is("a123")); + assertThat(e.getText(), is("message")); + } + + @Test + public void shouldCreateInstanceWithGdcError() throws Exception { + final InputStream inputStream = getClass().getResourceAsStream("/gdc/gdcError.json"); + final GdcError err = new ObjectMapper().readValue(inputStream, GdcError.class); + + final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", err); + assertThat(e.getMessage(), is("500: [requestId=REQ] MSG")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getText(), is("MSG")); + assertThat(e.getErrorClass(), is("CLASS")); + assertThat(e.getComponent(), is("COMPONENT")); + assertThat(e.getRequestId(), is("REQ")); + + } +} \ No newline at end of file From 4576bcb698acf6455539a8468fcb39215815774e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 3 Apr 2015 14:50:56 +0200 Subject: [PATCH 0145/1191] add: acceptance tests, readme and small fixes --- CONTRIBUTE.md => CONTRIBUTING.md | 9 ++++++--- README.md | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) rename CONTRIBUTE.md => CONTRIBUTING.md (87%) diff --git a/CONTRIBUTE.md b/CONTRIBUTING.md similarity index 87% rename from CONTRIBUTE.md rename to CONTRIBUTING.md index 64e84dffa..c15ff209c 100644 --- a/CONTRIBUTE.md +++ b/CONTRIBUTING.md @@ -24,25 +24,28 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); ``` * Put _Jackson_ annotations on getters rather then on fields. * Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed in related service. -* Test all DTOs using _[JsonUnit`](https://github.com/lukas-krecan/JsonUnit)_. TODO -- this is questionable, because almost nothing is tested by JsonUnit now. +* Test all DTOs using _[JsonUnit](https://github.com/lukas-krecan/JsonUnit)_. ### Enums * Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use them when deserializing**. * Where make sense, use overloaded methods with an enum argument as well as `String` argument. ### Services -* When programming client for some polling return [`FutureResult`](src/main/java/com/gooddata/FutureResult.java)` to enable user asynchronous call. -* Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java)` when you feel the case is specific enough. +* When programming client for some polling return [`FutureResult`](src/main/java/com/gooddata/FutureResult.java) to enable user asynchronous call. +* Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java) when you feel the case is specific enough. * Prefer DTOs to `String` or primitive arguments. * **Method naming**: * `get*()` when searching form single object (throw exception when no or multiple objects are found, never return `null`) * `find*()` when searching for multiple objects (collection of objects, never return `null`) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` * Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. +* If it is possible write **acceptance tests** to be run with the real backend. +* Update [`README`](README.md) with usage examples. ## Best practices * **Test class naming**: * `*Test` unit tests * `*IT` integration tests (see [`AbstractGoodDataIT`](src/test/java/com/gooddata/AbstractGoodDataIT.java)) + * `*AT` acceptance tests * Everything public should be **documented** using _javadoc_. * When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. diff --git a/README.md b/README.md index 91519196a..9cf407220 100644 --- a/README.md +++ b/README.md @@ -121,4 +121,4 @@ processService.getExecutionLog(executionDetail, new FileOutputStream("file/where ##Contribute Missing functionality? Found a BUG? -Please create an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTE.md). +Please create an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTING.md). From 48ea7f5ab55d1f29093205cec087b1303c181325 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 1 Dec 2014 08:50:57 +0100 Subject: [PATCH 0146/1191] extend ProcessServiceTest --- .../dataload/processes/ProcessService.java | 37 +++-- .../processes/ProcessServiceTest.java | 153 ++++++++++++++++-- 2 files changed, 166 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index f3a1cc0a4..b2d2e1b5c 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -1,26 +1,23 @@ package com.gooddata.dataload.processes; -import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; -import static java.util.Collections.emptyList; - -import com.gooddata.AbstractService; import com.gooddata.AbstractPollHandler; +import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.account.AccountService; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; import com.gooddata.gdc.DataStoreService; -import com.gooddata.util.ZipUtils; -import com.gooddata.account.AccountService; import com.gooddata.project.Project; +import com.gooddata.util.ZipUtils; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; @@ -37,6 +34,10 @@ import java.net.URI; import java.util.Collection; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static java.util.Collections.emptyList; + /** * Service to manage dataload processes and process executions. */ @@ -235,7 +236,9 @@ public void handlePollResult(Void pollResult) { } } }); - }/** + } + + /** * Create new schedule with given data by given project. * * @param project project to which the process belongs @@ -263,7 +266,12 @@ public Schedule updateSchedule(final Project project, Schedule schedule) { final String uri = getScheduleUri(project, schedule.getId()).toString(); try { - return restTemplate.exchange(uri, HttpMethod.PUT, new HttpEntity<>(schedule), Schedule.class).getBody(); + final ResponseEntity response = restTemplate + .exchange(uri, HttpMethod.PUT, new HttpEntity<>(schedule), Schedule.class); + if (response == null) { + throw new GoodDataException("Unable to update schedule. No response returned from API."); + } + return response.getBody(); } catch (GoodDataRestException e) { if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { throw new ScheduleNotFoundException(uri, e); @@ -380,7 +388,9 @@ private Schedule postSchedule(Schedule schedule, URI postUri) { private Collection listProcesses(URI uri) { try { final DataloadProcesses processes = restTemplate.getForObject(uri, DataloadProcesses.class); - if (processes == null || processes.getItems() == null) { + if (processes == null) { + throw new GoodDataException("empty response from API call"); + } else if (processes.getItems() == null) { return emptyList(); } return processes.getItems(); @@ -430,7 +440,12 @@ private DataloadProcess postProcess(DataloadProcess process, File processData, U } try { - return restTemplate.exchange(postUri, method, new HttpEntity<>(processToSend), DataloadProcess.class).getBody(); + final ResponseEntity response = restTemplate + .exchange(postUri, method, new HttpEntity<>(processToSend), DataloadProcess.class); + if (response == null) { + throw new GoodDataException("Unable to post dataload process. No response returned from API."); + } + return response.getBody(); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to post dataload process.", e); } finally { diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 98b2054ce..1a7295701 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -1,12 +1,11 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; -import static org.mockito.Matchers.anyString; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.notNull; -import static org.mockito.Mockito.*; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; - +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.account.Account; import com.gooddata.account.AccountService; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; @@ -18,6 +17,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -26,21 +26,45 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.net.URI; +import java.util.Collection; +import java.util.Collections; import java.util.Random; +import static java.net.URI.create; +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Matchers.notNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + public class ProcessServiceTest { + private static final String PROCESS_ID = "PROCESS_ID"; private static final String PROJECT_ID = "PROJECT_ID"; + private static final String ACCOUNT_ID = "ACCOUNT_ID"; + private static final String PROCESS_URI = "/gdc/projects/PROJECT_ID/dataload/processes/PROCESS_ID"; + private static final String USER_PROCESS_URI = "/gdc/account/profile/ACCOUNT_ID/dataload/processes"; + @Mock + private DataloadProcess process; @Mock private RestTemplate restTemplate; - @Mock private AccountService accountService; - + @Mock + private Account account; @Mock private DataStoreService dataStoreService; - @Mock private Project project; @@ -50,8 +74,10 @@ public class ProcessServiceTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); processService = new ProcessService(restTemplate, accountService, dataStoreService); + when(process.getId()).thenReturn(PROCESS_ID); when(project.getId()).thenReturn(PROJECT_ID); - + when(accountService.getCurrent()).thenReturn(account); + when(account.getId()).thenReturn(ACCOUNT_ID); } @Test @@ -78,7 +104,7 @@ public void testCreateProcessLargerThan1MB() throws Exception { final DataloadProcess process = new DataloadProcess("test", ProcessType.GRAPH); - when(dataStoreService.getUri(anyString())).thenReturn(URI.create("URI")); + when(dataStoreService.getUri(anyString())).thenReturn(create("URI")); when(restTemplate.exchange(any(URI.class), eq(HttpMethod.POST), eq(new HttpEntity<>(process)), eq(DataloadProcess.class))) .thenReturn(new ResponseEntity<>(process, HttpStatus.CREATED)); @@ -104,4 +130,105 @@ private static File createProcessOfSize(int size) throws Exception { return file; } -} \ No newline at end of file + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUpdateProcessWithNullProject() throws Exception { + processService.updateProcess(null, process, File.createTempFile("test", null)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUpdateProcessWithNullProcess() throws Exception { + processService.updateProcess(project, null, File.createTempFile("test", null)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUpdateProcessWithNullFile() throws Exception { + processService.updateProcess(project, process, null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testUpdateProcessWithRestClientError() throws Exception { + when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), + eq(DataloadProcess.class))).thenThrow(new RestClientException("")); + processService.updateProcess(project, process, File.createTempFile("test", null)); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testUpdateProcessWithNoApiResponse() throws Exception { + when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), + eq(DataloadProcess.class))).thenReturn(null); + processService.updateProcess(project, process, File.createTempFile("test", null)); + } + + @Test + public void testUpdateProcess() throws Exception { + when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), + eq(DataloadProcess.class))).thenReturn(new ResponseEntity<>(process, HttpStatus.OK)); + final DataloadProcess result = processService + .updateProcess(project, process, File.createTempFile("test", null)); + assertThat(result, is(process)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetProcessByUriWithNullUri() throws Exception { + processService.getProcessByUri(null); + } + + @Test + public void testGetProcessByUri() throws Exception { + when(restTemplate.getForObject(PROCESS_URI, DataloadProcess.class)).thenReturn(process); + + final DataloadProcess result = processService.getProcessByUri(PROCESS_URI); + assertThat(result, is(process)); + } + + @Test(expectedExceptions = ProcessNotFoundException.class) + public void testGetProcessByUriNotFound() throws Exception { + when(restTemplate.getForObject(PROCESS_URI, DataloadProcess.class)).thenThrow( + new GoodDataRestException(404, "", "", "", "")); + processService.getProcessByUri(PROCESS_URI); + } + + @Test(expectedExceptions = GoodDataRestException.class) + public void testGetProcessByUriServerError() throws Exception { + when(restTemplate.getForObject(PROCESS_URI, DataloadProcess.class)) + .thenThrow(new GoodDataRestException(500, "", "", "", "")); + processService.getProcessByUri(PROCESS_URI); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetProcessByUriClientError() throws Exception { + when(restTemplate.getForObject(PROCESS_URI, DataloadProcess.class)).thenThrow(new RestClientException("")); + processService.getProcessByUri(PROCESS_URI); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListUserProcessesWithRestClientError() throws Exception { + when(restTemplate.getForObject(create(USER_PROCESS_URI), DataloadProcesses.class)) + .thenThrow(new RestClientException("")); + processService.listUserProcesses(); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListUserProcessesWithNullResponse() throws Exception { + when(restTemplate.getForObject(create(USER_PROCESS_URI), DataloadProcesses.class)).thenReturn(null); + processService.listUserProcesses(); + } + + @Test + public void testListUserProcessesWithNoProcesses() throws Exception { + when(restTemplate.getForObject(create(USER_PROCESS_URI), DataloadProcesses.class)) + .thenReturn(new DataloadProcesses(Collections.emptyList())); + final Collection result = processService.listUserProcesses(); + assertThat(result, empty()); + } + + @Test + public void testListUserProcessesWithOneProcesses() throws Exception { + when(restTemplate.getForObject(create(USER_PROCESS_URI), DataloadProcesses.class)) + .thenReturn(new DataloadProcesses(asList(process))); + final Collection result = processService.listUserProcesses(); + assertThat(result, hasSize(1)); + assertThat(result, contains(process)); + } +} From 2921dee4f2e9d1d0687720cf03662440f20305fd Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 1 Dec 2014 16:21:22 +0100 Subject: [PATCH 0147/1191] add DatasetServiceTest --- .../com/gooddata/dataset/DatasetService.java | 4 +- .../gooddata/dataset/DatasetServiceTest.java | 175 ++++++++++++++++++ 2 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/gooddata/dataset/DatasetServiceTest.java diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index d4ba0d571..ef68379e0 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -192,7 +192,9 @@ public Collection listDatasets(Project project) { notNull(project, "project"); try { final Datasets result = restTemplate.getForObject(Datasets.URI, Datasets.class, project.getId()); - if (result == null || result.getLinks() == null) { + if (result == null) { + throw new GoodDataException("Empty response from API call"); + } else if (result.getLinks() == null) { return emptyList(); } return result.getLinks(); diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java new file mode 100644 index 000000000..f09a0754a --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.DataStoreException; +import com.gooddata.gdc.DataStoreService; +import com.gooddata.project.Project; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collection; + +import static java.util.Arrays.asList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class DatasetServiceTest { + + private static final String PROJECT_ID = "17"; + private static final String DATASET_ID = "11"; + + @Mock + private RestTemplate restTemplate; + @Mock + private DataStoreService dataStoreService; + @Mock + private Project project; + @Mock + private Dataset dataset; + @Mock + private DatasetManifest manifest; + @Mock + private InputStream stream; + + private DatasetService service; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new DatasetService(restTemplate, dataStoreService); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetDatasetManifestWithNullProject() throws Exception { + service.getDatasetManifest(null, DATASET_ID); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetDatasetManifestWithNullId() throws Exception { + service.getDatasetManifest(project, null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetDatasetManifestWithEmptyId() throws Exception { + service.getDatasetManifest(project, ""); + } + + @Test + public void testGetDatasetManifest() throws Exception { + when(restTemplate.getForObject(DatasetManifest.URI, DatasetManifest.class, PROJECT_ID, DATASET_ID)) + .thenReturn(manifest); + final DatasetManifest result = service.getDatasetManifest(project, DATASET_ID); + + assertThat(result, is(manifest)); + } + + @Test(expectedExceptions = DatasetNotFoundException.class) + public void testGetDatasetManifestWhenNotFound() throws Exception { + when(restTemplate.getForObject(DatasetManifest.URI, DatasetManifest.class, PROJECT_ID, DATASET_ID)) + .thenThrow(new GoodDataRestException(404, "", "", "", "")); + service.getDatasetManifest(project, DATASET_ID); + } + + @Test(expectedExceptions = DatasetException.class) + public void testGetDatasetManifestWhenRestClientError() throws Exception { + when(restTemplate.getForObject(DatasetManifest.URI, DatasetManifest.class, PROJECT_ID, DATASET_ID)) + .thenThrow(new RestClientException("")); + service.getDatasetManifest(project, DATASET_ID); + } + + @Test(expectedExceptions = DatasetException.class) + public void testGetDatasetManifestWhenOtherError() throws Exception { + when(restTemplate.getForObject(DatasetManifest.URI, DatasetManifest.class, PROJECT_ID, DATASET_ID)) + .thenThrow(new GoodDataRestException(500, "", "", "", "")); + service.getDatasetManifest(project, DATASET_ID); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetWithNullProject() throws Exception { + service.loadDataset(null, manifest, stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetWithNullManifest() throws Exception { + final DatasetManifest nullManifest = null; + service.loadDataset(project, nullManifest, stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetWithNullDataset() throws Exception { + service.loadDataset(project, manifest, null); + } + + @Test(expectedExceptions = DatasetException.class) + public void testLoadDatasetWhenUploadFails() throws Exception { + doThrow(DataStoreException.class).when(dataStoreService).upload(anyString(), eq(stream)); + when(manifest.getFile()).thenReturn(""); + service.loadDataset(project, manifest, stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetByIdWithNullProject() throws Exception { + service.loadDataset(null, DATASET_ID, stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetByIdWithNullId() throws Exception { + final String nullId = null; + service.loadDataset(project, nullId, stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetByIdWithEmptyId() throws Exception { + service.loadDataset(project, "", stream); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testLoadDatasetByIdWithNullInputStream() throws Exception { + service.loadDataset(project, DATASET_ID, null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testListDatasetsWithNullProject() throws Exception { + service.listDatasets(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListDatasetsWithNullResponse() throws Exception { + when(restTemplate.getForObject(Datasets.URI, Dataset.class, PROJECT_ID)).thenReturn(null); + service.listDatasets(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListDatasetsWithRestClientError() throws Exception { + when(restTemplate.getForObject(Datasets.URI, Dataset.class, PROJECT_ID)).thenThrow(new RestClientException("")); + service.listDatasets(project); + } + + @Test + public void testListDatasetsWithEmptyResponse() throws Exception { + final Datasets datasets = mock(Datasets.class); + when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); + when(datasets.getLinks()).thenReturn(asList(dataset)); + + final Collection result = service.listDatasets(project); + assertThat(result, hasSize(1)); + assertThat(result, contains(dataset)); + } +} \ No newline at end of file From 40f7ce44178177ed30e75f6ca3ed11dcaa751abe Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 5 Dec 2014 09:09:24 +0100 Subject: [PATCH 0148/1191] extend MetadataServiceIT --- .../java/com/gooddata/AbstractGoodDataIT.java | 9 +- .../com/gooddata/md/MetadataServiceIT.java | 141 +++++++++++++++++- src/test/java/com/gooddata/md/MetricTest.java | 2 +- src/test/resources/md/metric-input.json | 2 +- 4 files changed, 148 insertions(+), 6 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 08e51f0a8..3e222f6c7 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -12,12 +12,14 @@ import java.io.InputStream; import static com.gooddata.util.Validate.notNull; -import static net.jadler.Jadler.*; +import static net.jadler.Jadler.closeJadler; +import static net.jadler.Jadler.initJadler; +import static net.jadler.Jadler.port; public abstract class AbstractGoodDataIT { protected static final ObjectMapper MAPPER = new ObjectMapper(); - protected GoodData gd; + protected GoodData gd; @BeforeMethod public void commonSetUp() { @@ -25,7 +27,8 @@ public void commonSetUp() { gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http") { @Override protected HttpClient createHttpClient(final String login, final String password, final String hostname, - final int port, final String protocol, final HttpClientBuilder builder) { + final int port, final String protocol, + final HttpClientBuilder builder) { return builder.build(); } }; diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 31717758a..403637052 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -1,6 +1,10 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.gooddata.AbstractGoodDataIT; +import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; import org.testng.annotations.BeforeClass; @@ -12,23 +16,29 @@ import java.util.List; import static net.jadler.Jadler.onRequest; +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.contains; +import static org.hamcrest.Matchers.hasSize; public class MetadataServiceIT extends AbstractGoodDataIT { private static final String USEDBY_URI = "/gdc/md/PROJECT_ID/usedby2"; private static final String IDENTIFIERS_URI = "/gdc/md/PROJECT_ID/identifiers"; - private static final String OBJ_URI = "OBJ_URI"; + private static final String OBJ_URI = "/gdc/md/PROJECT_ID/obj"; + private static final String SPECIFIC_OBJ_URI = "/gdc/md/PROJECT_ID/obj/ID"; private static final String ID = "ID"; private static final String TITLE = "TITLE"; private Project project; + private Metric metricInput; @BeforeClass public void setUp() throws Exception { project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + metricInput = MAPPER.readValue(readResource("/md/metric-input.json"), Metric.class); } @Test @@ -71,4 +81,133 @@ public void testFindIdentifierUris() throws IOException { assertThat(uris.size(), is(1)); assertThat(uris.iterator().next(), is(OBJ_URI)); } + + @Test + public void shouldCreateObj() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(OBJ_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(readResource("/md/metric.json")); + + final Obj result = gd.getMetadataService().createObj(project, metricInput); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(Metric.class))); + assertThat(((Metric) result).getTitle(), is("Person Name")); + assertThat(((Metric) result).getFormat(), is("FORMAT")); + } + + @Test + public void shouldGetObjByUri() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(readResource("/md/metric.json")); + + final Obj result = gd.getMetadataService().getObjByUri(SPECIFIC_OBJ_URI, Metric.class); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(Metric.class))); + assertThat(((Metric) result).getTitle(), is("Person Name")); + assertThat(((Metric) result).getFormat(), is("FORMAT")); + } + + @Test + public void shouldGetObjById() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(readResource("/md/metric.json")); + + final Obj result = gd.getMetadataService().getObjById(project, ID, Metric.class); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(Metric.class))); + assertThat(result.getUri(), is("/gdc/md/PROJECT_ID/obj/DF_ID")); + assertThat(((Metric) result).getTitle(), is("Person Name")); + assertThat(((Metric) result).getFormat(), is("FORMAT")); + } + + @Test + public void shouldGetObjUriByRestrictions() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") + .respond() + .withStatus(200) + .withBody(readResource("/md/query.json")); + + final String result = gd.getMetadataService().getObjUri(project, Attribute.class, Restriction.title("Resource")); + + assertThat(result, is(notNullValue())); + assertThat(result, is("/gdc/md/PROJ_ID/obj/127")); + } + + @Test + public void shouldGetObjByRestrictions() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") + .respond() + .withStatus(200) + .withBody(readResource("/md/query.json")); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJ_ID/obj/118") + .respond() + .withStatus(200) + .withBody(readResource("/md/attribute.json")); + + final Obj result = gd.getMetadataService().getObj(project, Attribute.class, Restriction.title("Name")); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(Attribute.class))); + assertThat(result.getUri(), is("/gdc/md/PROJECT_ID/obj/28")); + assertThat(((Attribute) result).getTitle(), is("Person ID")); + } + + @Test + public void shouldFindByRestrictions() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") + .respond() + .withStatus(200) + .withBody(readResource("/md/query.json")); + + final Collection result = gd.getMetadataService() + .find(project, Attribute.class, Restriction.summary("")); + + assertThat(result, is(notNullValue())); + assertThat(result, hasSize(2)); + } + + @Test + public void shouldFindUrisByRestrictions() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") + .respond() + .withStatus(200) + .withBody(readResource("/md/query.json")); + + final Collection result = gd.getMetadataService() + .findUris(project, Attribute.class, Restriction.summary("")); + + assertThat(result, is(notNullValue())); + assertThat(result, hasSize(2)); + assertThat(result, contains("/gdc/md/PROJ_ID/obj/127", "/gdc/md/PROJ_ID/obj/118")); + } } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 1add67f48..79c07b603 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -23,7 +23,7 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { - final Metric metric = new Metric("Person Name", "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", "FORMAT"); + final Metric metric = new Metric("Person Name", "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", "FORMAT"); assertThat(metric, serializesToJson("/md/metric-input.json")); } diff --git a/src/test/resources/md/metric-input.json b/src/test/resources/md/metric-input.json index 85a17e7bb..50731c554 100644 --- a/src/test/resources/md/metric-input.json +++ b/src/test/resources/md/metric-input.json @@ -1,7 +1,7 @@ { "metric" : { "content" : { - "expression" : "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", + "expression" : "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", "format" : "FORMAT" }, "meta" : { From 8e87d56ec6dff290696c92445bba0fab72e7ba16 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Fri, 3 Apr 2015 16:07:50 +0200 Subject: [PATCH 0149/1191] Make PageableList implement List interface --- .../gooddata/collections/PageableList.java | 129 ++++++++++++++++-- .../collections/PageableListDeserializer.java | 51 +++++++ .../dataload/processes/Schedules.java | 7 +- .../processes/SchedulesDeserializer.java | 18 +++ src/test/java/com/gooddata/ShowcaseAT.java | 3 +- .../collections/PageableListTest.java | 12 +- .../dataload/processes/ProcessServiceIT.java | 5 +- .../dataload/processes/SchedulesTest.java | 16 +-- 8 files changed, 209 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/gooddata/collections/PageableListDeserializer.java create mode 100644 src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java index f98071abf..ad0900ec8 100644 --- a/src/main/java/com/gooddata/collections/PageableList.java +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -1,7 +1,10 @@ package com.gooddata.collections; +import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; +import java.util.ListIterator; import static com.gooddata.util.Validate.notNull; @@ -10,7 +13,7 @@ * * @param type of collection elements */ -public class PageableList { +public class PageableList implements List { private final List items; private final Paging paging; @@ -33,15 +36,6 @@ public PageableList(final List items, final Paging paging) { this.paging = paging; } - /** - * Return page items. - * - * @return page items - */ - public List getItems() { - return items; - } - /** * Returns description of the next page. * @@ -50,4 +44,119 @@ public List getItems() { public Page getNextPage() { return paging == null ? null : paging.getNext(); } + + @Override + public int size() { + return items.size(); + } + + @Override + public boolean isEmpty() { + return items.isEmpty(); + } + + @Override + public boolean contains(final Object o) { + return items.contains(o); + } + + @Override + public Iterator iterator() { + return items.iterator(); + } + + @Override + public Object[] toArray() { + return items.toArray(); + } + + @Override + public T[] toArray(final T[] a) { + return items.toArray(a); + } + + @Override + public boolean add(final E e) { + return items.add(e); + } + + @Override + public boolean remove(final Object o) { + return items.remove(o); + } + + @Override + public boolean containsAll(final Collection c) { + return items.containsAll(c); + } + + @Override + public boolean addAll(final Collection c) { + return items.addAll(c); + } + + @Override + public boolean addAll(final int index, final Collection c) { + return items.addAll(index, c); + } + + @Override + public boolean removeAll(final Collection c) { + return items.removeAll(c); + } + + @Override + public boolean retainAll(final Collection c) { + return items.retainAll(c); + } + + @Override + public void clear() { + items.clear(); + } + + @Override + public E get(final int index) { + return items.get(index); + } + + @Override + public E set(final int index, final E element) { + return items.set(index, element); + } + + @Override + public void add(final int index, final E element) { + items.add(index, element); + } + + @Override + public E remove(final int index) { + return items.remove(index); + } + + @Override + public int indexOf(final Object o) { + return items.indexOf(o); + } + + @Override + public int lastIndexOf(final Object o) { + return items.lastIndexOf(o); + } + + @Override + public ListIterator listIterator() { + return items.listIterator(); + } + + @Override + public ListIterator listIterator(final int index) { + return items.listIterator(index); + } + + @Override + public List subList(final int fromIndex, final int toIndex) { + return items.subList(fromIndex, toIndex); + } } diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java new file mode 100644 index 000000000..08e287ea5 --- /dev/null +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -0,0 +1,51 @@ +package com.gooddata.collections; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.JsonProcessingException; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.ObjectMapper; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public abstract class PageableListDeserializer extends JsonDeserializer { + + private final Class elementType; + + protected PageableListDeserializer(final Class elementType) { + this.elementType = elementType; + } + + protected abstract T createList(final List items, final Paging paging); + + @Override + public T deserialize(final JsonParser jp, final DeserializationContext context) throws IOException, JsonProcessingException { + final JsonNode root = jp.readValueAsTree(); + if (root == null || root.isNull()) { + return null; + } + + // codec should be always instance of ObjectMapper so this cast should be safe + // we do not want to create custom object mapper with different configuration than the global one has + final ObjectMapper objectMapper = (ObjectMapper) jp.getCodec(); + + final JsonNode pagingNode = root.get("paging"); + final Paging paging = pagingNode == null ? null : objectMapper.readValue(pagingNode, Paging.class); + + final JsonNode itemsNode = root.get("items"); + final List items; + if (itemsNode == null) { + items = Collections.emptyList(); + } else { + items = new ArrayList<>(itemsNode.size()); + for (JsonNode item : itemsNode) { + items.add(objectMapper.readValue(item, elementType)); + } + } + return createList(items, paging); + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/Schedules.java b/src/main/java/com/gooddata/dataload/processes/Schedules.java index 4d7e0dd2c..25e283cbd 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedules.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedules.java @@ -5,11 +5,10 @@ import com.gooddata.collections.PageableList; import com.gooddata.collections.Paging; -import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.springframework.web.util.UriTemplate; import java.util.List; @@ -20,12 +19,12 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("schedules") @JsonIgnoreProperties(ignoreUnknown = true) +@JsonDeserialize(using = SchedulesDeserializer.class) class Schedules extends PageableList { public static final String URI = "/gdc/projects/{projectId}/schedules"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); - @JsonCreator - Schedules(@JsonProperty("items") final List items, @JsonProperty("paging") final Paging paging) { + Schedules(final List items, final Paging paging) { super(items, paging); } } diff --git a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java new file mode 100644 index 000000000..d981acd07 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java @@ -0,0 +1,18 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.collections.PageableListDeserializer; +import com.gooddata.collections.Paging; + +import java.util.List; + +class SchedulesDeserializer extends PageableListDeserializer { + + protected SchedulesDeserializer() { + super(Schedule.class); + } + + @Override + protected Schedules createList(final List items, final Paging paging) { + return new Schedules(items, paging); + } +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 78fe31309..a58bfd97f 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -268,7 +268,8 @@ public void createProcess() throws Exception { assertThat(schedule.getExecutable(), is("sdktest.grf")); final PageableList collection = gd.getProcessService().listSchedules(project); - assertThat(collection.getItems(), hasSize(1)); + assertThat(collection, notNullValue()); + assertThat(collection, hasSize(1)); assertThat(collection.getNextPage(), nullValue()); schedule.setState(ScheduleState.DISABLED); diff --git a/src/test/java/com/gooddata/collections/PageableListTest.java b/src/test/java/com/gooddata/collections/PageableListTest.java index f87a230de..87b618433 100644 --- a/src/test/java/com/gooddata/collections/PageableListTest.java +++ b/src/test/java/com/gooddata/collections/PageableListTest.java @@ -16,24 +16,24 @@ public class PageableListTest { @Test public void testCollectionEmpty() { final PageableList collection = new PageableList<>(); - assertThat(collection.getItems(), notNullValue()); - assertThat(collection.getItems(), empty()); + assertThat(collection, notNullValue()); + assertThat(collection, empty()); assertThat(collection.getNextPage(), nullValue()); } @Test public void testCollection() { final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), null); - assertThat(collection.getItems(), notNullValue()); - assertThat(collection.getItems(), hasSize(3)); + assertThat(collection, notNullValue()); + assertThat(collection, hasSize(3)); assertThat(collection.getNextPage(), nullValue()); } @Test public void testCollectionWithPaging() { final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), new Paging(1, 2, "next")); - assertThat(collection.getItems(), notNullValue()); - assertThat(collection.getItems(), hasSize(3)); + assertThat(collection, notNullValue()); + assertThat(collection, hasSize(3)); assertThat(collection.getNextPage(), notNullValue()); assertThat(collection.getNextPage().getPageUri(null).toString(), is("next")); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 589497ce0..5e31bce63 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -5,7 +5,6 @@ import com.gooddata.collections.PageableList; import com.gooddata.project.Project; import org.codehaus.jackson.map.ObjectMapper; -import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -241,13 +240,13 @@ public void shouldListPagedSchedules() throws Exception { final PageableList firstPage = gd.getProcessService().listSchedules(project); assertThat(firstPage, notNullValue()); - assertThat(firstPage.getItems(), Matchers.hasSize(1)); + assertThat(firstPage, hasSize(1)); assertThat(firstPage.getNextPage(), notNullValue()); assertThat(firstPage.getNextPage().getPageUri(null).toString(), is("/gdc/projects/PROJECT_ID/schedules?offset=1&limit=1")); final PageableList secondPage = gd.getProcessService().listSchedules(project, firstPage.getNextPage()); assertThat(secondPage, notNullValue()); - assertThat(secondPage.getItems(), Matchers.hasSize(1)); + assertThat(secondPage, hasSize(1)); assertThat(secondPage.getNextPage(), nullValue()); } diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java index 8aaf4378e..062f1fc42 100644 --- a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -18,10 +18,10 @@ public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules.json"); final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); - assertThat(schedules.getItems(), notNullValue()); - assertThat(schedules.getItems(), hasSize(1)); - assertThat(schedules.getItems().get(0).getId(), is("schedule_id")); - assertThat(schedules.getItems().get(0).getType(), is("MSETL")); + assertThat(schedules, notNullValue()); + assertThat(schedules, hasSize(1)); + assertThat(schedules.get(0).getId(), is("schedule_id")); + assertThat(schedules.get(0).getType(), is("MSETL")); assertThat(schedules.getNextPage(), nullValue()); } @@ -30,10 +30,10 @@ public void testDeserializationPaging() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules_page1.json"); final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); - assertThat(schedules.getItems(), notNullValue()); - assertThat(schedules.getItems(), hasSize(1)); - assertThat(schedules.getItems().get(0).getId(), is("schedule_id_1")); - assertThat(schedules.getItems().get(0).getType(), is("MSETL")); + assertThat(schedules, notNullValue()); + assertThat(schedules, hasSize(1)); + assertThat(schedules.get(0).getId(), is("schedule_id_1")); + assertThat(schedules.get(0).getType(), is("MSETL")); assertThat(schedules.getNextPage(), notNullValue()); assertThat(schedules.getNextPage().getPageUri(null).toString(), is("/gdc/projects/PROJECT_ID/schedules?offset=1&limit=1")); } From 666d0e4986db8a5412de41f1383091fd8e8d7776 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 30 Jan 2015 23:22:16 +0100 Subject: [PATCH 0150/1191] fix: handle exceptions during polling --- .../java/com/gooddata/AbstractService.java | 9 ++++- src/main/java/com/gooddata/PollHandler.java | 8 ++++ .../java/com/gooddata/SimplePollHandler.java | 2 +- .../gooddata/connector/ConnectorService.java | 5 +++ .../processes/ProcessExecutionException.java | 12 ++++-- .../dataload/processes/ProcessService.java | 26 ++++++++---- .../com/gooddata/dataset/DatasetService.java | 15 +++++++ .../java/com/gooddata/gdc/UriResponse.java | 5 +++ .../java/com/gooddata/model/ModelService.java | 12 +++++- .../com/gooddata/project/ProjectService.java | 12 +++++- .../com/gooddata/report/ReportService.java | 15 +++++-- .../gooddata/warehouse/WarehouseService.java | 5 +++ src/test/java/com/gooddata/ShowcaseAT.java | 9 +++++ .../connector/ConnectorServiceIT.java | 15 +++++++ .../dataload/processes/ProcessServiceIT.java | 40 +++++++++++-------- .../gooddata/dataset/DatasetServiceIT.java | 11 +++++ .../com/gooddata/model/ModelServiceIT.java | 40 +++++++++++++++++++ .../gooddata/project/ProjectServiceIT.java | 3 +- .../com/gooddata/report/ReportServiceIT.java | 13 ++++++ .../warehouse/WarehouseServiceIT.java | 18 +++++++++ .../dataload/processes/testgraph/invalid.grf | 1 + 21 files changed, 239 insertions(+), 37 deletions(-) create mode 100644 src/test/resources/dataload/processes/testgraph/invalid.grf diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index dce4b92fe..a67f1d891 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -81,8 +81,13 @@ final R poll(final PollHandler handler, long timeout, final TimeUnit un final

boolean pollOnce(final PollHandler handler) { notNull(handler, "handler"); - final ClientHttpResponse response = restTemplate.execute(handler.getPollingUri(), GET, noopRequestCallback, - reusableResponseExtractor); + final ClientHttpResponse response; + try { + response = restTemplate.execute(handler.getPollingUri(), GET, noopRequestCallback, reusableResponseExtractor); + } catch (GoodDataRestException e) { + handler.handlePollException(e); + throw new GoodDataException("Handler " + handler.getClass().getName() + " didn't handle exception", e); + } try { if (handler.isFinished(response)) { diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index 85bf61922..b06b2ca8c 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -66,4 +66,12 @@ public interface PollHandler { * @param pollResult result of polling request */ void handlePollResult(P pollResult); + + /** + * Handle exception while polling. + * The implementing class should throw instance of {@link com.gooddata.GoodDataException} + * (or ancestor) with the given argument as cause. + * @param e the exception + */ + void handlePollException(GoodDataRestException e); } diff --git a/src/main/java/com/gooddata/SimplePollHandler.java b/src/main/java/com/gooddata/SimplePollHandler.java index d45677721..62fbdae1a 100644 --- a/src/main/java/com/gooddata/SimplePollHandler.java +++ b/src/main/java/com/gooddata/SimplePollHandler.java @@ -8,7 +8,7 @@ * * @see com.gooddata.FutureResult */ -public class SimplePollHandler extends AbstractPollHandler { +public abstract class SimplePollHandler extends AbstractPollHandler { /** * Creates a new instance of polling handler * diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 502c3b1aa..b36dcf62c 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -181,6 +181,11 @@ public void handlePollResult(final ProcessStatus pollResult) { pollResult.getStatus().getDescription()); } } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ConnectorException(connectorType + " process failed: " + e.getText(), e); + } }); } catch (GoodDataRestException | RestClientException e) { throw new ConnectorException("Unable to execute " + connectorType + " process", e); diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java index e107d5369..5f5120d01 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java @@ -7,7 +7,6 @@ */ public class ProcessExecutionException extends GoodDataException { - private ProcessExecutionDetail executionDetail; private String executionDetailUri; @@ -20,8 +19,7 @@ public ProcessExecutionException(String message, Throwable cause) { } public ProcessExecutionException(String message, ProcessExecutionDetail executionDetail) { - super(message); - this.executionDetail = executionDetail; + this(message, executionDetail, null); } public ProcessExecutionException(String message, Throwable cause, String executionDetailUri) { @@ -29,6 +27,14 @@ public ProcessExecutionException(String message, Throwable cause, String executi this.executionDetailUri = executionDetailUri; } + public ProcessExecutionException(final String message, final ProcessExecutionDetail executionDetail, final Throwable cause) { + super(message, cause); + this.executionDetail = executionDetail; + if (executionDetail != null) { + this.executionDetailUri = executionDetail.getUri(); + } + } + public ProcessExecutionDetail getExecutionDetail() { return executionDetail; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index b2d2e1b5c..c383e9948 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -222,19 +222,31 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { @Override public void handlePollResult(Void pollResult) { - ProcessExecutionDetail executionDetail; - try { - executionDetail = restTemplate.getForObject(detailLink, ProcessExecutionDetail.class); - } catch (GoodDataException | RestClientException e) { - throw new ProcessExecutionException("Execution finished, but cannot get its result.", e, detailLink); - } - + final ProcessExecutionDetail executionDetail = getProcessExecutionDetailByUri(detailLink); if (!executionDetail.isSuccess()) { throw new ProcessExecutionException("Execution was not successful", executionDetail); } else { setResult(executionDetail); } } + + @Override + public void handlePollException(final GoodDataRestException e) { + ProcessExecutionDetail detail = null; + try { + detail = getProcessExecutionDetailByUri(detailLink); + } catch (GoodDataException ignored) { } + throw new ProcessExecutionException("Can't execute " + e.getText(), detail, e); + } + + private ProcessExecutionDetail getProcessExecutionDetailByUri(final String uri) { + try { + return restTemplate.getForObject(uri, ProcessExecutionDetail.class); + } catch (GoodDataException | RestClientException e) { + throw new ProcessExecutionException("Execution finished, but cannot get its result.", e, uri); + } + } + }); } diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 78d018bc9..38575a7ee 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -197,6 +197,11 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { return finished; } + @Override + public void handlePollException(final GoodDataRestException e) { + throw new DatasetException("Unable to load", datasets, e); + } + @Override protected void onFinish() { try { @@ -302,6 +307,11 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException throw new GoodDataException("Unable to optimize SLI hash: " + maqlDdlTaskStatus.getMessages()); } + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Unable to optimize SLI hash: " + getPollingUri(), e); + } + }); } @@ -345,6 +355,11 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException } throw new GoodDataException(errorMessage + ": " + taskState.getMessage()); } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException(errorMessage + ": " + getPollingUri(), e); + } }); } diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index c9153914f..a7d17f8f7 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -25,4 +25,9 @@ public UriResponse(@JsonProperty("uri") String uri) { public String getUri() { return uri; } + + @Override + public String toString() { + return uri; + } } diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 68e054f08..3d85db050 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -41,7 +41,12 @@ private FutureResult getProjectModelDiff(Project project, DiffRequest try { final AsyncTask asyncTask = restTemplate .postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); - return new FutureResult<>(this, new SimplePollHandler(asyncTask.getUri(), ModelDiff.class)); + return new FutureResult<>(this, new SimplePollHandler(asyncTask.getUri(), ModelDiff.class) { + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ModelException("Unable to get project model diff", e); + } + }); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to get project model diff", e); } @@ -165,6 +170,11 @@ public boolean isFinished(final ClientHttpResponse response) throws IOException public void handlePollResult(MaqlDdlLinks pollResult) { setResult(null); } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ModelException("Unable to update project model", e); + } }); } diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index c9d2166b6..f92459556 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -101,9 +101,14 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { @Override protected void onFinish() { if (!getResult().isEnabled()) { - throw new GoodDataException("Created project is not enabled"); + throw new GoodDataException("Created project " + uri + " is not enabled"); } } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Creating project " + uri + " failed", e); + } }); } @@ -242,6 +247,11 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { @Override public void handlePollResult(final Void pollResult) { } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Project validation failed: " + getPollingUri(), e); + } }); } } diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index de4f963ae..89a08c232 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -6,6 +6,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.Report; @@ -80,12 +81,18 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { default: throw new ReportException("Unable to export report, unknown HTTP response code: " + response.getStatusCode()); } } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ReportException("Unable to export report", e); + } + @Override protected void onFinish() { try { restTemplate.execute(uri, GET, noopRequestCallback, new OutputStreamResponseExtractor(output)); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to export report", e); + throw new ReportException("Unable to export report", e); } } }); @@ -97,9 +104,9 @@ private JsonNode executeReport(final ReportRequest request) { .exchange(ReportRequest.URI, POST, new HttpEntity<>(request), String.class); return mapper.readTree(entity.getBody()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to execute report", e); + throw new ReportException("Unable to execute report", e); } catch (IOException e) { - throw new GoodDataException("Unable to read execution result", e); + throw new ReportException("Unable to read execution result", e); } } @@ -116,7 +123,7 @@ private String exportReport(final JsonNode execResult, final ReportExportFormat try { return restTemplate.postForObject(EXPORTING_URI, root, UriResponse.class).getUri(); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to export report", e); + throw new ReportException("Unable to export report", e); } } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index ea32e59f3..ce4902b2a 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -83,6 +83,11 @@ public void handlePollResult(WarehouseTask pollResult) { + pollResult.getWarehouseLink(), e); } } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Unable to create warehouse", e); + } }); } diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 059a99ab0..5589c8bc8 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -6,6 +6,7 @@ import com.gooddata.dataload.processes.DataloadProcess; import com.gooddata.dataload.processes.ProcessExecution; import com.gooddata.dataload.processes.ProcessExecutionDetail; +import com.gooddata.dataload.processes.ProcessExecutionException; import com.gooddata.dataload.processes.ProcessService; import com.gooddata.dataload.processes.ProcessType; import com.gooddata.dataset.DatasetManifest; @@ -272,6 +273,7 @@ public void createProcess() throws Exception { final File dir = createTempDirectory("sdktest").toFile(); try { copy("sdktest.grf", dir); + copy("invalid.grf", dir); copy("workspace.prm", dir); process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); @@ -316,6 +318,13 @@ public void executeProcess() throws Exception { containsString("errooooooor"), containsString("fataaaaaaal"))); } + @Test(groups = "process", dependsOnMethods = "createProcess", + expectedExceptions = ProcessExecutionException.class, expectedExceptionsMessageRegExp = "(?s)Can't execute.*") + public void failExecuteProcess() throws Exception { + ProcessService processService = gd.getProcessService(); + processService.executeProcess(new ProcessExecution(process, "invalid.grf")).get(); + } + @Test(dependsOnGroups = "process") public void removeProcess() throws Exception { gd.getProcessService().removeProcess(process); diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 0710833f7..013a36e10 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -114,6 +114,21 @@ public void shouldExecuteProcess() throws Exception { assertThat(process.getStatus().getCode(), is(SYNCHRONIZED.name())); } + @Test(expectedExceptions = ConnectorException.class, expectedExceptionsMessageRegExp = ".*process failed.*") + public void shouldFailExecuteProcessPolling() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") + .respond() + .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") + .respond() + .withStatus(400) + ; + connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); + } + @Test(expectedExceptions = GoodDataException.class) public void shouldFailExecuteProcess() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 5e31bce63..85c2b96c2 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -149,7 +149,20 @@ public void shouldGetExecutionLog() throws Exception { @Test public void shouldExecuteProcess() throws Exception { - mockExecutionRequests(); + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(EXECUTIONS_PATH) + .respond() + .withBody(readResource("/dataload/processes/executionTask.json")) + .withHeader("Location", EXECUTION_PATH) + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(EXECUTION_PATH) + .respond() + .withStatus(202) + .thenRespond() + .withStatus(204); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_DETAIL_PATH) @@ -165,18 +178,6 @@ public void shouldExecuteProcess() throws Exception { @Test(expectedExceptions = ProcessExecutionException.class) public void shouldThrowOnExecuteProcessError() throws Exception { - mockExecutionRequests(); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(EXECUTION_DETAIL_PATH) - .respond() - .withBody(readResource("/dataload/processes/executionDetail.json")) - .withStatus(200); - - gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")).get(); - } - - private void mockExecutionRequests() { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(EXECUTIONS_PATH) @@ -188,9 +189,16 @@ private void mockExecutionRequests() { .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_PATH) .respond() - .withStatus(202) - .thenRespond() - .withStatus(204); + .withStatus(410) + ; + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(EXECUTION_DETAIL_PATH) + .respond() + .withBody(readResource("/dataload/processes/executionDetail.json")) + .withStatus(200); + + gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")).get(); } @Test diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 0fa014bf4..c7e8b76ec 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -89,6 +89,17 @@ public void shouldLoadDatasets() throws Exception { } + @Test(expectedExceptions = DatasetException.class, expectedExceptionsMessageRegExp = ".*dataset.person.*Unable to load.*") + public void shouldFailPolling() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(400); + + final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); + } + @Test public void shouldFailLoading() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 90cab7ca0..df4fb5975 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -52,6 +52,24 @@ public void shouldCreateDiff() throws Exception { assertThat(diff.getUpdateMaql().get(0), is("CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee} PRESERVE DATA;")); } + @Test(expectedExceptions = ModelException.class, expectedExceptionsMessageRegExp = "Unable to get project model diff") + public void shouldFailCreateDiff() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(DIFF_URI) + .respond() + .withStatus(202) + .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(DIFF_POLL_URI) + .respond() + .withStatus(400) + ; + + gd.getModelService().getProjectModelDiff(project, "xxx").get(); + } + @Test public void shouldUpdateModel() throws Exception { onRequest() @@ -77,4 +95,26 @@ public void shouldUpdateModel() throws Exception { )); gd.getModelService().updateProjectModel(project, diff).get(); } + + @Test(expectedExceptions = ModelException.class, expectedExceptionsMessageRegExp = "Unable to update project model") + public void shouldFailUpdateModel() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(LDM_MANAGE2) + .respond() + .withStatus(202) + .withBody(readResource("/model/maqlDdlLinks.json")); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(400) + ; + + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, + "synchronize {dataset.chunk1} preserve data", + "synchronize {dataset.chunk2} preserve data" + )); + gd.getModelService().updateProjectModel(project, diff).get(); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index bde34acbb..0d1004e04 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -2,7 +2,6 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; -import com.gooddata.GoodDataRestException; import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; @@ -72,7 +71,7 @@ public void shouldFailWhenPostFails() throws Exception { gd.getProjectService().createProject(new Project("TITLE", "AUTH_TOKEN")).get(); } - @Test(expectedExceptions = GoodDataRestException.class) // todo previous method returns GoodDataException + @Test(expectedExceptions = GoodDataException.class) public void shouldFailWhenPollFails() throws Exception { onRequest() .havingMethodEqualTo("POST") diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index b50ba1089..5bd0aa853 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -60,4 +60,17 @@ public void shouldExportReport() throws Exception { gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); } + + @Test(expectedExceptions = ReportException.class, expectedExceptionsMessageRegExp = "Unable to export report") + public void shouldFail() throws Exception { + onRequest() + .havingPathEqualTo(URI) + .havingMethodEqualTo("GET") + .respond() + .withStatus(400); + + final Report rd = MAPPER.readValue(readResource("/md/report/report.json"), Report.class); + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index c777b2b6c..9cebf4039 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,6 +1,7 @@ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataIT; +import com.gooddata.GoodDataException; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.testng.annotations.BeforeClass; @@ -68,6 +69,23 @@ public void shouldCreateWarehouse() throws Exception { assertThat(created.getJdbcConnectionString(), is("jdbc:gdc:datawarehouse://localhost:" + port() + WAREHOUSE_URI)); } + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailToCreateWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Warehouses.URI) + .respond() + .withBody(readResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(400) + ; + gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); + } + @Test public void shouldListWarehouses() throws Exception { onRequest() diff --git a/src/test/resources/dataload/processes/testgraph/invalid.grf b/src/test/resources/dataload/processes/testgraph/invalid.grf new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/test/resources/dataload/processes/testgraph/invalid.grf @@ -0,0 +1 @@ + From 803d6520735fc35c8a292e31dae1b1c6d7cab21d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 7 Apr 2015 14:54:09 +0200 Subject: [PATCH 0151/1191] construct ResponseErrorHandler with custom message converters Previously the ResponseErrorHandler was constructed with the default set of message converters which doesn't work with Jackson2 on the classpath Relates: #121 --- src/main/java/com/gooddata/GoodData.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index a61fe7eb4..8bb7bfd1a 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -152,7 +152,6 @@ private RestTemplate createRestTemplate(String login, String password, String ho final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); - restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); // avoid jackson2 auto-detection and ensure jackson1 converter is present final List> partConverters = new ArrayList<>(); @@ -173,6 +172,8 @@ private RestTemplate createRestTemplate(String login, String password, String ho messageConverters.add(new MappingJacksonHttpMessageConverter()); restTemplate.setMessageConverters(messageConverters); + restTemplate.setErrorHandler(new ResponseErrorHandler(messageConverters)); + return restTemplate; } From 426d73a86d8f32cbc45118750a6c118ff2dc9873 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 7 Apr 2015 15:23:28 +0200 Subject: [PATCH 0152/1191] [maven-release-plugin] prepare release gooddata-java-0.12.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 08e0af551..eba66105f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.11.1-SNAPSHOT + 0.12.0 ${project.artifactId} GoodData Java SDK From e2cb8012ecd991ee4d3cc5b83d6d452b623ae627 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 7 Apr 2015 15:23:30 +0200 Subject: [PATCH 0153/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eba66105f..364e4880e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.12.0 + 0.12.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From b30ef372cd35a2b6c614ec1c82e79fa525df1c91 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 7 Apr 2015 15:32:44 +0200 Subject: [PATCH 0154/1191] change version to 0.12.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 004285aaa..2b29e176c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.11.0 + 0.12.0 ``` From 6e05909f0a1358ed2e26d2e638b9de1f98f98778 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 5 Feb 2015 13:36:15 +0100 Subject: [PATCH 0155/1191] Add possibility to specify project driver. --- .../java/com/gooddata/project/Project.java | 28 ++++++++++--- .../com/gooddata/project/ProjectDriver.java | 23 +++++++++++ .../com/gooddata/project/ProjectTest.java | 23 +++++++++++ .../resources/project/project-vertica.json | 39 +++++++++++++++++++ 4 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/gooddata/project/ProjectDriver.java create mode 100644 src/test/resources/project/project-vertica.json diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 9030fe5f0..5f49d3690 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -22,6 +22,8 @@ import java.util.Set; import static java.util.Arrays.asList; +import static org.apache.commons.lang.Validate.notEmpty; +import static org.apache.commons.lang.Validate.notNull; /** * Project in GoodData platform @@ -228,6 +230,16 @@ public boolean isEnabled() { return "ENABLED".equals(getState()); } + public void setDriver(String driver) { + notEmpty(driver, "driver cannot be empty!"); + content.setDriver(driver); + } + + public void setDriver(ProjectDriver driver) { + notNull(driver, "driver cannot be null!"); + setDriver(driver.getValue()); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @@ -251,6 +263,12 @@ private static class ProjectContent { @JsonIgnore private String state; + public ProjectContent(final String authorizationToken) { + this.authorizationToken = authorizationToken; + guidedNavigation = "1"; + driver = ProjectDriver.POSTGRES.getValue(); + } + @JsonCreator public ProjectContent(@JsonProperty("authorizationToken") String authorizationToken, @JsonProperty("driver") String driver, @@ -266,12 +284,6 @@ public ProjectContent(@JsonProperty("authorizationToken") String authorizationTo this.state = state; } - public ProjectContent(final String authorizationToken) { - this.authorizationToken = authorizationToken; - guidedNavigation = "1"; - driver = "Pg"; - } - public String getState() { return state; } @@ -295,6 +307,10 @@ public String getCluster() { public String getIsPublic() { return isPublic; } + + public void setDriver(String driver) { + this.driver = driver; + } } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java new file mode 100644 index 000000000..7e59f994c --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.project; + +import static org.apache.commons.lang.Validate.notEmpty; + +public enum ProjectDriver { + POSTGRES("Pg"), + VERTICA("vertica"); + + private final String value; + + ProjectDriver(String value) { + notEmpty(value, "value cannot be empty!"); + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index c297c556d..71767820d 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -80,4 +80,27 @@ public void testSerialize() throws Exception { assertThat(serializedProject, not(containsString("\"links\""))); } + + + @Test + public void testDeserializeVerticaProject() throws Exception { + final Project project = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-vertica.json"), Project.class); + assertThat(project, is(notNullValue())); + + assertThat(project.getDriver(), is("vertica")); + assertThat(project.getState(), is("ENABLED")); + assertThat(project.getTitle(), is("TITLE")); + } + + @Test + public void testSerializeVerticaProject() throws Exception { + final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); + project.setDriver(ProjectDriver.VERTICA); + project.setProjectTemplate("/projectTemplates/TEMPLATE"); + final String serializedProject = new ObjectMapper().writeValueAsString(project); + + assertThat(serializedProject, startsWith("{\"project\"")); + assertThat(serializedProject, containsString("\"driver\":\"vertica\"")); + } } \ No newline at end of file diff --git a/src/test/resources/project/project-vertica.json b/src/test/resources/project/project-vertica.json new file mode 100644 index 000000000..a04bda0b3 --- /dev/null +++ b/src/test/resources/project/project-vertica.json @@ -0,0 +1,39 @@ +{ + "project" : { + "content" : { + "cluster" : "CLUSTER", + "authorizationToken" : "AUTH_TOKEN", + "guidedNavigation" : "1", + "isPublic" : "0", + "driver" : "vertica", + "state" : "ENABLED" + }, + "links" : { + "ldm_thumbnail" : "/gdc/projects/PROJECT_ID/ldm?thumbnail=1", + "self" : "/gdc/projects/PROJECT_ID", + "clearCaches" : "/gdc/projects/PROJECT_ID/clearCaches", + "invitations" : "/gdc/projects/PROJECT_ID/invitations", + "users" : "/gdc/projects/PROJECT_ID/users?link=1", + "groups" : "/gdc/projects/PROJECT_ID/groups", + "uploads" : "https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/", + "ldm" : "/gdc/projects/PROJECT_ID/ldm", + "metadata" : "/gdc/md/PROJECT_ID", + "publicartifacts" : "/gdc/projects/PROJECT_ID/publicartifacts", + "roles" : "/gdc/projects/PROJECT_ID/roles", + "dataload" : "/gdc/projects/PROJECT_ID/dataload", + "connectors" : "/gdc/projects/PROJECT_ID/connectors", + "execute" : "/gdc/projects/PROJECT_ID/execute", + "schedules" : "/gdc/projects/PROJECT_ID/schedules", + "templates" : "/gdc/md/PROJECT_ID/templates", + "eventstores" : "/gdc/projects/PROJECT_ID/dataload/eventstore/stores" + }, + "meta" : { + "created" : "2014-04-11 11:43:45", + "summary" : "DESC", + "updated" : "2014-04-11 11:43:47", + "author" : "/gdc/account/profile/USER_ID", + "title" : "TITLE", + "contributor" : "/gdc/account/profile/CONTRIB_USER_ID" + } + } +} \ No newline at end of file From 09b77e3c26ffa657f4d1f4b6557dfc2712a7e8bc Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Fri, 10 Apr 2015 22:21:23 +0200 Subject: [PATCH 0156/1191] split FutureResult to interface and implementation --- src/main/java/com/gooddata/FutureResult.java | 43 ++------------ src/main/java/com/gooddata/PollResult.java | 57 +++++++++++++++++++ .../gooddata/connector/ConnectorService.java | 3 +- .../dataload/processes/ProcessService.java | 3 +- .../com/gooddata/dataset/DatasetService.java | 7 ++- .../java/com/gooddata/model/ModelService.java | 5 +- .../com/gooddata/project/ProjectService.java | 5 +- .../com/gooddata/report/ReportService.java | 4 +- .../gooddata/warehouse/WarehouseService.java | 11 ++-- 9 files changed, 83 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/gooddata/PollResult.java diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index dbcb764a7..a64e966c0 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -5,28 +5,10 @@ import java.util.concurrent.TimeUnit; -import static com.gooddata.util.Validate.notNull; - /** * Represents the result retrieved by polling on the REST API. */ -public final class FutureResult { - - private final AbstractService service; - - private final PollHandler handler; - - /** - * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

- * For internal use by services employing polling. - * - * @param service this service - * @param handler poll handler - */ - public FutureResult(final AbstractService service, final PollHandler handler) { - this.service = notNull(service, "service"); - this.handler = notNull(handler, "handler"); - } +public interface FutureResult { /** * Checks if the result is available @@ -34,9 +16,7 @@ public FutureResult(final AbstractService service, final PollHandler handle * @return true if so * @throws GoodDataException when polling fails or the thread was interrupted */ - public boolean isDone() { - return handler.isDone() || service.pollOnce(handler); - } + public boolean isDone(); /** * Wait for the result to be available and return it's value @@ -44,9 +24,7 @@ public boolean isDone() { * @return result value * @throws GoodDataException when polling fails or the thread was interrupted */ - public T get() { - return get(0, null); - } + public T get(); /** * Wait for the result to be available up to given time and return it's value @@ -56,19 +34,6 @@ public T get() { * @return result value * @throws GoodDataException when polling fails, the timeout expires or the thread was interrupted */ - public T get(final long timeout, final TimeUnit unit) { - if (handler.isDone()) { - return handler.getResult(); - } - return service.poll(handler, timeout, unit); - } + public T get(final long timeout, final TimeUnit unit); - /** - * Get URI used for polling - * - * @return URI string - */ - public String getPollingUri() { - return handler.getPollingUri(); - } } diff --git a/src/main/java/com/gooddata/PollResult.java b/src/main/java/com/gooddata/PollResult.java new file mode 100644 index 000000000..66ed382f6 --- /dev/null +++ b/src/main/java/com/gooddata/PollResult.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata; + +import java.util.concurrent.TimeUnit; + +import static com.gooddata.util.Validate.notNull; + +/** + * Represents the result retrieved by polling on the REST API. + */ +public final class PollResult implements FutureResult { + + private final AbstractService service; + + private final PollHandler handler; + + /** + * Creates a new instance of the result to be eventually retrieved by polling on the REST API.

+ * For internal use by services employing polling. + * + * @param service this service + * @param handler poll handler + */ + public PollResult(final AbstractService service, final PollHandler handler) { + this.service = notNull(service, "service"); + this.handler = notNull(handler, "handler"); + } + + @Override + public boolean isDone() { + return handler.isDone() || service.pollOnce(handler); + } + + @Override + public T get() { + return get(0, null); + } + + @Override + public T get(final long timeout, final TimeUnit unit) { + if (handler.isDone()) { + return handler.getResult(); + } + return service.poll(handler, timeout, unit); + } + + /** + * Get URI used for polling + * + * @return URI string + */ + public String getPollingUri() { + return handler.getPollingUri(); + } +} diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index b36dcf62c..0de7e2165 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -5,6 +5,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; @@ -166,7 +167,7 @@ public FutureResult executeProcess(final Project project, final P try { final UriResponse response = restTemplate .postForObject(ProcessStatus.URL, execution, UriResponse.class, project.getId(), connectorType); - return new FutureResult<>(this, new SimplePollHandler(response.getUri(), ProcessStatus.class) { + return new PollResult<>(this, new SimplePollHandler(response.getUri(), ProcessStatus.class) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { final ProcessStatus process = extractData(response, ProcessStatus.class); diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index c383e9948..06df47886 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -3,6 +3,7 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.account.AccountService; @@ -214,7 +215,7 @@ public FutureResult executeProcess(ProcessExecution exec final String detailLink = executionTask.getDetailLink(); - return new FutureResult<>(this, new AbstractPollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { + return new PollResult<>(this, new AbstractPollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { return HttpStatus.NO_CONTENT.equals(response.getStatusCode()); diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 38575a7ee..d5d82316e 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -6,6 +6,7 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; @@ -185,7 +186,7 @@ private FutureResult pullLoad(Project project, final Path dirPath, final S private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets) { final PullTask pullTask = restTemplate .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - return new FutureResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { + return new PollResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); @@ -285,7 +286,7 @@ public FutureResult optimizeSliHash(final Project project) { final UriResponse uriResponse = restTemplate.postForObject( EtlMode.URL, new EtlMode(EtlModeType.SLI, LookupMode.RECREATE), UriResponse.class, project.getId()); - return new FutureResult<>(this, + return new PollResult<>(this, new AbstractPollHandler(uriResponse.getUri(), TaskStatus.class, Void.class) { @Override public void handlePollResult(final TaskStatus pollResult) { @@ -334,7 +335,7 @@ public FutureResult updateProjectData(final Project project, final String final String errorMessage = format("Unable to update data for project '%s'", project.getId()); - return new FutureResult<>(this, + return new PollResult<>(this, new AbstractPollHandler(uriResponse.getUri(), TaskState.class, Void.class) { @Override public void handlePollResult(final TaskState pollResult) { diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 3d85db050..9d339005a 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -5,6 +5,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataRestException; import com.gooddata.AbstractPollHandlerBase; import com.gooddata.SimplePollHandler; @@ -41,7 +42,7 @@ private FutureResult getProjectModelDiff(Project project, DiffRequest try { final AsyncTask asyncTask = restTemplate .postForObject(DiffRequest.URI, diffRequest, AsyncTask.class, project.getId()); - return new FutureResult<>(this, new SimplePollHandler(asyncTask.getUri(), ModelDiff.class) { + return new PollResult<>(this, new SimplePollHandler(asyncTask.getUri(), ModelDiff.class) { @Override public void handlePollException(final GoodDataRestException e) { throw new ModelException("Unable to get project model diff", e); @@ -122,7 +123,7 @@ public FutureResult updateProjectModel(final Project project, final Collec if (maqlDdl.isEmpty()) { throw new IllegalArgumentException("MAQL DDL string(s) should be given"); } - return new FutureResult<>(this, new AbstractPollHandlerBase(MaqlDdlLinks.class, Void.class) { + return new PollResult<>(this, new AbstractPollHandlerBase(MaqlDdlLinks.class, Void.class) { private final String projectId = project.getId(); private final LinkedList maqlChunks = new LinkedList<>(maqlDdl); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index f92459556..1f5b2fc35 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -6,6 +6,7 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; @@ -90,7 +91,7 @@ public FutureResult createProject(Project project) { throw new GoodDataException("Empty response when project POSTed to API"); } - return new FutureResult<>(this, new SimplePollHandler(uri.getUri(), Project.class) { + return new PollResult<>(this, new SimplePollHandler(uri.getUri(), Project.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { @@ -221,7 +222,7 @@ public FutureResult validateProject(final Project proj } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to to start project validation", e); } - return new FutureResult<>(this, + return new PollResult<>(this, // PollHandler able to poll on different URIs (by the Location header) // poll class is Void because the object returned varies between invocations (even on the same URI) new AbstractPollHandler(task.getUri(), Void.class, ProjectValidationResults.class) { diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 89a08c232..1a266305c 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -5,6 +5,7 @@ import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; @@ -22,7 +23,6 @@ import java.io.IOException; import java.io.OutputStream; -import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpMethod.POST; @@ -71,7 +71,7 @@ private FutureResult exportReport(final ReportRequest request, final Repor notNull(format, "format"); final JsonNode execResult = executeReport(request); final String uri = exportReport(execResult, format); - return new FutureResult<>(this, new SimplePollHandler(uri, Void.class) { + return new PollResult<>(this, new SimplePollHandler(uri, Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { switch (response.getStatusCode()) { diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index ce4902b2a..bb2850ff9 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -1,12 +1,9 @@ package com.gooddata.warehouse; -import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; -import static java.util.Collections.emptyList; - import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; +import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import org.springframework.http.HttpStatus; @@ -17,6 +14,10 @@ import java.io.IOException; import java.util.Collection; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static java.util.Collections.emptyList; + /** * Provide access to warehouse API - create, update, list and delete warehouses. */ @@ -59,7 +60,7 @@ public FutureResult createWarehouse(Warehouse warehouse) { throw new GoodDataException("Empty response when Warehouse POSTed to API"); } - return new FutureResult<>(this, new AbstractPollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { + return new PollResult<>(this, new AbstractPollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { From 3783384ed872cb9bae2c675217c59b716aca7dd6 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Fri, 10 Apr 2015 15:32:25 +0200 Subject: [PATCH 0157/1191] Added support for project users and roles --- README.md | 16 +++ .../collections/PageableListDeserializer.java | 12 +- .../com/gooddata/project/ProjectService.java | 86 ++++++++++++ src/main/java/com/gooddata/project/Role.java | 127 +++++++++++++++++ .../project/RoleNotFoundException.java | 20 +++ src/main/java/com/gooddata/project/Roles.java | 32 +++++ src/main/java/com/gooddata/project/User.java | 131 ++++++++++++++++++ src/main/java/com/gooddata/project/Users.java | 31 +++++ .../gooddata/project/UsersDeserializer.java | 19 +++ src/test/java/com/gooddata/ShowcaseAT.java | 27 ++++ .../gooddata/project/ProjectServiceIT.java | 70 ++++++++++ .../java/com/gooddata/project/RoleTest.java | 45 ++++++ .../java/com/gooddata/project/RolesTest.java | 25 ++++ .../java/com/gooddata/project/UserTest.java | 30 ++++ .../java/com/gooddata/project/UsersTest.java | 36 +++++ src/test/resources/project/project-role.json | 89 ++++++++++++ src/test/resources/project/project-role2.json | 89 ++++++++++++ src/test/resources/project/project-role3.json | 89 ++++++++++++ src/test/resources/project/project-roles.json | 11 ++ src/test/resources/project/project-user.json | 30 ++++ .../project/project-users-empty.json | 3 + src/test/resources/project/project-users.json | 34 +++++ 22 files changed, 1050 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gooddata/project/Role.java create mode 100644 src/main/java/com/gooddata/project/RoleNotFoundException.java create mode 100644 src/main/java/com/gooddata/project/Roles.java create mode 100644 src/main/java/com/gooddata/project/User.java create mode 100644 src/main/java/com/gooddata/project/Users.java create mode 100644 src/main/java/com/gooddata/project/UsersDeserializer.java create mode 100644 src/test/java/com/gooddata/project/RoleTest.java create mode 100644 src/test/java/com/gooddata/project/RolesTest.java create mode 100644 src/test/java/com/gooddata/project/UserTest.java create mode 100644 src/test/java/com/gooddata/project/UsersTest.java create mode 100644 src/test/resources/project/project-role.json create mode 100644 src/test/resources/project/project-role2.json create mode 100644 src/test/resources/project/project-role3.json create mode 100644 src/test/resources/project/project-roles.json create mode 100644 src/test/resources/project/project-user.json create mode 100644 src/test/resources/project/project-users-empty.json create mode 100644 src/test/resources/project/project-users.json diff --git a/README.md b/README.md index 2b29e176c..c4d14b93e 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,22 @@ Set types = projectService.getAvailableProjectValidationT ProjectValidationResults results = projectService.validateProject(project, types).get(); ``` +List project users +```java +ProjectService projectService = gd.getProjectService(); +List users = new ArrayList<>(); +List page; +while (!(page = projectService.listUsers(project, new PageRequest(users.size(), 100))).isEmpty()) { + users.addAll(page); +} +``` + +List project user roles +```java +ProjectService projectService = gd.getProjectService(); +Set roles = projectService.getRoles(project); +``` + ### Project Model API Create and update the project model, execute MAQL DDL,... diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index 08e287ea5..2bbc2a24b 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -12,12 +12,20 @@ import java.util.Collections; import java.util.List; +import static com.gooddata.util.Validate.notNull; + public abstract class PageableListDeserializer extends JsonDeserializer { private final Class elementType; + private final String collectionName; protected PageableListDeserializer(final Class elementType) { - this.elementType = elementType; + this(elementType, "items"); + } + + protected PageableListDeserializer(final Class elementType, final String collectionName) { + this.elementType = notNull(elementType, "elementType"); + this.collectionName = notNull(collectionName, "collectionName"); } protected abstract T createList(final List items, final Paging paging); @@ -36,7 +44,7 @@ public T deserialize(final JsonParser jp, final DeserializationContext context) final JsonNode pagingNode = root.get("paging"); final Paging paging = pagingNode == null ? null : objectMapper.readValue(pagingNode, Paging.class); - final JsonNode itemsNode = root.get("items"); + final JsonNode itemsNode = root.get(collectionName); final List items; if (itemsNode == null) { items = Collections.emptyList(); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 1f5b2fc35..89881a640 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -11,6 +11,8 @@ import com.gooddata.GoodDataRestException; import com.gooddata.SimplePollHandler; import com.gooddata.account.AccountService; +import com.gooddata.collections.Page; +import com.gooddata.collections.PageableList; import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; @@ -23,11 +25,13 @@ import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.List; import java.util.Set; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; +import static org.springframework.web.util.UriComponentsBuilder.fromUri; /** * List projects, create a project, ... @@ -255,4 +259,86 @@ public void handlePollException(final GoodDataRestException e) { } }); } + + /** + * Get first page of paged list of users by given project. + * + * @param project project of users + * @return list of found users or empty list + */ + public List listUsers(Project project) { + notNull(project, "project"); + return listUsers(getUsersUri(project)); + } + + /** + * Get defined page of paged list of users by given project. + * + * @param project project of users + * @param page page to be retrieved + * @return list of found users or empty list + */ + public List listUsers(Project project, Page page) { + notNull(project, "project"); + notNull(page, "page"); + return listUsers(page.getPageUri(fromUri(getUsersUri(project)))); + } + + private PageableList listUsers(URI uri) { + try { + final Users users = restTemplate.getForObject(uri, Users.class); + if (users == null) { + return new PageableList<>(); + } + return users; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list users", e); + } + } + + private static URI getUsersUri(Project project) { + return Users.TEMPLATE.expand(project.getId()); + } + + /** + * Get set of user role by given project. + * + * Note: This makes n+1 API calls to retrieve all role details. + * + * @param project project of roles + * @return set of found roles or empty set + */ + public Set getRoles(final Project project) { + notNull(project, "project"); + final Roles roles = restTemplate.getForObject(Roles.URI, Roles.class, project.getId()); + final Set result = new HashSet<>(); + for (String roleUri : roles.getRoles()) { + final Role role = restTemplate.getForObject(roleUri, Role.class); + role.setUri(roleUri); + result.add(role); + } + return result; + } + + /** + * Get role by given URI. + * + * @param uri role uri + * @return found role + * @throws RoleNotFoundException when the role doesn't exist + */ + public Role getRoleByUri(String uri) { + notEmpty(uri, "uri"); + try { + return restTemplate.getForObject(uri, Role.class); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new RoleNotFoundException(uri, e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get role " + uri, e); + } + } } diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java new file mode 100644 index 000000000..7f04d0f89 --- /dev/null +++ b/src/main/java/com/gooddata/project/Role.java @@ -0,0 +1,127 @@ +package com.gooddata.project; + +import com.gooddata.md.Meta; +import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanStringSerializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +/** + * Project Role + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("projectRole") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Role { + public static final String URI = "/gdc/projects/{projectId}/roles/{roleId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + + @JsonDeserialize(contentUsing = BooleanStringDeserializer.class) + @JsonSerialize(contentUsing = BooleanStringSerializer.class) + private final Map permissions; + + private Meta meta; + + private final Map links; + + @JsonCreator + Role(@JsonProperty("permissions") final Map permissions, + @JsonProperty("meta") final Meta meta, + @JsonProperty("links") final Map links) { + this.permissions = permissions == null ? new HashMap() : permissions; + this.meta = meta == null ? new Meta(null) : meta; + this.links = links == null ? new HashMap() : links; + } + + /** + * Returns set of permission names this role can have granted. + * + * @return set of permission names + */ + public Set getPermissions() { + return Collections.unmodifiableSet(permissions.keySet()); + } + + /** + * Returns names of granted permissions. + * + * @return set of granted permissions + */ + public Set getGrantedPermissions() { + final Set permissions = new HashSet<>(); + for (Entry entry : this.permissions.entrySet()) { + if (entry.getValue()) { + permissions.add(entry.getKey()); + } + } + return permissions; + } + + /** + * Returns true if provided permission is granted. + * + * @param permission permission name to test + * @return whether the permission is granted + */ + public boolean hasPermissionGranted(final String permission) { + return permissions.get(permission); + } + + public String getTitle() { + return meta.getTitle(); + } + + public String getIdentifier() { + return meta.getIdentifier(); + } + + /** + * Allows service to set self link as it is not provided by REST API. + *

+ * NOTE: This is intentionally left package-private. + */ + void setUri(final String uri) { + links.put(SELF_LINK, uri); + } + + @JsonIgnore + public String getUri() { + return links.get(SELF_LINK); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final Role role = (Role) o; + + if (!permissions.equals(role.permissions)) return false; + return !(getIdentifier() != null ? !getIdentifier().equals(role.getIdentifier()) : role.getIdentifier() != null); + + } + + @Override + public int hashCode() { + int result = permissions.hashCode(); + result = 31 * result + (getIdentifier() != null ? getIdentifier().hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/gooddata/project/RoleNotFoundException.java b/src/main/java/com/gooddata/project/RoleNotFoundException.java new file mode 100644 index 000000000..0eda92536 --- /dev/null +++ b/src/main/java/com/gooddata/project/RoleNotFoundException.java @@ -0,0 +1,20 @@ +package com.gooddata.project; + +import com.gooddata.GoodDataException; + +/** + * Project role of the given URI doesn't exist + */ +public class RoleNotFoundException extends GoodDataException { + + private final String uri; + + public RoleNotFoundException(String uri, Throwable cause) { + super("Role " + uri + " was not found", cause); + this.uri = uri; + } + + public String getUri() { + return uri; + } +} diff --git a/src/main/java/com/gooddata/project/Roles.java b/src/main/java/com/gooddata/project/Roles.java new file mode 100644 index 000000000..2e44b8a72 --- /dev/null +++ b/src/main/java/com/gooddata/project/Roles.java @@ -0,0 +1,32 @@ +package com.gooddata.project; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Set; + +/** + * List of Role URIs. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("projectRoles") +@JsonIgnoreProperties(ignoreUnknown = true) +class Roles { + public static final String URI = "/gdc/projects/{projectId}/roles"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final Set roles; + + @JsonCreator + Roles(@JsonProperty("roles") final Set roles) { + this.roles = roles; + } + + Set getRoles() { + return roles; + } +} diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java new file mode 100644 index 000000000..6ceb4a8ac --- /dev/null +++ b/src/main/java/com/gooddata/project/User.java @@ -0,0 +1,131 @@ +package com.gooddata.project; + +import com.gooddata.md.Meta; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * User. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("user") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class User { + + private UserContent content; + + @JsonCreator + User(@JsonProperty("content") final UserContent content) { + this.content = content; + } + + public String getEmail() { + return content.getEmail(); + } + + public String getStatus() { + return content.getStatus(); + } + + public String getLastName() { + return content.getLastName(); + } + + public List getUserRoles() { + return content.getUserRoles(); + } + + public String getLogin() { + return content.getLogin(); + } + + public String getFirstName() { + return content.getFirstName(); + } + + public String getPhoneNumber() { + return content.getPhoneNumber(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + private static class UserContent { + + @JsonProperty("email") + private String email; + + @JsonProperty("firstname") + private String firstName; + + @JsonProperty("userRoles") + private List userRoles; + + @JsonProperty("phonenumber") + private String phoneNumber; + + @JsonProperty("status") + private String status; + + @JsonProperty("lastname") + private String lastName; + + @JsonProperty("login") + private String login; + + @JsonCreator + public UserContent(@JsonProperty("email") final String email, + @JsonProperty("firstname") final String firstName, + @JsonProperty("userRoles") final List userRoles, + @JsonProperty("phonenumber") final String phoneNumber, + @JsonProperty("status") final String status, + @JsonProperty("lastname") final String lastName, + @JsonProperty("login") final String login) { + this.email = email; + this.firstName = firstName; + this.userRoles = userRoles; + this.phoneNumber = phoneNumber; + this.status = status; + this.lastName = lastName; + this.login = login; + } + + public String getEmail() { + return email; + } + + public String getFirstName() { + return firstName; + } + + public List getUserRoles() { + return userRoles; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public String getStatus() { + return status; + } + + public String getLastName() { + return lastName; + } + + public String getLogin() { + return login; + } + } +} diff --git a/src/main/java/com/gooddata/project/Users.java b/src/main/java/com/gooddata/project/Users.java new file mode 100644 index 000000000..a866f5838 --- /dev/null +++ b/src/main/java/com/gooddata/project/Users.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.project; + +import com.gooddata.collections.PageableList; +import com.gooddata.collections.Paging; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeInfo.Id; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.springframework.web.util.UriTemplate; + +import java.util.List; + +/** + * List of users. Deserialization only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = Id.NONE) +@JsonTypeName("users") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonDeserialize(using = UsersDeserializer.class) +class Users extends PageableList { + public static final String URI = "/gdc/projects/{projectId}/users"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + Users(final List items, final Paging paging) { + super(items, paging); + } +} diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/src/main/java/com/gooddata/project/UsersDeserializer.java new file mode 100644 index 000000000..a4efcb3b2 --- /dev/null +++ b/src/main/java/com/gooddata/project/UsersDeserializer.java @@ -0,0 +1,19 @@ +package com.gooddata.project; + +import com.gooddata.collections.PageableListDeserializer; +import com.gooddata.collections.Paging; +import com.gooddata.dataload.processes.Schedule; + +import java.util.List; + +class UsersDeserializer extends PageableListDeserializer { + + protected UsersDeserializer() { + super(User.class, "users"); + } + + @Override + protected Users createList(final List items, final Paging paging) { + return new Users(items, paging); + } +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 5589c8bc8..c26881b0b 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -2,6 +2,7 @@ import com.gooddata.account.Account; import com.gooddata.account.AccountService; +import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; import com.gooddata.dataload.processes.DataloadProcess; import com.gooddata.dataload.processes.ProcessExecution; @@ -26,6 +27,8 @@ import com.gooddata.project.Project; import com.gooddata.project.ProjectService; import com.gooddata.project.ProjectValidationResults; +import com.gooddata.project.Role; +import com.gooddata.project.User; import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; import com.gooddata.dataload.processes.Schedule; @@ -46,7 +49,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.Set; import java.util.UUID; import static com.gooddata.ProcessIdMatcher.hasSameIdAs; @@ -58,6 +64,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; @@ -127,6 +134,26 @@ public void listProjects() throws Exception { assertThat(projects, hasItem(hasSameIdAs(project))); } + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjectUsers() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final List users = new ArrayList<>(); + List page; + while (!(page = projectService.listUsers(project, new PageRequest(users.size(), 100))).isEmpty()) { + users.addAll(page); + } + assertThat(users, not(empty())); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjectRoles() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final Set roles = projectService.getRoles(project); + assertThat(roles, not(empty())); + } + @Test(groups = "project", dependsOnMethods = "createProject") public void getProjectById() throws Exception { final Project project = gd.getProjectService().getProjectById(this.project.getId()); diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 0d1004e04..04f0ea148 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -2,6 +2,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.collections.PageRequest; import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; @@ -12,11 +13,13 @@ import static com.gooddata.JsonMatchers.isJsonString; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import java.util.Collection; +import java.util.List; import java.util.Set; public class ProjectServiceIT extends AbstractGoodDataIT { @@ -241,5 +244,72 @@ public void shouldValidateProject2() throws Exception { assertThat(validateResult, notNullValue()); } + @Test + public void shouldReturnProjectRoles() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles") + .respond() + .withBody(readResource("/project/project-roles.json")) + .withStatus(200); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles/ROLE1") + .respond() + .withBody(readResource("/project/project-role.json")) + .withStatus(200); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles/ROLE2") + .respond() + .withBody(readResource("/project/project-role2.json")) + .withStatus(200); + + final Set roles = gd.getProjectService().getRoles(enabled); + assertThat(roles, notNullValue()); + assertThat(roles, hasSize(2)); + } + + @Test + public void shouldReturnProjectRoleForUri() { + final String roleUri = "/gdc/projects/PROJECT_ID/roles/ROLE1"; + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(roleUri) + .respond() + .withBody(readResource("/project/project-role.json")) + .withStatus(200); + + final Role role = gd.getProjectService().getRoleByUri(roleUri); + assertThat(role, notNullValue()); + assertThat(role.getTitle(), is("Embedded Dashboard Only")); + } + + @Test + public void shouldListPagedUsers() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(Users.TEMPLATE.expand("PROJECT_ID").toString()) + .respond() + .withBody(readResource("/project/project-users.json")) + .withStatus(200); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(Users.TEMPLATE.expand("PROJECT_ID").toString()) + .havingQueryStringEqualTo("offset=1&limit=1") + .respond() + .withBody(readResource("/project/project-users-empty.json")) + .withStatus(200); + + final List firstPage = gd.getProjectService().listUsers(enabled); + assertThat(firstPage, notNullValue()); + assertThat(firstPage, hasSize(1)); + + final List secondPage = gd.getProjectService().listUsers(enabled, new PageRequest(firstPage.size(), 1)); + assertThat(secondPage, notNullValue()); + assertThat(secondPage, empty()); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/RoleTest.java b/src/test/java/com/gooddata/project/RoleTest.java new file mode 100644 index 000000000..4e593f70d --- /dev/null +++ b/src/test/java/com/gooddata/project/RoleTest.java @@ -0,0 +1,45 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + +public class RoleTest { + + @Test + public void testDeserialization() throws Exception { + final Role role = readRole(""); + + assertThat(role, notNullValue()); + assertThat(role.getPermissions(), notNullValue()); + assertThat(role.getPermissions(), hasSize(71)); + assertThat(role.getGrantedPermissions(), not(hasItem("canManageProjectDashboard"))); + assertThat(role.hasPermissionGranted("canManageProjectDashboard"), is(false)); + assertThat(role.getGrantedPermissions(), hasItem("canCreateReportResult2")); + assertThat(role.hasPermissionGranted("canCreateReportResult2"), is(true)); + assertThat(role.getTitle(), is("Embedded Dashboard Only")); + } + + @Test + public void testEquals() throws IOException { + final Role role1 = readRole(""); + + assertThat(role1.equals(readRole("")), is(true)); + assertThat(role1.equals(readRole("2")), is(false)); + assertThat(role1.equals(readRole("3")), is(false)); + } + + private Role readRole(final String suffix) throws java.io.IOException { + final InputStream stream = getClass().getResourceAsStream("/project/project-role" + suffix + ".json"); + return new ObjectMapper().readValue(stream, Role.class); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java new file mode 100644 index 000000000..870511405 --- /dev/null +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -0,0 +1,25 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + +public class RolesTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/project/project-roles.json"); + final Roles roles = new ObjectMapper().readValue(stream, Roles.class); + + assertThat(roles, notNullValue()); + assertThat(roles.getRoles(), hasSize(2)); + assertThat(roles.getRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE1")); + assertThat(roles.getRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE2")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java new file mode 100644 index 000000000..5ae4c4fca --- /dev/null +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -0,0 +1,30 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +public class UserTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/project/project-user.json"); + final User user = new ObjectMapper().readValue(stream, User.class); + + assertThat(user, notNullValue()); + assertThat(user.getEmail(), is("ateam+ads-testing@gooddata.com")); + assertThat(user.getFirstName(), is("ateam")); + assertThat(user.getUserRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE1")); + assertThat(user.getPhoneNumber(), is("123456789")); + assertThat(user.getStatus(), is("ENABLED")); + assertThat(user.getLastName(), is("ads-testing")); + assertThat(user.getLogin(), is("ateam+ads-testing@gooddata.com")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/UsersTest.java b/src/test/java/com/gooddata/project/UsersTest.java new file mode 100644 index 000000000..ebbacd737 --- /dev/null +++ b/src/test/java/com/gooddata/project/UsersTest.java @@ -0,0 +1,36 @@ +package com.gooddata.project; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; + +public class UsersTest { + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/project/project-users.json"); + final Users users = new ObjectMapper().readValue(stream, Users.class); + + assertThat(users, notNullValue()); + assertThat(users, hasSize(1)); + assertThat(users.getNextPage(), nullValue()); + + final User user = users.get(0); + assertThat(user, notNullValue()); + assertThat(user.getEmail(), is("ateam+ads-testing@gooddata.com")); + assertThat(user.getFirstName(), is("ateam")); + assertThat(user.getUserRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE1")); + assertThat(user.getPhoneNumber(), is("123456789")); + assertThat(user.getStatus(), is("ENABLED")); + assertThat(user.getLastName(), is("ads-testing")); + assertThat(user.getLogin(), is("ateam+ads-testing@gooddata.com")); + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-role.json b/src/test/resources/project/project-role.json new file mode 100644 index 000000000..497df34e4 --- /dev/null +++ b/src/test/resources/project/project-role.json @@ -0,0 +1,89 @@ +{ + "projectRole": { + "permissions": { + "canAccessIntegration": "0", + "canCreateProjectDashboard": "0", + "canManageComment": "0", + "canCreateDimensionMapping": "0", + "canInitData": "0", + "canManageIntegration": "0", + "canManageFolder": "0", + "canInviteUserToProject": "0", + "canCreateget": "0", + "canCreateTableDataLoad": "0", + "canSeeOtherUserDetails": "0", + "canCreateETLInterface": "0", + "canCreateRole": "0", + "canCreateReportResult": "1", + "canCreateHelp": "0", + "canManageDomain": "0", + "canManageAttributeLabel": "0", + "canCreateColumn": "0", + "canManageReport": "0", + "canManageDataSet": "0", + "canSetUserVariables": "0", + "canCreateAttributeGroup": "0", + "canValidateProject": "0", + "canMaintainProject": "0", + "canCreateETLFile": "0", + "canCreateScheduledMail": "0", + "canManageETLSession": "0", + "canSuspendUserFromProject": "0", + "canMaintainUserFilterRelation": "0", + "canManageAttribute": "0", + "canManageReportDefinition": "0", + "canCreateReportResult2": "1", + "canMaintainUserFilter": "0", + "canCreateReport": "0", + "canManageETLFile": "0", + "canCreateComment": "0", + "canCreateDataSet": "0", + "canCreateTable": "0", + "canManageTableDataLoad": "0", + "canManageDimensionMapping": "0", + "canCreateMetric": "0", + "canRefreshData": "0", + "canManageProjectDashboard": "0", + "canManageProject": "0", + "canManagePrompt": "0", + "canManageETLInterface": "0", + "canManageReportResult2": "0", + "canAccessWorkbench": "0", + "canCreateAttributeLabel": "0", + "canManageColumn": "0", + "canCreatePrompt": "0", + "canManagePublicAccessCode": "0", + "canListUsersInProject": "0", + "canManageAttributeGroup": "0", + "canManageMetric": "0", + "canManageHelp": "0", + "canManageTable": "0", + "canSetProjectVariables": "0", + "canCreateETLSession": "0", + "canCreateFolder": "0", + "canManageFact": "0", + "canListInvitationsInProject": "0", + "canManageScheduledMail": "0", + "canManageReportResult": "1", + "canManageAnnotation": "0", + "canSeePublicAccessCode": "0", + "canCreateReportDefinition": "1", + "canCreateFact": "0", + "canCreateAttribute": "0", + "canAssignUserWithRole": "0", + "canCreateAnnotation": "0" + }, + "links": { + "roleUsers": "/gdc/projects/PROJECT_ID/roles/ROLE1/users" + }, + "meta": { + "created": "2012-07-25 11:28:52", + "identifier": "dashboardOnlyRole1", + "summary": "dashboard only", + "author": "/gdc/account/profile/PROFILE_ID", + "updated": "2012-07-25 11:28:52", + "title": "Embedded Dashboard Only", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-role2.json b/src/test/resources/project/project-role2.json new file mode 100644 index 000000000..362283acb --- /dev/null +++ b/src/test/resources/project/project-role2.json @@ -0,0 +1,89 @@ +{ + "projectRole": { + "permissions": { + "canAccessIntegration": "0", + "canCreateProjectDashboard": "0", + "canManageComment": "0", + "canCreateDimensionMapping": "0", + "canInitData": "0", + "canManageIntegration": "0", + "canManageFolder": "0", + "canInviteUserToProject": "0", + "canCreateget": "0", + "canCreateTableDataLoad": "0", + "canSeeOtherUserDetails": "0", + "canCreateETLInterface": "0", + "canCreateRole": "0", + "canCreateReportResult": "1", + "canCreateHelp": "0", + "canManageDomain": "0", + "canManageAttributeLabel": "0", + "canCreateColumn": "0", + "canManageReport": "0", + "canManageDataSet": "0", + "canSetUserVariables": "0", + "canCreateAttributeGroup": "0", + "canValidateProject": "0", + "canMaintainProject": "0", + "canCreateETLFile": "0", + "canCreateScheduledMail": "0", + "canManageETLSession": "0", + "canSuspendUserFromProject": "0", + "canMaintainUserFilterRelation": "0", + "canManageAttribute": "0", + "canManageReportDefinition": "0", + "canCreateReportResult2": "1", + "canMaintainUserFilter": "0", + "canCreateReport": "0", + "canManageETLFile": "0", + "canCreateComment": "0", + "canCreateDataSet": "0", + "canCreateTable": "0", + "canManageTableDataLoad": "0", + "canManageDimensionMapping": "0", + "canCreateMetric": "0", + "canRefreshData": "0", + "canManageProjectDashboard": "0", + "canManageProject": "0", + "canManagePrompt": "0", + "canManageETLInterface": "0", + "canManageReportResult2": "0", + "canAccessWorkbench": "0", + "canCreateAttributeLabel": "0", + "canManageColumn": "0", + "canCreatePrompt": "0", + "canManagePublicAccessCode": "0", + "canListUsersInProject": "0", + "canManageAttributeGroup": "0", + "canManageMetric": "0", + "canManageHelp": "0", + "canManageTable": "0", + "canSetProjectVariables": "0", + "canCreateETLSession": "0", + "canCreateFolder": "0", + "canManageFact": "0", + "canListInvitationsInProject": "0", + "canManageScheduledMail": "0", + "canManageReportResult": "1", + "canManageAnnotation": "0", + "canSeePublicAccessCode": "0", + "canCreateReportDefinition": "1", + "canCreateFact": "0", + "canCreateAttribute": "0", + "canAssignUserWithRole": "0", + "canCreateAnnotation": "0" + }, + "links": { + "roleUsers": "/gdc/projects/PROJECT_ID/roles/ROLE2/users" + }, + "meta": { + "created": "2012-07-25 11:28:52", + "identifier": "dashboardOnlyRole2", + "summary": "dashboard only", + "author": "/gdc/account/profile/PROFILE_ID", + "updated": "2012-07-25 11:28:52", + "title": "Embedded Dashboard Only", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-role3.json b/src/test/resources/project/project-role3.json new file mode 100644 index 000000000..6aefc1a85 --- /dev/null +++ b/src/test/resources/project/project-role3.json @@ -0,0 +1,89 @@ +{ + "projectRole": { + "permissions": { + "canAccessIntegration": "1", + "canCreateProjectDashboard": "0", + "canManageComment": "0", + "canCreateDimensionMapping": "0", + "canInitData": "0", + "canManageIntegration": "0", + "canManageFolder": "0", + "canInviteUserToProject": "0", + "canCreateget": "0", + "canCreateTableDataLoad": "0", + "canSeeOtherUserDetails": "0", + "canCreateETLInterface": "0", + "canCreateRole": "0", + "canCreateReportResult": "1", + "canCreateHelp": "0", + "canManageDomain": "0", + "canManageAttributeLabel": "0", + "canCreateColumn": "0", + "canManageReport": "0", + "canManageDataSet": "0", + "canSetUserVariables": "0", + "canCreateAttributeGroup": "0", + "canValidateProject": "0", + "canMaintainProject": "0", + "canCreateETLFile": "0", + "canCreateScheduledMail": "0", + "canManageETLSession": "0", + "canSuspendUserFromProject": "0", + "canMaintainUserFilterRelation": "0", + "canManageAttribute": "0", + "canManageReportDefinition": "0", + "canCreateReportResult2": "1", + "canMaintainUserFilter": "0", + "canCreateReport": "0", + "canManageETLFile": "0", + "canCreateComment": "0", + "canCreateDataSet": "0", + "canCreateTable": "0", + "canManageTableDataLoad": "0", + "canManageDimensionMapping": "0", + "canCreateMetric": "0", + "canRefreshData": "0", + "canManageProjectDashboard": "0", + "canManageProject": "0", + "canManagePrompt": "0", + "canManageETLInterface": "0", + "canManageReportResult2": "0", + "canAccessWorkbench": "0", + "canCreateAttributeLabel": "0", + "canManageColumn": "0", + "canCreatePrompt": "0", + "canManagePublicAccessCode": "0", + "canListUsersInProject": "0", + "canManageAttributeGroup": "0", + "canManageMetric": "0", + "canManageHelp": "0", + "canManageTable": "0", + "canSetProjectVariables": "0", + "canCreateETLSession": "0", + "canCreateFolder": "0", + "canManageFact": "0", + "canListInvitationsInProject": "0", + "canManageScheduledMail": "0", + "canManageReportResult": "1", + "canManageAnnotation": "0", + "canSeePublicAccessCode": "0", + "canCreateReportDefinition": "1", + "canCreateFact": "0", + "canCreateAttribute": "0", + "canAssignUserWithRole": "0", + "canCreateAnnotation": "0" + }, + "links": { + "roleUsers": "/gdc/projects/PROJECT_ID/roles/ROLE1/users" + }, + "meta": { + "created": "2012-07-25 11:28:52", + "identifier": "dashboardOnlyRole1", + "summary": "dashboard only", + "author": "/gdc/account/profile/PROFILE_ID", + "updated": "2012-07-25 11:28:52", + "title": "Embedded Dashboard Only", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-roles.json b/src/test/resources/project/project-roles.json new file mode 100644 index 000000000..2469b7ed6 --- /dev/null +++ b/src/test/resources/project/project-roles.json @@ -0,0 +1,11 @@ +{ + "projectRoles": { + "roles": [ + "/gdc/projects/PROJECT_ID/roles/ROLE1", + "/gdc/projects/PROJECT_ID/roles/ROLE2" + ], + "links": { + "project": "/gdc/projects/PROJECT_ID/" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-user.json b/src/test/resources/project/project-user.json new file mode 100644 index 000000000..3485060f8 --- /dev/null +++ b/src/test/resources/project/project-user.json @@ -0,0 +1,30 @@ +{ + "user" : { + "content" : { + "email" : "ateam+ads-testing@gooddata.com", + "firstname" : "ateam", + "userRoles" : [ + "/gdc/projects/PROJECT_ID/roles/ROLE1" + ], + "phonenumber" : "123456789", + "status" : "ENABLED", + "lastname" : "ads-testing", + "login" : "ateam+ads-testing@gooddata.com" + }, + "links" : { + "roles" : "/gdc/projects/PROJECT_ID/users/USER_ID/roles", + "permissions" : "/gdc/projects/PROJECT_ID/users/USER_ID/permissions", + "self" : "/gdc/account/profile/USER_ID", + "invitations" : "/gdc/account/profile/USER_ID/invitations", + "projects" : "/gdc/account/profile/USER_ID/projects", + "projectRelUri" : "/gdc/projects/PROJECT_ID/users/USER_ID" + }, + "meta" : { + "created" : "2015-03-30 11:36:09", + "updated" : "2015-03-30 12:14:41", + "author" : "/gdc/account/profile/PROFILE_ID", + "title" : "ateam ads-testing", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-users-empty.json b/src/test/resources/project/project-users-empty.json new file mode 100644 index 000000000..4b60f5002 --- /dev/null +++ b/src/test/resources/project/project-users-empty.json @@ -0,0 +1,3 @@ +{ + "users" : [] +} \ No newline at end of file diff --git a/src/test/resources/project/project-users.json b/src/test/resources/project/project-users.json new file mode 100644 index 000000000..882d79bd1 --- /dev/null +++ b/src/test/resources/project/project-users.json @@ -0,0 +1,34 @@ +{ + "users" : [ + { + "user" : { + "content" : { + "email" : "ateam+ads-testing@gooddata.com", + "firstname" : "ateam", + "userRoles" : [ + "/gdc/projects/PROJECT_ID/roles/ROLE1" + ], + "phonenumber" : "123456789", + "status" : "ENABLED", + "lastname" : "ads-testing", + "login" : "ateam+ads-testing@gooddata.com" + }, + "links" : { + "roles" : "/gdc/projects/PROJECT_ID/users/USER_ID/roles", + "permissions" : "/gdc/projects/PROJECT_ID/users/USER_ID/permissions", + "self" : "/gdc/account/profile/USER_ID", + "invitations" : "/gdc/account/profile/USER_ID/invitations", + "projects" : "/gdc/account/profile/USER_ID/projects", + "projectRelUri" : "/gdc/projects/PROJECT_ID/users/USER_ID" + }, + "meta" : { + "created" : "2015-03-30 11:36:09", + "updated" : "2015-03-30 12:14:41", + "author" : "/gdc/account/profile/PROFILE_ID", + "title" : "ateam ads-testing", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + } + ] +} \ No newline at end of file From 9c8fdfdd3003988cfe87bda4a07167e9e3bfda3c Mon Sep 17 00:00:00 2001 From: Marek Gerhart Date: Fri, 10 Apr 2015 14:16:44 +0200 Subject: [PATCH 0158/1191] Add support for restapi versioning Every new public resources in /gdc/dataload/ namespace should be versioned. Versioning is mandatory, meaning that when requesting /gdc/dataload/* resource, user has to specify accept header with version value. REST api version is global - so there is no special dataload restapi version and connectors restapi version, etc --- src/main/java/com/gooddata/GoodData.java | 12 +++++++++++- src/test/java/com/gooddata/gdc/GdcServiceIT.java | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 8bb7bfd1a..893d145e4 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -62,6 +62,8 @@ public class GoodData { protected static final String HOSTNAME = "secure.gooddata.com"; private static final String UNKNOWN_VERSION = "UNKNOWN"; + private static final int RESTAPI_VERSION = 1; + private final RestTemplate restTemplate; private final AccountService accountService; private final ProjectService projectService; @@ -151,7 +153,7 @@ private RestTemplate createRestTemplate(String login, String password, String ho new HttpComponentsClientHttpRequestFactory(client), hostname, port, protocol); final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( - new HeaderSettingRequestInterceptor(singletonMap("Accept", MediaType.APPLICATION_JSON_VALUE)))); + new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); // avoid jackson2 auto-detection and ensure jackson1 converter is present final List> partConverters = new ArrayList<>(); @@ -177,6 +179,14 @@ private RestTemplate createRestTemplate(String login, String password, String ho return restTemplate; } + /* + * Set accept header (application/json by default) and append rest api versioning information which is mandatory + * for some resources. + */ + private String getAcceptHeaderValue(){ + return MediaType.APPLICATION_JSON_VALUE + ";version=" + RESTAPI_VERSION; + } + protected HttpClient createHttpClient(final String login, final String password, final String hostname, final int port, final String protocol, final HttpClientBuilder builder) { final HttpHost host = new HttpHost(hostname, port, protocol); diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index 7dbe38036..3e17b56ac 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -23,4 +23,18 @@ public void shouldReturnGdc() throws Exception { assertThat(gdc, is(notNullValue())); assertThat(gdc.getUserStagingLink(), is("/uploads")); } + + @Test + public void shouldUseProperVersionHeader() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .havingHeaderEqualTo("Accept", "application/json;version=1") + .respond() + .withBody(readResource("/gdc/gdc.json")) + .withStatus(200); + + final Gdc gdc = gd.getGdcService().getGdc(); + assertThat(gdc, is(notNullValue())); + } } From 8044e786a4aa2196a828cf5bb170ad604f2376f0 Mon Sep 17 00:00:00 2001 From: Juraj Martinka Date: Thu, 5 Feb 2015 17:31:20 +0100 Subject: [PATCH 0159/1191] Add support for creating processes without data, for instance the DATALOAD process --- .../dataload/processes/ProcessService.java | 23 +++++++++++++++++++ .../dataload/processes/ProcessType.java | 3 ++- .../dataload/processes/ProcessServiceIT.java | 18 +++++++++++++++ .../processes/processWithoutData.json | 10 ++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/dataload/processes/processWithoutData.json diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index c383e9948..7c5fae9ef 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -78,6 +78,21 @@ public DataloadProcess createProcess(Project project, DataloadProcess process, F return postProcess(process, processData, getProcessesUri(project)); } + /** + * Create new process without data. + * Only some specific types of processes can be created without data. + * + * @param project project to which the process belongs + * @param process to create + * @return created process + */ + public DataloadProcess createProcess(Project project, DataloadProcess process) { + notNull(project, "project"); + notNull(process, "process"); + + return postProcess(process, getProcessesUri(project)); + } + /** * Update process with given data by given project. * @@ -465,6 +480,14 @@ private DataloadProcess postProcess(DataloadProcess process, File processData, U } } + private DataloadProcess postProcess(DataloadProcess process, URI postUri) { + try { + return restTemplate.postForObject(postUri, process, DataloadProcess.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create dataload process.", e); + } + } + private File createTempFile(String prefix, String suffix) { File tempFile; try { diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessType.java b/src/main/java/com/gooddata/dataload/processes/ProcessType.java index b8f9f8ab1..f0ff8b142 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessType.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessType.java @@ -7,5 +7,6 @@ public enum ProcessType { GRAPH, RUBY, JAVASCRIPT, - GROOVY + GROOVY, + DATALOAD } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 85c2b96c2..fa57129d2 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -67,6 +67,24 @@ public void shouldCreateProcess() throws Exception { assertThat(process.getExecutables(), contains("test.groovy")); } + @Test + public void shouldCreateProcessWithoutData() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROCESSES_PATH) + .respond() + .withBody(readResource("/dataload/processes/processWithoutData.json")) + .withStatus(201); + + final String processName = "dataloadProcess"; + final DataloadProcess process = gd.getProcessService().createProcess(project, + new DataloadProcess(processName, ProcessType.DATALOAD)); + assertThat(process, notNullValue()); + assertThat(process.getName(), is(processName)); + assertThat(process.getType(), is(ProcessType.DATALOAD.toString())); + assertThat(process.getExecutables(), nullValue()); + } + @Test public void shouldListProcesses() throws Exception { onRequest() diff --git a/src/test/resources/dataload/processes/processWithoutData.json b/src/test/resources/dataload/processes/processWithoutData.json new file mode 100644 index 000000000..5bc9fd2e8 --- /dev/null +++ b/src/test/resources/dataload/processes/processWithoutData.json @@ -0,0 +1,10 @@ +{ + "process":{ + "type" : "DATALOAD", + "name" : "dataloadProcess", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/dataload/processes/processId", + "executions" : "/gdc/projects/PROJECT_ID/dataload/processes/processId/executions" + } + } +} \ No newline at end of file From 4ec0f7369555770fe7395c632a253feafa3207dd Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 14 Apr 2015 22:31:39 +0200 Subject: [PATCH 0160/1191] upgrade libraries versions --- pom.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 364e4880e..3d5838a98 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,7 @@ 1.7 UTF-8 UTF-8 - 4.3.2 + 4.3.3 @@ -190,7 +190,7 @@ org.springframework spring-web - 3.2.5.RELEASE + 3.2.13.RELEASE aopalliance @@ -214,7 +214,7 @@ com.fasterxml.jackson.core jackson-databind - 2.5.1 + 2.5.2 test @@ -225,13 +225,13 @@ joda-time joda-time - 2.3 + 2.7 org.testng testng - 6.8.8 + 6.8.21 test @@ -267,13 +267,13 @@ net.jadler jadler-all - 1.1.0 + 1.1.1 test com.shazam shazamcrest - 0.7 + 0.11 test From be29b6546e1ed4415c5a7bddfebb09eb027c32c4 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 5 Feb 2015 14:18:54 +0100 Subject: [PATCH 0161/1191] New ResourceUtils class for reading from resources. --- .../java/com/gooddata/util/ResourceUtils.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/com/gooddata/util/ResourceUtils.java diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java new file mode 100644 index 000000000..e8c9c720f --- /dev/null +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.util; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; + +import org.apache.commons.io.IOUtils; +import org.codehaus.jackson.map.ObjectMapper; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +public class ResourceUtils { + + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + public static T readObjectFromResource(Class testClass, String resourcePath, Class objectClass) { + notNull(testClass, "testClass"); + notEmpty(resourcePath, "resourcePath"); + notNull(objectClass, "objectClass"); + + try { + return OBJECT_MAPPER.readValue(testClass.getResourceAsStream(resourcePath), objectClass); + } catch (IOException e) { + throw new IllegalStateException(format("Cannot read class %s from resource %s", objectClass, resourcePath), e); + } + } + + public static String readStringFromResource(String resourcePath) { + notEmpty(resourcePath, "resourcePath"); + + try { + return IOUtils.toString(ResourceUtils.class.getResourceAsStream(resourcePath), + StandardCharsets.UTF_8); + } catch (IOException e) { + throw new IllegalStateException(format("Cannot read from resource %s", resourcePath), e); + } + } +} From 3d7f424515dda23a0e2346b5ea23dbfbb0b69bd8 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 5 Feb 2015 14:32:40 +0100 Subject: [PATCH 0162/1191] Add support for feature flags to ProjectService. --- .../gooddata/project/ProjectFeatureFlag.java | 134 +++++++++++++++++ .../gooddata/project/ProjectFeatureFlags.java | 36 +++++ .../com/gooddata/project/ProjectService.java | 107 +++++++++++++ src/test/java/com/gooddata/ShowcaseAT.java | 71 +++++++++ .../project/ProjectFeatureFlagTest.java | 45 ++++++ .../project/ProjectFeatureFlagsTest.java | 43 ++++++ .../gooddata/project/ProjectServiceIT.java | 142 +++++++++++++++++- src/test/resources/project/feature-flag.json | 9 ++ src/test/resources/project/feature-flags.json | 29 ++++ 9 files changed, 608 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gooddata/project/ProjectFeatureFlag.java create mode 100644 src/main/java/com/gooddata/project/ProjectFeatureFlags.java create mode 100644 src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java create mode 100644 src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java create mode 100644 src/test/resources/project/feature-flag.json create mode 100644 src/test/resources/project/feature-flags.json diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java new file mode 100644 index 000000000..094c8f681 --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -0,0 +1,134 @@ +package com.gooddata.project; + +import static org.apache.commons.lang.Validate.notNull; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +/** + * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform + * on per project basis. + */ +@JsonTypeName("featureFlag") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class ProjectFeatureFlag { + + public static final String FEATURE_FLAG_URI = ProjectFeatureFlags.FEATURE_FLAGS_URI + "/{featureFlag}"; + public static final UriTemplate FEATURE_FLAG_TEMPLATE = new UriTemplate(FEATURE_FLAG_URI); + + private final String name; + private boolean enabled; + + @JsonIgnore + private Links links; + + /** + * Creates new project feature flag which is by default enabled (true). + * + * @param name unique name of feature flag + */ + public ProjectFeatureFlag(String name) { + this(name, true, null); + } + + /** + * Creates new project feature flag with given value. + * + * @param name unique name of feature flag + * @param enabled true (flag enabled) or false (flag disabled) + */ + public ProjectFeatureFlag(String name, boolean enabled) { + this(name, enabled, null); + } + + @JsonCreator + ProjectFeatureFlag(@JsonProperty("key") String name, + @JsonProperty("value") boolean enabled, + @JsonProperty("links") Links links) { + this.name = name; + this.enabled = enabled; + this.links = links; + } + + @JsonProperty("key") + public String getName() { + return name; + } + + @JsonProperty("value") + public boolean getEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @JsonIgnore + public String getUri() { + notNull(links, "links cannot be null if you want to get feature flag uri!"); + return links.getSelf(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final ProjectFeatureFlag that = (ProjectFeatureFlag) o; + + if (enabled != that.enabled) { + return false; + } + return !(name != null ? !name.equals(that.name) : that.name != null); + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (enabled ? 1 : 0); + return result; + } + + @Override + public String toString() { + return "FeatureFlag{" + + "name='" + name + '\'' + + ", enabled=" + enabled + + ", links=" + links + + '}'; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + static class Links { + private final String self; + @JsonCreator + public Links(@JsonProperty("self") String self) { + this.self = self; + } + + public String getSelf() { + return self; + } + + @Override + public String toString() { + return "Links{" + + "self='" + self + '\'' + + '}'; + } + } +} diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java new file mode 100644 index 000000000..f84eac4ba --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java @@ -0,0 +1,36 @@ +package com.gooddata.project; + +import static org.springframework.util.CollectionUtils.isEmpty; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("featureFlags") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectFeatureFlags { + + public static final String FEATURE_FLAGS_URI = Project.URI + "/projectFeatureFlags"; + public static final UriTemplate FEATURE_FLAGS_TEMPLATE = new UriTemplate(FEATURE_FLAGS_URI); + + private final List items = new ArrayList<>(); + + @JsonCreator + ProjectFeatureFlags(@JsonProperty("items") List items) { + if (!isEmpty(items)) { + this.items.addAll(items); + } + } + + public List getItems() { + return items; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 89881a640..67b6b129c 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -28,6 +28,8 @@ import java.util.List; import java.util.Set; +import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; @@ -341,4 +343,109 @@ public Role getRoleByUri(String uri) { throw new GoodDataException("Unable to get role " + uri, e); } } + + /** + * Lists all feature flags for given project. + * It doesn't matter wheter feature flag is enabled or not, it'll be included in all cases. + * + * @param project project, cannot be null + * @return list of all feature flags for given project + */ + public List listFeatureFlags(Project project) { + notNull(project, "project cannot be null!"); + try { + final ProjectFeatureFlags projectFeatureFlags = + restTemplate.getForObject(FEATURE_FLAGS_TEMPLATE.expand(project.getId()), ProjectFeatureFlags.class); + + if (projectFeatureFlags == null) { + throw new GoodDataException("empty response from API call"); + } + + return projectFeatureFlags.getItems(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list project feature flags for project ID=" + project.getId(), e); + } + } + + /** + * Creates new feature flag for given project. + * + * Usually, it doesn't make sense to create feature flag that is disabled because + * this is the same as having no feature flag at all. + * + * @param project project for which the feature flag should be created, cannot be null + * @param featureFlag feature flag to be created, cannot be null + */ + public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { + notNull(project, "project cannot be null!"); + notNull(featureFlag, "featureFlag cannot be null!"); + + final String featureFlagsUri = FEATURE_FLAGS_TEMPLATE.expand(project.getId()).toString(); + + try { + final URI featureFlagUri = restTemplate.postForLocation(featureFlagsUri, featureFlag); + notNull(featureFlagsUri, "URI of new featureFlag should not be null!"); + return getFeatureFlag(featureFlagUri.toString()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create feature flag: " + featureFlag, e); + } + } + + /** + * Get feature flag by unique name (aka "key"). + * + * @param project project, cannot be null + * @param featureFlagName name of feature flag, cannot be empty + * @return feature flag + */ + public ProjectFeatureFlag getFeatureFlag(final Project project, final String featureFlagName) { + notNull(project, "project cannot be null!"); + notEmpty(featureFlagName, "featureFlagName cannot be empty!"); + + return restTemplate.getForObject(getFeatureFlagUri(project, featureFlagName), ProjectFeatureFlag.class); + } + + /** + * Updates existing feature flag. + * Note that it doesn't make sense to update any other field than {@link ProjectFeatureFlag#enabled}. + * + * @param featureFlag updated feature flag + * @return updated feature flag + */ + public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag) { + notNull(featureFlag, "featureFlag cannot be null!"); + notEmpty(featureFlag.getUri(), "featureFlag uri cannot be empty!"); + + try { + restTemplate.put(featureFlag.getUri(), featureFlag); + return getFeatureFlag(featureFlag.getUri()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create feature flag: " + featureFlag, e); + } + } + + /** + * Deletes existing project feature flag. + * + * @param featureFlag existing project feature flag with links set properly, cannot be null + */ + public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { + notNull(featureFlag, "featureFlag cannot be null!"); + notEmpty(featureFlag.getUri(), "featureFlag uri cannot be empty!"); + + try { + restTemplate.delete(featureFlag.getUri()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to delete feature flag=" + featureFlag, e); + } + } + + + private ProjectFeatureFlag getFeatureFlag(String featureFlagUri) { + return restTemplate.getForObject(featureFlagUri, ProjectFeatureFlag.class); + } + + private String getFeatureFlagUri(final Project project, final String featureFlagName) { + return FEATURE_FLAG_TEMPLATE.expand(project.getId(), featureFlagName).toString(); + } } diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index c26881b0b..81598e173 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -24,6 +24,7 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; import com.gooddata.model.ModelService; +import com.gooddata.project.ProjectFeatureFlag; import com.gooddata.project.Project; import com.gooddata.project.ProjectService; import com.gooddata.project.ProjectValidationResults; @@ -39,6 +40,7 @@ import org.apache.commons.io.IOUtils; import org.joda.time.LocalDate; import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -63,6 +65,7 @@ import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.hasSize; @@ -71,9 +74,12 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.testng.AssertJUnit.fail; public class ShowcaseAT { + private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; + private String title; private GoodData gd; private Project project; @@ -173,6 +179,62 @@ public void validateProject() throws Exception { assertThat(results.getResults(), is(notNullValue())); } + @Test(groups = "project", dependsOnMethods = "createProject") + public void createProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); + checkFeatureFlag(featureFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void listProjectFeatureFlags() throws Exception { + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); + + final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(project); + + assertThat(projectFeatureFlags, containsInAnyOrder( + new ProjectFeatureFlag("mostRecentFeatureFlag", true), + new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void getProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); + checkFeatureFlag(featureFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "getProjectFeatureFlag") + public void updateProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); + + // disable (update) feature flag + featureFlag.setEnabled(false); + final ProjectFeatureFlag disabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); + checkFeatureFlag(disabledFlag, false); + + // enable again + featureFlag.setEnabled(true); + final ProjectFeatureFlag enabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); + checkFeatureFlag(enabledFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void deleteProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("temporaryFeatureFlag")); + + gd.getProjectService().deleteFeatureFlag(featureFlag); + + try { + gd.getProjectService().getFeatureFlag(project, featureFlag.getName()); + fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); + } catch (GoodDataRestException e) { + assertThat(e.getStatusCode(), is(HttpStatus.NOT_FOUND.value())); + } + } + @Test(groups = "model", dependsOnGroups = "project") public void createModel() throws Exception { final ModelService modelService = gd.getModelService(); @@ -358,4 +420,13 @@ public void removeProcess() throws Exception { final Collection processes = gd.getProcessService().listProcesses(project); assertThat(processes, not(hasItem(hasSameIdAs(process)))); } + + + + private void checkFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); + assertThat(featureFlag.getEnabled(), is(expectedValue)); + } + } diff --git a/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java b/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java new file mode 100644 index 000000000..1151ca2d3 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java @@ -0,0 +1,45 @@ +package com.gooddata.project; + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.testng.AssertJUnit.assertTrue; + +import org.testng.annotations.Test; + +import java.io.IOException; + +public class ProjectFeatureFlagTest { + + @Test + public void testDeserialize() { + final ProjectFeatureFlag featureFlag = readObjectFromResource(getClass(), "/project/feature-flag.json", ProjectFeatureFlag.class); + assertThat(featureFlag.getName(), is("myCoolFeature")); + assertTrue(featureFlag.getEnabled()); + assertThat(featureFlag.getUri(), is("/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature")); + } + + @Test + public void testSerializeDefaultValueTrue() throws IOException { + checkFeatureFlagSerialization(new ProjectFeatureFlag("myFeature"), true); + } + + @Test + public void testSerializeWithValueFalse() throws IOException { + checkFeatureFlagSerialization(new ProjectFeatureFlag("myFeature", false), false); + } + + + private void checkFeatureFlagSerialization(ProjectFeatureFlag featureFlag, boolean expectedValue) throws IOException { + final String serializedFeatureFlag = OBJECT_MAPPER.writeValueAsString(featureFlag); + + assertThat(serializedFeatureFlag, startsWith("{\"featureFlag\"")); + assertThat(serializedFeatureFlag, containsString("\"key\":\"myFeature\"")); + assertThat(serializedFeatureFlag, containsString("\"value\":" + expectedValue)); + assertThat(serializedFeatureFlag, not(containsString("\"links\""))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java new file mode 100644 index 000000000..9195bf804 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java @@ -0,0 +1,43 @@ +package com.gooddata.project; + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.testng.AssertJUnit.assertNotNull; + +import org.testng.annotations.Test; + +import java.io.IOException; + +public class ProjectFeatureFlagsTest { + + @Test + public void testDeserialize() { + final ProjectFeatureFlags featureFlags = readObjectFromResource(getClass(), "/project/feature-flags.json", + ProjectFeatureFlags.class); + assertNotNull(featureFlags); + + assertThat(featureFlags.getItems(), contains( + new ProjectFeatureFlag("myCoolFeature", true), + new ProjectFeatureFlag("mySuperCoolFeature", true), + new ProjectFeatureFlag("mySuperSecretFeature", false))); + } + + @Test + public void testSerialize() throws IOException { + final ProjectFeatureFlags projectFeatureFlags = new ProjectFeatureFlags(asList( + new ProjectFeatureFlag("enabledFeatureFlag", true), + new ProjectFeatureFlag("disabledFeatureFlag", false))); + + final String serializedFeatureFlags = OBJECT_MAPPER.writeValueAsString(projectFeatureFlags); + + assertThat(serializedFeatureFlags, startsWith("{\"featureFlags\"")); + assertThat(serializedFeatureFlags, containsString("\"key\":\"enabledFeatureFlag\",\"value\":true")); + assertThat(serializedFeatureFlags, containsString("\"key\":\"disabledFeatureFlag\",\"value\":false")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 04f0ea148..15c85b997 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -11,9 +11,13 @@ import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.isJsonString; +import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; +import static com.gooddata.util.ResourceUtils.readStringFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -25,7 +29,9 @@ public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final String PROJECT_URI = "/gdc/projects/PROJECT_ID"; + + private static final String PROJECT_ID = "PROJECT_ID"; + private static final String PROJECT_URI = "/gdc/projects/" + PROJECT_ID; private Project loading; private Project enabled; @@ -128,7 +134,7 @@ public void shouldRemoveProject() throws Exception { @Test public void shouldReturnProjectTemplates() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT_ID/templates") + .havingPathEqualTo("/gdc/md/" + PROJECT_ID + "/templates") .respond() .withBody(readResource("/project/project-templates.json")); @@ -137,12 +143,12 @@ public void shouldReturnProjectTemplates() throws Exception { assertThat(templates, hasSize(1)); } - @Test + @Test public void shouldReturnAvailableValidations() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT_ID/validate") - .respond() - .withBody(readResource("/project/project-validationAvail.json")); + .havingPathEqualTo("/gdc/md/" + PROJECT_ID + "/validate") + .respond() + .withBody(readResource("/project/project-validationAvail.json")); final Set validations = gd.getProjectService().getAvailableProjectValidationTypes(enabled); assertThat(validations, notNullValue()); @@ -152,7 +158,7 @@ public void shouldReturnAvailableValidations() throws Exception { @Test public void shouldValidateProject() throws Exception { - final String validateUri = "/gdc/md/PROJECT_ID/validate"; + final String validateUri = "/gdc/md/" + PROJECT_ID + "/validate"; final String task1Uri = validateUri + "/task/TASK_ID"; final String task2Uri = validateUri + "/task/TASK_ID2"; final String resultUri = validateUri + "/result/RESULT_ID"; @@ -200,7 +206,7 @@ public void shouldValidateProject() throws Exception { @Test public void shouldValidateProject2() throws Exception { - final String validateUri = "/gdc/md/PROJECT_ID/validate"; + final String validateUri = "/gdc/md/" + PROJECT_ID + "/validate"; final String task1Uri = validateUri + "/task/TASK_ID"; final String task2Uri = validateUri + "/task/TASK_ID2"; final String resultUri = validateUri + "/result/RESULT_ID"; @@ -312,4 +318,124 @@ public void shouldListPagedUsers() throws Exception { assertThat(secondPage, empty()); } + @Test + public void shouldListProjectFeatureFlags() throws Exception { + + mockListFeatureFlagsRequest(); + + final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(enabled); + + assertThat(projectFeatureFlags, contains( + new ProjectFeatureFlag("myCoolFeature", true), + new ProjectFeatureFlag("mySuperCoolFeature", true), + new ProjectFeatureFlag("mySuperSecretFeature", false))); + } + + @Test + public void shouldGetProjectFeatureFlag() { + final String featureFlagName = "myCoolFeature"; + + mockGetFeatureFlagRequest(getFeatureFlagUri(featureFlagName), true); + + final ProjectFeatureFlag featureFlag = gd.getProjectService().getFeatureFlag(enabled, featureFlagName); + + checkFeatureFlag(featureFlag, featureFlagName, true); + } + + @Test + public void shouldSetProjectFeatureFlag() { + final String featureFlagName = "myCoolFeature"; + + final String featureFlagUri = getFeatureFlagUri(featureFlagName); + + mockCreateFeatureFlagRequest(featureFlagUri); + + mockGetFeatureFlagRequest(featureFlagUri, true); + + final ProjectFeatureFlag featureFlag = gd.getProjectService().createFeatureFlag(enabled, + new ProjectFeatureFlag(featureFlagName)); + + checkFeatureFlag(featureFlag, featureFlagName, true); + } + + @Test + public void shouldDisableExistingFeatureFlag() { + + final String featureFlagName = "myCoolFeature"; + + final String featureFlagUri = getFeatureFlagUri(featureFlagName); + mockUpdateFeatureFlagRequest(featureFlagUri); + mockGetFeatureFlagRequest(featureFlagUri, false); + + final ProjectFeatureFlag updatedFeatureFlag = gd.getProjectService().updateFeatureFlag( + new ProjectFeatureFlag(featureFlagName, false, new ProjectFeatureFlag.Links(featureFlagUri))); + + checkFeatureFlag(updatedFeatureFlag, featureFlagName, false); + } + + @Test + public void shouldDeleteExistingFeatureFlag() { + + final String featureFlagName = "myCoolFeature"; + + final String featureFlagUri = getFeatureFlagUri(featureFlagName); + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(featureFlagUri) + .respond() + .withStatus(204); + + gd.getProjectService().deleteFeatureFlag(new ProjectFeatureFlag(featureFlagName, true, + new ProjectFeatureFlag.Links(featureFlagUri))); + } + + + private String getFeatureFlagUri(String featureFlagName) { + return FEATURE_FLAG_TEMPLATE.expand(PROJECT_ID, featureFlagName).toString(); + } + + private void mockListFeatureFlagsRequest() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) + .respond() + .withBody(readStringFromResource("/project/feature-flags.json")) + .withStatus(200); + } + + private void mockCreateFeatureFlagRequest(String featureFlagUri) { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) + .respond() + .withHeader("Location", featureFlagUri) + .withStatus(201); + } + + private void mockGetFeatureFlagRequest(String featureFlagUri, boolean featureFlagValue) { + final String jsonWithValue = readStringFromResource("/project/feature-flag.json") + .replaceAll("\"value\"\\s*:\\s*(true|false)", + "\"value\" : " + featureFlagValue); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(featureFlagUri) + .respond() + .withBody(jsonWithValue) + .withStatus(200); + } + + private void mockUpdateFeatureFlagRequest(String featureFlagUri) { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(featureFlagUri) + .respond() + .withStatus(200); + } + + private void checkFeatureFlag(ProjectFeatureFlag featureFlag, String expectedName, boolean expectedValue) { + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(expectedName)); + assertThat(featureFlag.getEnabled(), is(expectedValue)); + } + } \ No newline at end of file diff --git a/src/test/resources/project/feature-flag.json b/src/test/resources/project/feature-flag.json new file mode 100644 index 000000000..26916a200 --- /dev/null +++ b/src/test/resources/project/feature-flag.json @@ -0,0 +1,9 @@ +{ + "featureFlag" : { + "key" : "myCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" + } + } +} \ No newline at end of file diff --git a/src/test/resources/project/feature-flags.json b/src/test/resources/project/feature-flags.json new file mode 100644 index 000000000..1e77993a7 --- /dev/null +++ b/src/test/resources/project/feature-flags.json @@ -0,0 +1,29 @@ +{ + "featureFlags" : { + "items" : [ { + "featureFlag" : { + "key" : "myCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" + } + } + }, { + "featureFlag" : { + "key" : "mySuperCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperCoolFeature" + } + } + }, { + "featureFlag" : { + "key" : "mySuperSecretFeature", + "value" : false, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperSecretFeature" + } + } + }] + } +} \ No newline at end of file From 9442612c8af9b8272f600595a8ad2c2d6dff5126 Mon Sep 17 00:00:00 2001 From: Juraj Martinka Date: Fri, 10 Apr 2015 14:41:13 +0200 Subject: [PATCH 0163/1191] Replace AbstractGoodDataIT#readResource with ResourceUtils#readFromResource --- .../java/com/gooddata/AbstractGoodDataIT.java | 5 +-- .../connector/ConnectorServiceIT.java | 18 +++++---- .../dataload/processes/ProcessServiceIT.java | 38 ++++++++++--------- .../gooddata/dataset/DatasetServiceIT.java | 36 +++++++++--------- .../com/gooddata/gdc/DataStoreServiceIT.java | 6 ++- .../java/com/gooddata/gdc/GdcServiceIT.java | 6 ++- .../com/gooddata/md/MetadataServiceIT.java | 22 ++++++----- .../com/gooddata/model/ModelServiceIT.java | 10 +++-- .../gooddata/project/ProjectServiceIT.java | 31 +++++++-------- .../com/gooddata/report/ReportServiceIT.java | 7 ++-- .../java/com/gooddata/util/ResourceUtils.java | 23 ++++++++--- .../warehouse/WarehouseServiceIT.java | 22 ++++++----- 12 files changed, 125 insertions(+), 99 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 3e222f6c7..0f7eec2fe 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -3,6 +3,7 @@ */ package com.gooddata; +import com.gooddata.util.ResourceUtils; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.codehaus.jackson.map.ObjectMapper; @@ -38,8 +39,4 @@ protected HttpClient createHttpClient(final String login, final String password, public void tearDown() { closeJadler(); } - - protected InputStream readResource(String path) { - return notNull(getClass().getResourceAsStream(path), "resource denote by path: " + path); - } } diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 013a36e10..92c1cb857 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -4,11 +4,13 @@ import com.gooddata.GoodDataException; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import static com.gooddata.connector.Status.Code.ERROR; import static com.gooddata.connector.Status.Code.SYNCHRONIZED; +import static com.gooddata.util.ResourceUtils.*; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -20,7 +22,7 @@ public class ConnectorServiceIT extends AbstractGoodDataIT { @BeforeMethod public void setUp() throws Exception { - project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); connectors = gd.getConnectorService(); } @@ -29,13 +31,13 @@ public void shouldCreateIntegration() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/PROJECT_ID/templates") .respond() - .withBody(readResource("/project/project-templates.json")); + .withBody(readFromResource("/project/project-templates.json")); onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") .respond() - .withBody(readResource("/connector/integration.json")); + .withBody(readFromResource("/connector/integration.json")); onRequest() .havingMethodEqualTo("PUT") @@ -54,7 +56,7 @@ public void shouldGetIntegration() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") .respond() - .withBody(readResource("/connector/integration.json")); + .withBody(readFromResource("/connector/integration.json")); final Integration integration = connectors.getIntegration(project, ConnectorType.ZENDESK4); assertThat(integration, notNullValue()); @@ -77,7 +79,7 @@ public void shouldUpdateIntegration() throws Exception { .havingMethodEqualTo("PUT") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration") .respond() - .withBody(readResource("/connector/integration.json")); + .withBody(readFromResource("/connector/integration.json")); final Integration integration = new Integration("/projectTemplates/template"); connectors.updateIntegration(project, ConnectorType.ZENDESK4, integration); @@ -105,9 +107,9 @@ public void shouldExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connector/process-status-scheduled.json")) + .withBody(readFromResource("/connector/process-status-scheduled.json")) .thenRespond() - .withBody(readResource("/connector/process-status-finished.json")) + .withBody(readFromResource("/connector/process-status-finished.json")) ; final ProcessStatus process = connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); @@ -139,7 +141,7 @@ public void shouldFailExecuteProcess() throws Exception { onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() - .withBody(readResource("/connector/process-status-error.json")); + .withBody(readFromResource("/connector/process-status-error.json")); final ProcessStatus process = connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); assertThat(process.getStatus().getCode(), is(ERROR.name())); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index fa57129d2..7e947ae0d 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -4,6 +4,7 @@ import com.gooddata.FutureResult; import com.gooddata.collections.PageableList; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -12,6 +13,7 @@ import java.io.File; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; import static org.hamcrest.MatcherAssert.assertThat; @@ -47,9 +49,9 @@ public class ProcessServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readResource("/project/project.json"), Project.class); - process = MAPPER.readValue(readResource("/dataload/processes/process.json"), DataloadProcess.class); - schedule = MAPPER.readValue(readResource("/dataload/processes/schedule.json"), Schedule.class); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + process = MAPPER.readValue(readFromResource("/dataload/processes/process.json"), DataloadProcess.class); + schedule = MAPPER.readValue(readFromResource("/dataload/processes/schedule.json"), Schedule.class); file = File.createTempFile("test", ".groovy"); } @@ -59,7 +61,7 @@ public void shouldCreateProcess() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(PROCESSES_PATH) .respond() - .withBody(readResource("/dataload/processes/process.json")) + .withBody(readFromResource("/dataload/processes/process.json")) .withStatus(201); final DataloadProcess process = gd.getProcessService().createProcess(project, new DataloadProcess("testProcess", "GROOVY"), file); @@ -73,7 +75,7 @@ public void shouldCreateProcessWithoutData() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(PROCESSES_PATH) .respond() - .withBody(readResource("/dataload/processes/processWithoutData.json")) + .withBody(readFromResource("/dataload/processes/processWithoutData.json")) .withStatus(201); final String processName = "dataloadProcess"; @@ -91,7 +93,7 @@ public void shouldListProcesses() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESSES_PATH) .respond() - .withBody(readResource("/dataload/processes/processes.json")) + .withBody(readFromResource("/dataload/processes/processes.json")) .withStatus(200); final Collection processes = gd.getProcessService().listProcesses(project); @@ -105,7 +107,7 @@ public void shouldGetProcess() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(PROCESS_PATH) .respond() - .withBody(readResource("/dataload/processes/process.json")) + .withBody(readFromResource("/dataload/processes/process.json")) .withStatus(200); final DataloadProcess process = gd.getProcessService().getProcessById(project, PROCESS_ID); @@ -160,7 +162,7 @@ public void shouldGetExecutionLog() throws Exception { .withStatus(200); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - final ProcessExecutionDetail executionDetail = MAPPER.readValue(readResource("/dataload/processes/executionDetail.json"), ProcessExecutionDetail.class); + final ProcessExecutionDetail executionDetail = MAPPER.readValue(readFromResource("/dataload/processes/executionDetail.json"), ProcessExecutionDetail.class); gd.getProcessService().getExecutionLog(executionDetail, outputStream); assertThat(outputStream.toString(), is(log)); } @@ -171,7 +173,7 @@ public void shouldExecuteProcess() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(EXECUTIONS_PATH) .respond() - .withBody(readResource("/dataload/processes/executionTask.json")) + .withBody(readFromResource("/dataload/processes/executionTask.json")) .withHeader("Location", EXECUTION_PATH) .withStatus(201); onRequest() @@ -185,13 +187,13 @@ public void shouldExecuteProcess() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_DETAIL_PATH) .respond() - .withBody(readResource("/dataload/processes/executionDetail-success.json")) + .withBody(readFromResource("/dataload/processes/executionDetail-success.json")) .withStatus(200); final FutureResult result = gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")); final ProcessExecutionDetail executionDetail = result.get(); - assertJsonEquals(MAPPER.readValue(readResource("/dataload/processes/executionDetail-success.json"), ProcessExecutionDetail.class), executionDetail); + assertJsonEquals(MAPPER.readValue(readFromResource("/dataload/processes/executionDetail-success.json"), ProcessExecutionDetail.class), executionDetail); } @Test(expectedExceptions = ProcessExecutionException.class) @@ -200,7 +202,7 @@ public void shouldThrowOnExecuteProcessError() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(EXECUTIONS_PATH) .respond() - .withBody(readResource("/dataload/processes/executionTask.json")) + .withBody(readFromResource("/dataload/processes/executionTask.json")) .withHeader("Location", EXECUTION_PATH) .withStatus(201); onRequest() @@ -213,7 +215,7 @@ public void shouldThrowOnExecuteProcessError() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(EXECUTION_DETAIL_PATH) .respond() - .withBody(readResource("/dataload/processes/executionDetail.json")) + .withBody(readFromResource("/dataload/processes/executionDetail.json")) .withStatus(200); gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")).get(); @@ -225,7 +227,7 @@ public void shouldCreateSchedule() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(SCHEDULES_PATH) .respond() - .withBody(readResource("/dataload/processes/schedule.json")) + .withBody(readFromResource("/dataload/processes/schedule.json")) .withStatus(201); final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, EXECUTABLE, "0 0 * * *")); @@ -239,7 +241,7 @@ public void shouldUpdateSchedule() throws Exception { .havingMethodEqualTo("PUT") .havingPathEqualTo(SCHEDULE_PATH) .respond() - .withBody(readResource("/dataload/processes/schedule-disabled.json")) + .withBody(readFromResource("/dataload/processes/schedule-disabled.json")) .withStatus(200); schedule.setState(ScheduleState.DISABLED); @@ -254,14 +256,14 @@ public void shouldListPagedSchedules() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(SCHEDULES_PATH) .respond() - .withBody(readResource("/dataload/processes/schedules_page1.json")) + .withBody(readFromResource("/dataload/processes/schedules_page1.json")) .withStatus(200); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(SCHEDULES_PATH) .havingQueryStringEqualTo("offset=1&limit=1") .respond() - .withBody(readResource("/dataload/processes/schedules_page2.json")) + .withBody(readFromResource("/dataload/processes/schedules_page2.json")) .withStatus(200); final PageableList firstPage = gd.getProcessService().listSchedules(project); @@ -282,7 +284,7 @@ public void shouldGetSchedule() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(SCHEDULE_PATH) .respond() - .withBody(readResource("/dataload/processes/schedule.json")) + .withBody(readFromResource("/dataload/processes/schedule.json")) .withStatus(200); final Schedule schedule = gd.getProcessService().getScheduleById(project, SCHEDULE_ID); diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index c7e8b76ec..944ab5a30 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -4,6 +4,7 @@ import com.gooddata.GoodDataException; import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -13,6 +14,7 @@ import java.io.IOException; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; @@ -32,7 +34,7 @@ public class DatasetServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUpClass() throws Exception { - project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); } @BeforeMethod @@ -41,7 +43,7 @@ public void setUp() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc") .respond() - .withBody(readResource("/gdc/gdc.json")); + .withBody(readFromResource("/gdc/gdc.json")); onRequest() .havingPath(startsWith("/uploads/")) .havingMethodEqualTo("PUT") @@ -52,7 +54,7 @@ public void setUp() throws Exception { .havingMethodEqualTo("POST") .respond() .withStatus(201) - .withBody(readResource("/dataset/pullTask.json")); + .withBody(readFromResource("/dataset/pullTask.json")); } @Test @@ -61,12 +63,12 @@ public void shouldLoadDataset() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") .respond() .withStatus(202) - .withBody(readResource("/dataset/pullTask.json")) + .withBody(readFromResource("/dataset/pullTask.json")) .thenRespond() .withStatus(200) - .withBody(readResource("/dataset/pullTaskStatusOk.json")); + .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); - final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); } @@ -76,12 +78,12 @@ public void shouldLoadDatasets() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") .respond() .withStatus(202) - .withBody(readResource("/dataset/pullTask.json")) + .withBody(readFromResource("/dataset/pullTask.json")) .thenRespond() .withStatus(200) - .withBody(readResource("/dataset/pullTaskStatusOk.json")); + .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); - final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); final InputStream source = new ByteArrayInputStream(new byte[]{}); manifest.setSource(source); @@ -96,7 +98,7 @@ public void shouldFailPolling() throws Exception { .respond() .withStatus(400); - final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); } @@ -106,8 +108,8 @@ public void shouldFailLoading() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") .respond() .withStatus(200) - .withBody(readResource("/dataset/pullTaskStatusError.json")); - final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + .withBody(readFromResource("/dataset/pullTaskStatusError.json")); + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); try { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); @@ -122,13 +124,13 @@ public void shouldReadErrorMessages() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") .respond() .withStatus(200) - .withBody(readResource("/dataset/pullTaskStatusError.json")); + .withBody(readFromResource("/dataset/pullTaskStatusError.json")); onRequest() .havingPath(containsString("upload_status.json")) .havingMethodEqualTo("GET") .respond() .withStatus(200) - .withBody(readResource("/dataset/failStatusComplex.json")); + .withBody(readFromResource("/dataset/failStatusComplex.json")); onRequest() .havingPath(containsString("d_adstpch_querynum.csv.log")) .havingMethodEqualTo("GET") @@ -136,7 +138,7 @@ public void shouldReadErrorMessages() throws Exception { .withStatus(200) .withBody(MAPPER.writeValueAsString(new String[]{"Very error indeed"})); - final DatasetManifest manifest = MAPPER.readValue(readResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); try { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); @@ -151,7 +153,7 @@ public void shouldGetDatasetManifest() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface/foo/manifest") .respond() - .withBody(readResource("/dataset/datasetManifest.json")) + .withBody(readFromResource("/dataset/datasetManifest.json")) ; final DatasetManifest manifest = gd.getDatasetService().getDatasetManifest(project, "foo"); @@ -164,7 +166,7 @@ public void shouldListDatasets() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface") .respond() - .withBody(readResource("/dataset/datasets.json")) + .withBody(readFromResource("/dataset/datasets.json")) ; final Collection datasets = gd.getDatasetService().listDatasets(project); diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 8e4a8b804..67da5e316 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -1,6 +1,7 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; +import com.gooddata.util.ResourceUtils; import org.apache.commons.io.IOUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -8,6 +9,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; @@ -26,7 +28,7 @@ public void setUp() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc") .respond() - .withBody(readResource("/gdc/gdc.json")) + .withBody(readFromResource("/gdc/gdc.json")) .withStatus(200); content = new ByteArrayInputStream("test".getBytes()); } @@ -43,7 +45,7 @@ public void shouldUploadRelative() throws Exception { @Test public void shouldUploadWithFullStagingLink() throws Exception { - final String gdcBody = IOUtils.toString(readResource("/gdc/gdc.json")) + final String gdcBody = IOUtils.toString(readFromResource("/gdc/gdc.json")) .replaceAll("/uploads", "http://localhost:" + port() + "/uploads"); onRequest() .havingMethodEqualTo("GET") diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index 3e17b56ac..9172c9e1f 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -1,8 +1,10 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; +import com.gooddata.util.ResourceUtils; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -16,7 +18,7 @@ public void shouldReturnGdc() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc") .respond() - .withBody(readResource("/gdc/gdc.json")) + .withBody(readFromResource("/gdc/gdc.json")) .withStatus(200); final Gdc gdc = gd.getGdcService().getGdc(); @@ -31,7 +33,7 @@ public void shouldUseProperVersionHeader() throws Exception { .havingPathEqualTo("/gdc") .havingHeaderEqualTo("Accept", "application/json;version=1") .respond() - .withBody(readResource("/gdc/gdc.json")) + .withBody(readFromResource("/gdc/gdc.json")) .withStatus(200); final Gdc gdc = gd.getGdcService().getGdc(); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 403637052..1f225d204 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -7,6 +7,7 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -15,6 +16,7 @@ import java.util.Collection; import java.util.List; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; @@ -37,8 +39,8 @@ public class MetadataServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readResource("/project/project.json"), Project.class); - metricInput = MAPPER.readValue(readResource("/md/metric-input.json"), Metric.class); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + metricInput = MAPPER.readValue(readFromResource("/md/metric-input.json"), Metric.class); } @Test @@ -95,7 +97,7 @@ public void shouldCreateObj() throws Exception { .havingPathEqualTo(SPECIFIC_OBJ_URI) .respond() .withStatus(200) - .withBody(readResource("/md/metric.json")); + .withBody(readFromResource("/md/metric.json")); final Obj result = gd.getMetadataService().createObj(project, metricInput); @@ -112,7 +114,7 @@ public void shouldGetObjByUri() throws Exception { .havingPathEqualTo(SPECIFIC_OBJ_URI) .respond() .withStatus(200) - .withBody(readResource("/md/metric.json")); + .withBody(readFromResource("/md/metric.json")); final Obj result = gd.getMetadataService().getObjByUri(SPECIFIC_OBJ_URI, Metric.class); @@ -129,7 +131,7 @@ public void shouldGetObjById() throws Exception { .havingPathEqualTo(SPECIFIC_OBJ_URI) .respond() .withStatus(200) - .withBody(readResource("/md/metric.json")); + .withBody(readFromResource("/md/metric.json")); final Obj result = gd.getMetadataService().getObjById(project, ID, Metric.class); @@ -147,7 +149,7 @@ public void shouldGetObjUriByRestrictions() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") .respond() .withStatus(200) - .withBody(readResource("/md/query.json")); + .withBody(readFromResource("/md/query.json")); final String result = gd.getMetadataService().getObjUri(project, Attribute.class, Restriction.title("Resource")); @@ -162,13 +164,13 @@ public void shouldGetObjByRestrictions() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") .respond() .withStatus(200) - .withBody(readResource("/md/query.json")); + .withBody(readFromResource("/md/query.json")); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/md/PROJ_ID/obj/118") .respond() .withStatus(200) - .withBody(readResource("/md/attribute.json")); + .withBody(readFromResource("/md/attribute.json")); final Obj result = gd.getMetadataService().getObj(project, Attribute.class, Restriction.title("Name")); @@ -185,7 +187,7 @@ public void shouldFindByRestrictions() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") .respond() .withStatus(200) - .withBody(readResource("/md/query.json")); + .withBody(readFromResource("/md/query.json")); final Collection result = gd.getMetadataService() .find(project, Attribute.class, Restriction.summary("")); @@ -201,7 +203,7 @@ public void shouldFindUrisByRestrictions() throws Exception { .havingPathEqualTo("/gdc/md/PROJECT_ID/query/attributes") .respond() .withStatus(200) - .withBody(readResource("/md/query.json")); + .withBody(readFromResource("/md/query.json")); final Collection result = gd.getMetadataService() .findUris(project, Attribute.class, Restriction.summary("")); diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index df4fb5975..90945e0c4 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -4,10 +4,12 @@ import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import static com.gooddata.model.ModelDiff.UpdateScript; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -24,7 +26,7 @@ public class ModelServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readResource("/project/project.json"), Project.class); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); } @Test @@ -43,7 +45,7 @@ public void shouldCreateDiff() throws Exception { .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))) .thenRespond() .withStatus(200) - .withBody(readResource("/model/modelDiff.json")) + .withBody(readFromResource("/model/modelDiff.json")) ; final ModelDiff diff = gd.getModelService().getProjectModelDiff(project, "xxx").get(); @@ -77,7 +79,7 @@ public void shouldUpdateModel() throws Exception { .havingPathEqualTo(LDM_MANAGE2) .respond() .withStatus(202) - .withBody(readResource("/model/maqlDdlLinks.json")); + .withBody(readFromResource("/model/maqlDdlLinks.json")); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(STATUS_URI) @@ -103,7 +105,7 @@ public void shouldFailUpdateModel() throws Exception { .havingPathEqualTo(LDM_MANAGE2) .respond() .withStatus(202) - .withBody(readResource("/model/maqlDdlLinks.json")); + .withBody(readFromResource("/model/maqlDdlLinks.json")); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(STATUS_URI) diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 15c85b997..aa63808a1 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -13,6 +13,7 @@ import static com.gooddata.JsonMatchers.isJsonString; import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; +import static com.gooddata.util.ResourceUtils.readFromResource; import static com.gooddata.util.ResourceUtils.readStringFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; @@ -39,9 +40,9 @@ public class ProjectServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - loading = MAPPER.readValue(readResource("/project/project-loading.json"), Project.class); - enabled = MAPPER.readValue(readResource("/project/project.json"), Project.class); - deleted = MAPPER.readValue(readResource("/project/project-deleted.json"), Project.class); + loading = MAPPER.readValue(readFromResource("/project/project-loading.json"), Project.class); + enabled = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + deleted = MAPPER.readValue(readFromResource("/project/project-deleted.json"), Project.class); } @Test @@ -136,7 +137,7 @@ public void shouldReturnProjectTemplates() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/" + PROJECT_ID + "/templates") .respond() - .withBody(readResource("/project/project-templates.json")); + .withBody(readFromResource("/project/project-templates.json")); final Collection templates = gd.getProjectService().getProjectTemplates(enabled); assertThat(templates, is(notNullValue())); @@ -148,7 +149,7 @@ public void shouldReturnAvailableValidations() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/" + PROJECT_ID + "/validate") .respond() - .withBody(readResource("/project/project-validationAvail.json")); + .withBody(readFromResource("/project/project-validationAvail.json")); final Set validations = gd.getProjectService().getAvailableProjectValidationTypes(enabled); assertThat(validations, notNullValue()); @@ -166,7 +167,7 @@ public void shouldValidateProject() throws Exception { onRequest() .havingPathEqualTo(validateUri) .respond() - .withBody(readResource("/project/project-validationAvail.json")); + .withBody(readFromResource("/project/project-validationAvail.json")); onRequest() .havingPathEqualTo(validateUri) @@ -196,7 +197,7 @@ public void shouldValidateProject() throws Exception { onRequest() .havingPathEqualTo(resultUri) .respond() - .withBody(readResource("/project/project-validationResults.json")) + .withBody(readFromResource("/project/project-validationResults.json")) .withStatus(200); final ProjectValidationResults validateResult = gd.getProjectService().validateProject(enabled).get(); @@ -214,7 +215,7 @@ public void shouldValidateProject2() throws Exception { onRequest() .havingPathEqualTo(validateUri) .respond() - .withBody(readResource("/project/project-validationAvail.json")); + .withBody(readFromResource("/project/project-validationAvail.json")); onRequest() .havingPathEqualTo(validateUri) @@ -242,7 +243,7 @@ public void shouldValidateProject2() throws Exception { onRequest() .havingPathEqualTo(resultUri) .respond() - .withBody(readResource("/project/project-validationResults.json")) + .withBody(readFromResource("/project/project-validationResults.json")) .withStatus(200); final ProjectValidationResults validateResult = gd.getProjectService().validateProject(enabled).get(); @@ -256,21 +257,21 @@ public void shouldReturnProjectRoles() { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles") .respond() - .withBody(readResource("/project/project-roles.json")) + .withBody(readFromResource("/project/project-roles.json")) .withStatus(200); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles/ROLE1") .respond() - .withBody(readResource("/project/project-role.json")) + .withBody(readFromResource("/project/project-role.json")) .withStatus(200); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/projects/PROJECT_ID/roles/ROLE2") .respond() - .withBody(readResource("/project/project-role2.json")) + .withBody(readFromResource("/project/project-role2.json")) .withStatus(200); final Set roles = gd.getProjectService().getRoles(enabled); @@ -285,7 +286,7 @@ public void shouldReturnProjectRoleForUri() { .havingMethodEqualTo("GET") .havingPathEqualTo(roleUri) .respond() - .withBody(readResource("/project/project-role.json")) + .withBody(readFromResource("/project/project-role.json")) .withStatus(200); final Role role = gd.getProjectService().getRoleByUri(roleUri); @@ -299,14 +300,14 @@ public void shouldListPagedUsers() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(Users.TEMPLATE.expand("PROJECT_ID").toString()) .respond() - .withBody(readResource("/project/project-users.json")) + .withBody(readFromResource("/project/project-users.json")) .withStatus(200); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(Users.TEMPLATE.expand("PROJECT_ID").toString()) .havingQueryStringEqualTo("offset=1&limit=1") .respond() - .withBody(readResource("/project/project-users-empty.json")) + .withBody(readFromResource("/project/project-users-empty.json")) .withStatus(200); final List firstPage = gd.getProjectService().listUsers(enabled); diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 5bd0aa853..23fb7d456 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -11,6 +11,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; import static org.hamcrest.Matchers.is; @@ -47,7 +48,7 @@ public void setUp() throws IOException { @Test public void shouldExportReportDefinition() throws Exception { - final ReportDefinition rd = MAPPER.readValue(readResource("/md/report/gridReportDefinition.json"), ReportDefinition.class); + final ReportDefinition rd = MAPPER.readValue(readFromResource("/md/report/gridReportDefinition.json"), ReportDefinition.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); @@ -55,7 +56,7 @@ public void shouldExportReportDefinition() throws Exception { @Test public void shouldExportReport() throws Exception { - final Report rd = MAPPER.readValue(readResource("/md/report/report.json"), Report.class); + final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); @@ -69,7 +70,7 @@ public void shouldFail() throws Exception { .respond() .withStatus(400); - final Report rd = MAPPER.readValue(readResource("/md/report/report.json"), Report.class); + final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); } diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java index e8c9c720f..b94ad00b7 100644 --- a/src/test/java/com/gooddata/util/ResourceUtils.java +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -12,6 +12,7 @@ import org.codehaus.jackson.map.ObjectMapper; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; public class ResourceUtils { @@ -19,25 +20,35 @@ public class ResourceUtils { public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); public static T readObjectFromResource(Class testClass, String resourcePath, Class objectClass) { - notNull(testClass, "testClass"); - notEmpty(resourcePath, "resourcePath"); notNull(objectClass, "objectClass"); try { - return OBJECT_MAPPER.readValue(testClass.getResourceAsStream(resourcePath), objectClass); + return OBJECT_MAPPER.readValue(readFromResource(resourcePath, testClass), objectClass); } catch (IOException e) { throw new IllegalStateException(format("Cannot read class %s from resource %s", objectClass, resourcePath), e); } } public static String readStringFromResource(String resourcePath) { - notEmpty(resourcePath, "resourcePath"); - try { - return IOUtils.toString(ResourceUtils.class.getResourceAsStream(resourcePath), + return IOUtils.toString(readFromResource(resourcePath), StandardCharsets.UTF_8); } catch (IOException e) { throw new IllegalStateException(format("Cannot read from resource %s", resourcePath), e); } } + + public static InputStream readFromResource(String resourcePath) { + final Class clazz = ResourceUtils.class; + return readFromResource(resourcePath, clazz); + } + + + + private static InputStream readFromResource(String resourcePath, Class testClass) { + notEmpty(resourcePath, "resourcePath"); + notNull(testClass, "testClass cannot be null!"); + + return testClass.getResourceAsStream(resourcePath); + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 9cebf4039..7722181d6 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -2,6 +2,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.util.ResourceUtils; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.testng.annotations.BeforeClass; @@ -10,6 +11,7 @@ import java.io.IOException; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; import static net.jadler.Jadler.verifyThatRequest; @@ -35,9 +37,9 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - pollingTask = MAPPER.readValue(readResource(TASK_POLL), WarehouseTask.class); - finishedTask = MAPPER.readValue(readResource(TASK_DONE), WarehouseTask.class); - warehouse = MAPPER.readValue(readResource(WAREHOUSE), Warehouse.class); + pollingTask = MAPPER.readValue(readFromResource(TASK_POLL), WarehouseTask.class); + finishedTask = MAPPER.readValue(readFromResource(TASK_DONE), WarehouseTask.class); + warehouse = MAPPER.readValue(readFromResource(WAREHOUSE), Warehouse.class); } @Test @@ -46,7 +48,7 @@ public void shouldCreateWarehouse() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(Warehouses.URI) .respond() - .withBody(readResource(TASK_POLL)) + .withBody(readFromResource(TASK_POLL)) .withStatus(202); onRequest() .havingMethodEqualTo("GET") @@ -54,13 +56,13 @@ public void shouldCreateWarehouse() throws Exception { .respond() .withStatus(202) .thenRespond() - .withBody(readResource(TASK_DONE)) + .withBody(readFromResource(TASK_DONE)) .withStatus(201); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(finishedTask.getWarehouseLink()) .respond() - .withBody(readResource(WAREHOUSE)) + .withBody(readFromResource(WAREHOUSE)) .withStatus(200); final Warehouse created = gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); @@ -75,7 +77,7 @@ public void shouldFailToCreateWarehouse() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(Warehouses.URI) .respond() - .withBody(readResource(TASK_POLL)) + .withBody(readFromResource(TASK_POLL)) .withStatus(202); onRequest() .havingMethodEqualTo("GET") @@ -92,7 +94,7 @@ public void shouldListWarehouses() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(Warehouses.URI) .respond() - .withBody(readResource("/warehouse/warehouses.json")) + .withBody(readFromResource("/warehouse/warehouses.json")) .withStatus(200); final Collection list = gd.getWarehouseService().listWarehouses(); @@ -117,7 +119,7 @@ public void shouldGetWarehouse() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(warehouse.getUri()) .respond() - .withBody(readResource(WAREHOUSE)) + .withBody(readFromResource(WAREHOUSE)) .withStatus(200); final Warehouse warehouse = gd.getWarehouseService().getWarehouseById(WAREHOUSE_ID); @@ -130,7 +132,7 @@ public void shouldUpdateWarehouse() throws Exception { final String updatedTitle = "UPDATED_TITLE"; - final Warehouse toUpdate = MAPPER.readValue(readResource(WAREHOUSE), Warehouse.class); + final Warehouse toUpdate = MAPPER.readValue(readFromResource(WAREHOUSE), Warehouse.class); toUpdate.setTitle(updatedTitle); onRequest() From f544fa1a0b19858ff8af8107fff373a24a756cc5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Apr 2015 13:14:20 +0200 Subject: [PATCH 0164/1191] [maven-release-plugin] prepare release gooddata-java-0.13.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3d5838a98..129274e39 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.12.1-SNAPSHOT + 0.13.0 ${project.artifactId} GoodData Java SDK From e668c21e09fa1a7156f933ffc00cb8e465687a35 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Apr 2015 13:14:20 +0200 Subject: [PATCH 0165/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 129274e39..7c8aed045 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.13.0 + 0.13.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From cebb92198d670abd746dd25eb4c805e40314032b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Apr 2015 13:20:58 +0200 Subject: [PATCH 0166/1191] bump version to 0.13.0 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4d14b93e..14c096183 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.12.0 + 0.13.0 ``` From e6e643b8e8259aa4f8bfa58d7ce376f8758bfe14 Mon Sep 17 00:00:00 2001 From: Juraj Martinka Date: Wed, 29 Apr 2015 11:23:46 +0200 Subject: [PATCH 0167/1191] Allow setting custom params for Schedule. --- .../gooddata/dataload/processes/Schedule.java | 12 ++++++++++++ .../dataload/processes/ScheduleTest.java | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index b410633f7..aeaf2ccb4 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -126,6 +126,18 @@ public Map getParams() { return Collections.unmodifiableMap(params); } + public void addParam(String key, String value) { + notEmpty(key, "param cannot be empty!"); + notNull(value, "value cannot be null!"); + params.put(key, value); + } + + public void removeParam(String paramKey) { + notEmpty(paramKey, "paramKey cannot be empty!"); + params.remove(paramKey); + } + + public String getCron() { return cron; } diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 5dd167ec1..622c7ace5 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -1,6 +1,7 @@ package com.gooddata.dataload.processes; import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.collection.IsMapContaining; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.mockito.Matchers; @@ -13,11 +14,13 @@ import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsMapContaining.hasEntry; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; import static org.testng.Assert.fail; @@ -125,4 +128,20 @@ public void testSetExecutable() { schedule.setExecutable(process, "garbage"); } + @Test + public void testCustomParams() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + assertThat(schedule.getProcessId(), is("process_id")); + + final int originalParamsSize = schedule.getParams().size(); + schedule.addParam("myParam", "value"); + + assertThat(schedule.getParams(), hasEntry("myParam", "value")); + assertThat(schedule.getParams().size(), is(originalParamsSize + 1)); + + schedule.removeParam("myParam"); + assertThat(schedule.getParams(), not(hasEntry("myParam", "value"))); + assertThat(schedule.getParams().size(), is(originalParamsSize)); + } + } \ No newline at end of file From 68980835f53fc3eb41303c47db7ebceb2e1f3817 Mon Sep 17 00:00:00 2001 From: Ondrej Cernos Date: Tue, 28 Apr 2015 17:27:55 +0200 Subject: [PATCH 0168/1191] Add support for scheduled emails --- README.md | 28 ++ src/main/java/com/gooddata/md/Attachment.java | 49 ++++ .../com/gooddata/md/DashboardAttachment.java | 71 +++++ .../com/gooddata/md/ReportAttachment.java | 131 +++++++++ .../java/com/gooddata/md/ScheduledMail.java | 257 ++++++++++++++++++ .../com/gooddata/md/ScheduledMailWhen.java | 77 ++++++ .../gooddata/report/ReportExportFormat.java | 9 +- .../com/gooddata/util/GDDateDeserializer.java | 37 +++ .../com/gooddata/util/GDDateSerializer.java | 25 ++ src/test/java/com/gooddata/ShowcaseAT.java | 48 +++- .../com/gooddata/md/MetadataServiceIT.java | 26 +- .../com/gooddata/md/ScheduledMailTest.java | 67 +++++ .../java/com/gooddata/util/GDDateClass.java | 15 +- .../gooddata/util/GDDateDeserializerTest.java | 29 ++ .../gooddata/util/GDDateSerializerTest.java | 25 ++ .../com/gooddata/util/GDDateTimeClass.java | 22 ++ .../util/GDDateTimeDeserializerTest.java | 6 +- .../util/GDDateTimeSerializerTest.java | 2 +- src/test/resources/md/scheduledMail.json | 58 ++++ 19 files changed, 957 insertions(+), 25 deletions(-) create mode 100644 src/main/java/com/gooddata/md/Attachment.java create mode 100644 src/main/java/com/gooddata/md/DashboardAttachment.java create mode 100644 src/main/java/com/gooddata/md/ReportAttachment.java create mode 100644 src/main/java/com/gooddata/md/ScheduledMail.java create mode 100644 src/main/java/com/gooddata/md/ScheduledMailWhen.java create mode 100644 src/main/java/com/gooddata/util/GDDateDeserializer.java create mode 100644 src/main/java/com/gooddata/util/GDDateSerializer.java create mode 100644 src/test/java/com/gooddata/md/ScheduledMailTest.java create mode 100644 src/test/java/com/gooddata/util/GDDateDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/GDDateSerializerTest.java create mode 100644 src/test/java/com/gooddata/util/GDDateTimeClass.java create mode 100644 src/test/resources/md/scheduledMail.json diff --git a/README.md b/README.md index 14c096183..14d379040 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,34 @@ definition = md.createObj(project, definition); Report report = md.createObj(project, new Report(definition.getTitle(), definition)); ``` +Create and retrieve scheduled mails on reports and dashboards: + +```java +Project project = ... +ReportDefinition reportDefinition = ... + +MetadataService md = gd.getMetadataService(); +ScheduledMail scheduledMail = md.createObj( + project, + (new ScheduledMail("Scheduled Mail Title", "Scheduled Mail Summary")) + .setRecurrency("0:0:0:1*12:0:0") + .setStartDate(new LocalDate(2012, 6, 5)) + .setTimeZone("America/Los_Angeles") + .addToAddress("user_in_project@example.com") + .addBccAddress("another_user_in_project@example.com") + .setSubject("Mail subject") + .setBody("Mail body") + .addReportAttachment(reportDefinition, + Collections.singletonMap("pageOrientation", "landscape"), + pdf, xls) +); + +Collection result = md.find(project, ScheduledMail.class); +for (Entry e : result) { + ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); +} +``` + ### Dataset API Upload data to datasets,.. diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java new file mode 100644 index 000000000..71338bf92 --- /dev/null +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonSubTypes; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Common ancestor to {@link ScheduledMail} attachments. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSubTypes({ + @JsonSubTypes.Type(name = "dashboardAttachment", value = DashboardAttachment.class), + @JsonSubTypes.Type(name = "reportAttachment", value = ReportAttachment.class), +}) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Attachment { + + private final String uri; + + @JsonCreator + protected Attachment(@JsonProperty("uri") String uri) { + this.uri = uri; + } + + public String getUri() { return uri; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Attachment that = (Attachment) o; + + return !(uri != null ? !uri.equals(that.uri) : that.uri != null); + + } + + @Override + public int hashCode() { + return uri != null ? uri.hashCode() : 0; + } +} diff --git a/src/main/java/com/gooddata/md/DashboardAttachment.java b/src/main/java/com/gooddata/md/DashboardAttachment.java new file mode 100644 index 000000000..000edfd99 --- /dev/null +++ b/src/main/java/com/gooddata/md/DashboardAttachment.java @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.Arrays; +import java.util.Collection; + +/** + * Attachment to {@link ScheduledMail} represents dashboard-related information for the schedule. + */ +public class DashboardAttachment extends Attachment { + + private final Integer allTabs; + private final Collection tabs; + private final String executionContext; + + @JsonCreator + protected DashboardAttachment( + @JsonProperty("uri") String uri, + @JsonProperty("allTabs") Integer allTabs, + @JsonProperty("executionContext") String executionContext, + @JsonProperty("tabs") String... tabs + ) { + super(uri); + this.allTabs = allTabs; + this.tabs = Arrays.asList(tabs); + this.executionContext = executionContext; + } + + public Integer getAllTabs() { return allTabs; } + + public Collection getTabs() { return tabs; } + + public String getExecutionContext() { return executionContext; } + + @Override + public boolean equals(Object o) { + if (!super.equals(o)) return false; + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DashboardAttachment that = (DashboardAttachment) o; + + if (allTabs != null ? !allTabs.equals(that.allTabs) : that.allTabs != null) return false; + if (tabs != null ? !tabs.equals(that.tabs) : that.tabs != null) return false; + return !(executionContext != null ? !executionContext.equals(that.executionContext) : that.executionContext != null); + + } + + @Override + public int hashCode() { + int result = allTabs != null ? allTabs.hashCode() : 0; + result = 31 * result + (tabs != null ? tabs.hashCode() : 0); + result = 31 * result + (executionContext != null ? executionContext.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "DashboardAttachment{" + + "uri=" + getUri() + + ", allTabs=" + allTabs + + ", tabs=" + tabs + + ", executionContext='" + executionContext + '\'' + + '}'; + } +} diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java new file mode 100644 index 000000000..627f3857b --- /dev/null +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import com.gooddata.report.ReportExportFormat; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; + +/** + * Attachment to {@link ScheduledMail} represents report-related information for the schedule. + */ +public class ReportAttachment extends Attachment { + + private final Collection formats; + private final Map exportOptions; + + @JsonCreator + protected ReportAttachment( + @JsonProperty("uri") String uri, + @JsonProperty("exportOptions") Map exportOptions, + @JsonProperty("formats") String... formats + ) { + super(uri); + this.exportOptions = exportOptions; + this.formats = Arrays.asList(formats); + } + + protected ReportAttachment(String uri, Map exportOptions, ReportExportFormat... formats) { + this(uri, exportOptions, ReportExportFormat.arrayToStringArray(formats)); + } + + /** + * Options which modify default export behavior. Due to variety of + * export formats options only work for explicitly listed + * format types. + * + *

    + *
  • pageOrientation + *
      + *
    • set page orientation
    • + *
    • default value: 'portrait'
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + * + *
  • optimalColumnWidth + *
      + *
    • set 'yes' to automatically resize all columns to fit cell's content
    • + *
    • default is: 'no' (do not auto resize)
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + * + *
  • pageScalePercentage + *
      + *
    • down-scaling factor (in percent), 100 means no scale-down
    • + *
    • may not be combined with scaleToPages, scaleToPagesX and scaleToPagesY
    • + *
    • default is: 100
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + * + *
  • scaleToPages + *
      + *
    • total number of pages of target PDF file
    • + *
    • may not be combined with pageScalePercentage, scaleToPagesX and scaleToPagesY
    • + *
    • default is: unlimited
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + * + *
  • scaleToPagesX + *
      + *
    • number of horizontal pages of target PDF file
    • + *
    • may not be combined with pageScalePercentage and scaleToPages, but may be combined with scaleToPagesY
    • + *
    • default is: unlimited
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + * + *
  • scaleToPagesY + *
      + *
    • number of vertical pages of target PDF file
    • + *
    • may not be combined with pageScalePercentage and scaleToPages, but may be combined with scaleToPagesX
    • + *
    • default is: unlimited
    • + *
    • supported in: tabular PDF
    • + *
    + *
  • + *
+ * + * @return + */ + public Map getExportOptions() { return exportOptions; } + + public Collection getFormats() { return formats; } + + @Override + public boolean equals(Object o) { + if (!super.equals(o)) return false; + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ReportAttachment that = (ReportAttachment) o; + + if (formats != null ? !formats.equals(that.formats) : that.formats != null) return false; + return !(exportOptions != null ? !exportOptions.equals(that.exportOptions) : that.exportOptions != null); + + } + + @Override + public int hashCode() { + int result = formats != null ? formats.hashCode() : 0; + result = 31 * result + (exportOptions != null ? exportOptions.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return "ReportAttachment{" + + "uri=" + getUri() + + ", formats=" + formats + + ", exportOptions=" + exportOptions + + '}'; + } +} diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java new file mode 100644 index 000000000..408d5487c --- /dev/null +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -0,0 +1,257 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import com.gooddata.md.report.Report; +import com.gooddata.md.report.ReportDefinition; +import com.gooddata.report.ReportExportFormat; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.LocalDate; + +import java.util.*; + +import static com.gooddata.util.Validate.notNull; + +/** + * A scheduled mail MD object. It represents a schedule on mail-sending of + * exported dashboards and reports. + */ +@JsonTypeName("scheduledMail") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class ScheduledMail extends AbstractObj implements Queryable { + + @JsonProperty("content") + private Content content; + + @JsonCreator + ScheduledMail(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + private ScheduledMail(String title, String summary, String tags, boolean deprecated, String recurrency, 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, deprecated, null, false, false)); + notNull(toAddresses, "toAddresses"); + notNull(subject, "subject"); + notNull(body, "body"); + notNull(attachments, "attachments"); + content = new Content(new ScheduledMailWhen(recurrency, startDate, timeZone), toAddresses, bccAddresses, subject, body, attachments); + } + + /** + * Creates an almost empty instance of the object. It's up to the user's responsibility to call all the necessary setters. + * + * @param title the title of the MD object + * @param summary the summary of the MD object + */ + public ScheduledMail(String title, String summary) { + super(new Meta(null, null, null, null, summary, title, null, "", null, false, null, false, false)); + this.content = new Content(); + } + + /** + * Creates full, safe mail schedule object. + * + * @param title the title of the MD object + * @param summary the summary of the MD object + * @param recurrency schedule in format defined in schedule + * @param startDate schedule starting date + * @param timeZone time zone of the starting date + * @param toAddresses collection of email addresses to send the mail to + * @param bccAddresses collection of blind copy addresses to send the mail to + * @param subject the subject of the scheduled mail + * @param body the text body of the scheduled mail + * @param attachments reports and dashboards to send in the scheduled email + */ + public ScheduledMail(String title, String summary, String recurrency, LocalDate startDate, String timeZone, + Collection toAddresses, Collection bccAddresses, String subject, String body, + List attachments) { + this(title, summary, "", false, recurrency, startDate, timeZone, toAddresses, bccAddresses, subject, body, attachments); + } + + /** + * Mail schedule MD object payload. + */ + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Content { + + @JsonProperty("when") + private ScheduledMailWhen scheduledMailWhen; + + /** + * Collection of email addresses. + */ + @JsonProperty("to") + private Collection toAddress; + + /** + * Collection of email addresses. + */ + @JsonProperty("bcc") + private Collection bccAddress; + private String subject; + private String body; + private Collection attachments; + + @JsonCreator + public Content( + @JsonProperty("when") ScheduledMailWhen scheduledMailWhen, + @JsonProperty("to") Collection toAddress, + @JsonProperty("bcc") Collection bccAddress, + @JsonProperty("subject") String subject, + @JsonProperty("body") String body, + @JsonProperty("attachments") Collection attachments) { + + this.scheduledMailWhen = scheduledMailWhen; + this.toAddress = toAddress; + this.bccAddress = bccAddress; + this.subject = subject; + this.body = body; + this.attachments = attachments; + } + + public Content() { + this.scheduledMailWhen = new ScheduledMailWhen(); + this.toAddress = new ArrayList<>(); + this.bccAddress = new ArrayList<>(); + this.attachments = new ArrayList<>(); + } + + @JsonIgnore + public ScheduledMailWhen getScheduledMailWhen() { return scheduledMailWhen; } + + @JsonIgnore + public Collection getToAddresses() { return toAddress; } + + @JsonIgnore + public Collection getBccAddresses() { return bccAddress; } + + public String getSubject() { return subject; } + + public String getBody() { return body; } + + public Collection getAttachments() { return attachments; } + + public void setScheduledMailWhen(ScheduledMailWhen scheduledMailWhen) { + this.scheduledMailWhen = scheduledMailWhen; + } + + public void setToAddress(Collection toAddress) { + this.toAddress = toAddress; + } + + public void setBccAddress(Collection bccAddress) { + this.bccAddress = bccAddress; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public void setBody(String body) { + this.body = body; + } + + public void setAttachments(Collection attachments) { + this.attachments = attachments; + } + + } + + @JsonIgnore + public ScheduledMailWhen getWhen() { return content.getScheduledMailWhen(); } + + @JsonIgnore + public Collection getToAddresses() { return content.getToAddresses(); } + + @JsonIgnore + public Collection getBccAddresses() { return content.getBccAddresses(); } + + @JsonIgnore + public String getSubject() { return content.getSubject(); } + + @JsonIgnore + public String getBody() { return content.getBody(); } + + @JsonIgnore + public Collection getAttachments() { return content.getAttachments(); } + + public ScheduledMail setRecurrency(String recurrency) { + this.content.getScheduledMailWhen().setRecurrency(recurrency); + return this; + } + + public ScheduledMail setStartDate(LocalDate startDate) { + this.content.getScheduledMailWhen().setStartDate(startDate); + return this; + } + + public ScheduledMail setTimeZone(String timeZone) { + this.content.getScheduledMailWhen().setTimeZone(timeZone); + return this; + } + + public ScheduledMail setTo(Collection toAddresses) { + this.content.setToAddress(toAddresses); + return this; + } + + public ScheduledMail setBcc(Collection bccAddresses) { + this.content.setBccAddress(bccAddresses); + return this; + } + + public ScheduledMail setSubject(String subject) { + this.content.setSubject(subject); + return this; + } + + public ScheduledMail setBody(String body) { + this.content.setBody(body); + return this; + } + + public ScheduledMail setAttachments(List attachments) { + this.content.setAttachments(attachments); + return this; + } + + public ScheduledMail addToAddress(String toAdd) { + this.content.getToAddresses().add(toAdd); + return this; + } + + public ScheduledMail addBccAddress(String bccAdd) { + this.content.getBccAddresses().add(bccAdd); + return this; + } + + public ScheduledMail addReportAttachment(ReportDefinition reportDefinition, Map exportOptions, String... formats) { + notNull(formats, "formats"); + ReportAttachment ra = new ReportAttachment(reportDefinition.getUri(), exportOptions, formats); + this.content.getAttachments().add(ra); + return this; + } + + public ScheduledMail addReportAttachment(ReportDefinition reportDefinition, Map exportOptions, ReportExportFormat... formats) { + return addReportAttachment(reportDefinition, exportOptions, ReportExportFormat.arrayToStringArray(formats)); + } + + public ScheduledMail addDashboardAttachment(String uri, Integer allTabs, String executionContext, String... tabs) { + notNull(tabs, "tabs"); + DashboardAttachment da = new DashboardAttachment(uri, allTabs, executionContext, tabs); + this.content.getAttachments().add(da); + return this; + } + +} diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java new file mode 100644 index 000000000..39651fc06 --- /dev/null +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import com.gooddata.util.GDDateDeserializer; +import com.gooddata.util.GDDateSerializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.LocalDate; + +/** + * Represents the start date and cron-like expression for {@link com.gooddata.md.ScheduledMail} mail schedule. + */ +public class ScheduledMailWhen { + + /** + * Cron like recurrency pattern. Example: "0:0:0:1*12:0:0". + * For details, please see this comprehensive documentation. + */ + private String recurrency; + private LocalDate startDate; + private String timeZone; + + @JsonCreator + protected ScheduledMailWhen(@JsonProperty("recurrency") String recurrency, + @JsonProperty("startDate") @JsonDeserialize(using = GDDateDeserializer.class) LocalDate startDate, + @JsonProperty("timeZone") String timeZone) { + this.recurrency = recurrency; + this.startDate = startDate; + this.timeZone = timeZone; + } + + public ScheduledMailWhen() {} + + public String getRecurrency() { return recurrency; } + + @JsonSerialize(using = GDDateSerializer.class, include = JsonSerialize.Inclusion.NON_NULL) + public LocalDate getStartDate() { return startDate; } + + public String getTimeZone() { return timeZone; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ScheduledMailWhen scheduledMailWhen = (ScheduledMailWhen) o; + + if (recurrency != null ? !recurrency.equals(scheduledMailWhen.recurrency) : scheduledMailWhen.recurrency != null) return false; + if (startDate != null ? !startDate.equals(scheduledMailWhen.startDate) : scheduledMailWhen.startDate != null) return false; + return !(timeZone != null ? !timeZone.equals(scheduledMailWhen.timeZone) : scheduledMailWhen.timeZone != null); + + } + + @Override + public int hashCode() { + int result = recurrency != null ? recurrency.hashCode() : 0; + result = 31 * result + (startDate != null ? startDate.hashCode() : 0); + result = 31 * result + (timeZone != null ? timeZone.hashCode() : 0); + return result; + } + + public void setRecurrency(String recurrency) { + this.recurrency = recurrency; + } + + public void setStartDate(LocalDate startDate) { + this.startDate = startDate; + } + + public void setTimeZone(String timeZone) { + this.timeZone = timeZone; + } +} diff --git a/src/main/java/com/gooddata/report/ReportExportFormat.java b/src/main/java/com/gooddata/report/ReportExportFormat.java index 269ed6884..ef3ab5453 100644 --- a/src/main/java/com/gooddata/report/ReportExportFormat.java +++ b/src/main/java/com/gooddata/report/ReportExportFormat.java @@ -5,10 +5,17 @@ */ public enum ReportExportFormat { - PDF, XLS, PNG, CSV; + PDF, XLS, PNG, CSV, HTML, XLSX; public String getValue() { return name().toLowerCase(); } + public static String[] arrayToStringArray(ReportExportFormat... formats) { + String[] fs = new String[formats.length]; + for (int i = 0; i < formats.length; i++) { + fs[i] = formats[i].getValue(); + } + return fs; + } } diff --git a/src/main/java/com/gooddata/util/GDDateDeserializer.java b/src/main/java/com/gooddata/util/GDDateDeserializer.java new file mode 100644 index 000000000..9eb02ee96 --- /dev/null +++ b/src/main/java/com/gooddata/util/GDDateDeserializer.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.JsonParser; +import org.codehaus.jackson.map.DeserializationContext; +import org.codehaus.jackson.map.JsonDeserializer; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDate; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.DateTimeFormatterBuilder; +import org.joda.time.format.ISODateTimeFormat; + +import java.io.IOException; + +/** + * Deserializes to Joda's {@link LocalDate} fields from the GoodData date time format (yyyy-MM-dd). + */ +public class GDDateDeserializer extends JsonDeserializer { + + static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder() + .append(ISODateTimeFormat.date()) + .toFormatter().withZone(DateTimeZone.UTC); + + @Override + public LocalDate deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + if (root == null || root.isNull()) { + return null; + } + return FORMATTER.parseLocalDate(root.getTextValue()); + } + +} diff --git a/src/main/java/com/gooddata/util/GDDateSerializer.java b/src/main/java/com/gooddata/util/GDDateSerializer.java new file mode 100644 index 000000000..c8a1afd55 --- /dev/null +++ b/src/main/java/com/gooddata/util/GDDateSerializer.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.util; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; +import org.joda.time.LocalDate; + +import java.io.IOException; + +import static com.gooddata.util.GDDateDeserializer.FORMATTER; + +/** + * Serializes from Joda's {@link LocalDate} fields to the GoodData date time format (yyyy-MM-dd). + */ +public class GDDateSerializer extends JsonSerializer { + + @Override + public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider arg2) throws IOException { + gen.writeString(FORMATTER.print(value)); + } + +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 81598e173..1ea4a05d5 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -10,13 +10,13 @@ import com.gooddata.dataload.processes.ProcessExecutionException; import com.gooddata.dataload.processes.ProcessService; import com.gooddata.dataload.processes.ProcessType; +import com.gooddata.dataload.processes.Schedule; +import com.gooddata.dataload.processes.ScheduleState; import com.gooddata.dataset.DatasetManifest; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; -import com.gooddata.md.Attribute; -import com.gooddata.md.Fact; -import com.gooddata.md.MetadataService; -import com.gooddata.md.Metric; +import com.gooddata.md.*; +import com.gooddata.md.ScheduledMail; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; @@ -24,16 +24,14 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; import com.gooddata.model.ModelService; -import com.gooddata.project.ProjectFeatureFlag; import com.gooddata.project.Project; +import com.gooddata.project.ProjectFeatureFlag; import com.gooddata.project.ProjectService; import com.gooddata.project.ProjectValidationResults; import com.gooddata.project.Role; import com.gooddata.project.User; import com.gooddata.report.ReportExportFormat; import com.gooddata.report.ReportService; -import com.gooddata.dataload.processes.Schedule; -import com.gooddata.dataload.processes.ScheduleState; import com.gooddata.warehouse.Warehouse; import com.gooddata.warehouse.WarehouseService; import org.apache.commons.io.FileUtils; @@ -51,11 +49,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; import static com.gooddata.ProcessIdMatcher.hasSameIdAs; import static com.gooddata.ProjectIdMatcher.hasSameIdAs; @@ -75,6 +69,7 @@ import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.testng.AssertJUnit.fail; +import static com.gooddata.report.ReportExportFormat.*; public class ShowcaseAT { @@ -92,6 +87,7 @@ public class ShowcaseAT { private String warehouseToken; private Warehouse warehouse; private DataloadProcess process; + private ScheduledMail scheduledMail; @BeforeClass public void setUp() throws Exception { @@ -271,6 +267,34 @@ public void createReport() throws Exception { md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); } + @Test(groups = "md", dependsOnMethods = "createReport") + public void createScheduledMail() throws Exception { + final MetadataService md = gd.getMetadataService(); + + scheduledMail = md.createObj(project, + (new ScheduledMail("Scheduled Mail Title", "Scheduled Mail Summary")) + .setRecurrency("0:0:0:1*12:0:0") + .setStartDate(new LocalDate(2012, 6, 5)) + .setTimeZone("America/Los_Angeles") + .addToAddress(getProperty("login")) + .addBccAddress(getProperty("login")) + .setSubject("Mail subject") + .setBody("Mail body") + .addReportAttachment(reportDefinition, + Collections.singletonMap("pageOrientation", "landscape"), + PDF, XLS)); + } + + @Test(groups = "md", dependsOnMethods = "createScheduledMail") + public void retrieveScheduledMail() throws Exception { + final MetadataService md = gd.getMetadataService(); + Collection result = md.find(project, ScheduledMail.class); + assertThat(result, hasSize(1)); + for (Entry e : result) { + ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); + } + } + @Test(groups = "datastore", dependsOnMethods = "login") public void datastoreUpload() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 1f225d204..b0e8f13dd 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -7,7 +7,6 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -36,11 +35,13 @@ public class MetadataServiceIT extends AbstractGoodDataIT { private Project project; private Metric metricInput; + private ScheduledMail scheduledMailInput; @BeforeClass public void setUp() throws Exception { project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); metricInput = MAPPER.readValue(readFromResource("/md/metric-input.json"), Metric.class); + scheduledMailInput = MAPPER.readValue(readFromResource("/md/scheduledMail.json"), ScheduledMail.class); } @Test @@ -107,6 +108,29 @@ public void shouldCreateObj() throws Exception { assertThat(((Metric) result).getFormat(), is("FORMAT")); } + @Test + public void shouldCreateMailScheduleObj() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(OBJ_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(readFromResource("/md/scheduledMail.json")); + + final Obj result = gd.getMetadataService().createObj(project, scheduledMailInput); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(ScheduledMail.class))); + assertThat(((ScheduledMail) result).getTitle(), is("Scheduled report example")); + assertThat(((ScheduledMail) result).getToAddresses(), contains("email@example.com")); + } + @Test public void shouldGetObjByUri() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java new file mode 100644 index 000000000..4b567767e --- /dev/null +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import com.gooddata.JsonMatchers; +import com.gooddata.report.ReportExportFormat; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.LocalDate; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; + +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; + +public class ScheduledMailTest { + + private final ReportAttachment rp1 = new ReportAttachment( + "/gdc/md/PROJ_ID/obj/OBJECT_ID1", + Collections.singletonMap("pageOrientation", "landscape"), + ReportExportFormat.PDF, ReportExportFormat.XLS + ); + private final DashboardAttachment da1 = new DashboardAttachment( + "/gdc/md/PROJ_ID/obj/DASHBOARD_ID2", + 1, + null); + private final DashboardAttachment da2 = new DashboardAttachment( + "/gdc/md/PROJ_ID/obj/DASHBOARD_ID3", + 0, + "/gdc/md/PROJ_ID/obj/EXECUTION_CONTEXT_ID", + "testTab"); + + private final ScheduledMailWhen scheduledMailWhen = new ScheduledMailWhen("0:0:0:1*12:0:0", new LocalDate(2012, 6, 5), "America/Los_Angeles"); + + @Test + public void testDeserialization() throws Exception { + final ScheduledMail scheduledMail = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/scheduledMail.json"), ScheduledMail.class); + assertThat(scheduledMail, is(notNullValue())); + assertThat(scheduledMail.getToAddresses(), hasItems("email@example.com")); + assertThat(scheduledMail.getBccAddresses(), hasItems("secret-email@example.com")); + assertThat(scheduledMail.getSubject(), is("Scheduled report")); + assertThat(scheduledMail.getBody(), is("Hey, I'm sending you new Reports and Dashboards!")); + assertThat(scheduledMail.getWhen(), is(scheduledMailWhen)); + assertThat(scheduledMail.getAttachments(), containsInAnyOrder(rp1, da1, da2)); + } + + @Test + public void testSerialization() throws Exception { + final ScheduledMail scheduledMail = new ScheduledMail("Scheduled report example", "Daily at 12:00pm PT") + .setRecurrency("0:0:0:1*12:0:0") + .setStartDate(new LocalDate(2012, 6, 5)) + .setTimeZone("America/Los_Angeles") + .setTo(Arrays.asList("email@example.com")) + .setBcc(Arrays.asList("secret-email@example.com")) + .setSubject("Scheduled report") + .setBody("Hey, I'm sending you new Reports and Dashboards!") + .setAttachments(Arrays.asList(rp1, da1, da2)); + + assertThat(scheduledMail, JsonMatchers.serializesToJson("/md/scheduledMail.json")); + } + +} diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index df2886b47..3fa44ac9f 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -5,18 +5,19 @@ import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.joda.time.DateTime; +import org.joda.time.LocalDate; -class GDDateClass { - - private DateTime date; +public class GDDateClass { + private LocalDate date; @JsonCreator - public GDDateClass(@JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) final DateTime date) { + public GDDateClass(@JsonProperty("date") @JsonDeserialize(using = GDDateDeserializer.class) final LocalDate date) { this.date = date; } - @JsonSerialize(using = GDDateTimeSerializer.class) - public DateTime getDate() { + @JsonSerialize(using = GDDateSerializer.class) + public LocalDate getDate() { return date; } -} \ No newline at end of file + +} diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java new file mode 100644 index 000000000..bf75a2420 --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -0,0 +1,29 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDate; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class GDDateDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testDeserialize() throws Exception { + final String json = MAPPER.writeValueAsString(new GDDateClass(new LocalDate(2012, 3, 20))); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("date").getTextValue(), is("2012-03-20")); + + final GDDateClass date = MAPPER.readValue(json, GDDateClass.class); + assertThat(date.getDate(), is(new LocalDate(2012, 3, 20))); + } + + +} diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java new file mode 100644 index 000000000..6ba597c5a --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -0,0 +1,25 @@ +package com.gooddata.util; + +import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.LocalDate; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class GDDateSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testSerialize() throws Exception { + final GDDateClass foo = new GDDateClass(new LocalDate(2012, 3, 20)); + final String json = MAPPER.writeValueAsString(foo); + final JsonNode node = MAPPER.readTree(json); + + assertThat(node.path("date").getTextValue(), is("2012-03-20")); + } +} diff --git a/src/test/java/com/gooddata/util/GDDateTimeClass.java b/src/test/java/com/gooddata/util/GDDateTimeClass.java new file mode 100644 index 000000000..f2f081793 --- /dev/null +++ b/src/test/java/com/gooddata/util/GDDateTimeClass.java @@ -0,0 +1,22 @@ +package com.gooddata.util; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.joda.time.DateTime; + +class GDDateTimeClass { + + private DateTime date; + + @JsonCreator + public GDDateTimeClass(@JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) final DateTime date) { + this.date = date; + } + + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getDate() { + return date; + } +} diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java index 90b8f32ed..56259eea4 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -15,12 +15,12 @@ public class GDDateTimeDeserializerTest { @Test public void testDeserialize() throws Exception { - final String json = MAPPER.writeValueAsString(new GDDateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); + final String json = MAPPER.writeValueAsString(new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); final JsonNode node = MAPPER.readTree(json); assertThat(node.path("date").getTextValue(), is("2012-03-20 14:31:05")); - final GDDateClass date = MAPPER.readValue(json, GDDateClass.class); + final GDDateTimeClass date = MAPPER.readValue(json, GDDateTimeClass.class); assertThat(date.getDate(), is(new DateTime(2012, 3, 20, 14, 31, 5, DateTimeZone.UTC))); } -} \ No newline at end of file +} diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java index 04bde6966..627671753 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -15,7 +15,7 @@ public class GDDateTimeSerializerTest { @Test public void testSerialize() throws Exception { - final GDDateClass foo = new GDDateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); + final GDDateTimeClass foo = new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); final String json = MAPPER.writeValueAsString(foo); final JsonNode node = MAPPER.readTree(json); diff --git a/src/test/resources/md/scheduledMail.json b/src/test/resources/md/scheduledMail.json new file mode 100644 index 000000000..bdbcdd4dc --- /dev/null +++ b/src/test/resources/md/scheduledMail.json @@ -0,0 +1,58 @@ +{ + "scheduledMail": { + "meta": { + "title": "Scheduled report example", + "summary": "Daily at 12:00pm PT", + "tags": "", + "deprecated": "0", + "locked": 0, + "unlisted": 0 + }, + "content": { + "when": { + "recurrency": "0:0:0:1*12:0:0", + "startDate": "2012-06-05", + "timeZone": "America/Los_Angeles" + }, + "to": [ + "email@example.com" + ], + "bcc": [ + "secret-email@example.com" + ], + "subject": "Scheduled report", + "body": "Hey, I'm sending you new Reports and Dashboards!", + "attachments": [ + { + "reportAttachment": { + "uri": "/gdc/md/PROJ_ID/obj/OBJECT_ID1", + "formats": [ + "pdf", + "xls" + ], + "exportOptions": { + "pageOrientation": "landscape" + } + } + }, + { + "dashboardAttachment": { + "uri": "/gdc/md/PROJ_ID/obj/DASHBOARD_ID2", + "allTabs": 1, + "tabs": [] + } + }, + { + "dashboardAttachment": { + "uri": "/gdc/md/PROJ_ID/obj/DASHBOARD_ID3", + "allTabs": 0, + "tabs": [ + "testTab" + ], + "executionContext": "/gdc/md/PROJ_ID/obj/EXECUTION_CONTEXT_ID" + } + } + ] + } + } +} \ No newline at end of file From b2868e0f3ba831de7701303e7821e3833436e703 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 6 May 2015 16:22:05 +0200 Subject: [PATCH 0169/1191] [maven-release-plugin] prepare release gooddata-java-0.14.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7c8aed045..337ef7171 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.13.1-SNAPSHOT + 0.14.0 ${project.artifactId} GoodData Java SDK From 4f0c8020216df12afd10fd5aba67281c404380ac Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 6 May 2015 16:22:06 +0200 Subject: [PATCH 0170/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 337ef7171..ae16f356e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.14.0 + 0.14.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 6329dea9e641f40cbba8102d6a9c93c2209cd8c9 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 12 May 2015 14:51:24 +0200 Subject: [PATCH 0171/1191] chg: bump version number --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 14d379040..fd422ccf2 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.13.0 + 0.14.0 ``` From 0aec913e3cbac6e4765c89bfadc3ed0416a84646 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Thu, 14 May 2015 20:22:30 +0200 Subject: [PATCH 0172/1191] throw different exceptions during report exporting It can be usefull to distinguish between no data and other error during report export. --- .../gooddata/report/NoDataReportException.java | 16 ++++++++++++++++ .../java/com/gooddata/report/ReportService.java | 6 +++++- .../com/gooddata/report/ReportServiceIT.java | 13 +++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/report/NoDataReportException.java diff --git a/src/main/java/com/gooddata/report/NoDataReportException.java b/src/main/java/com/gooddata/report/NoDataReportException.java new file mode 100644 index 000000000..955d4e74c --- /dev/null +++ b/src/main/java/com/gooddata/report/NoDataReportException.java @@ -0,0 +1,16 @@ +package com.gooddata.report; + +/** + * Thrown when report export contains no data + */ +public class NoDataReportException extends ReportException { + + public NoDataReportException() { + this("Report contains no data"); + } + + public NoDataReportException(final String message) { + super(message); + } + +} diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 1a266305c..d39a780ff 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -44,6 +44,8 @@ public ReportService(final RestTemplate restTemplate) { * @param format export format * @param output target * @return polling result + * @throws NoDataReportException in case report contains no data + * @throws ReportException on error */ public FutureResult exportReport(final ReportDefinition reportDefinition, final ReportExportFormat format, final OutputStream output) { @@ -58,6 +60,8 @@ public FutureResult exportReport(final ReportDefinition reportDefinition, * @param format export format * @param output target * @return polling result + * @throws NoDataReportException in case report contains no data + * @throws ReportException on error */ public FutureResult exportReport(final Report report, final ReportExportFormat format, final OutputStream output) { @@ -77,7 +81,7 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { switch (response.getStatusCode()) { case OK: return true; case ACCEPTED: return false; - case NO_CONTENT: throw new ReportException("Report contains no data"); + case NO_CONTENT: throw new NoDataReportException(); default: throw new ReportException("Unable to export report, unknown HTTP response code: " + response.getStatusCode()); } } diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 23fb7d456..956abe4a1 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -74,4 +74,17 @@ public void shouldFail() throws Exception { final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); } + + @Test(expectedExceptions = NoDataReportException.class, expectedExceptionsMessageRegExp = "Report contains no data") + public void shouldFailNoData() throws Exception { + onRequest() + .havingPathEqualTo(URI) + .havingMethodEqualTo("GET") + .respond() + .withStatus(204); + + final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); + } } \ No newline at end of file From 1ee7eefbb14ba74d405d4af010032cba9f01c965 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Thu, 14 May 2015 20:20:26 +0200 Subject: [PATCH 0173/1191] add filter support in reports --- .../java/com/gooddata/md/report/Filter.java | 27 +++++++++++++++++++ .../report/GridReportDefinitionContent.java | 22 ++++++++++++--- .../OneNumberReportDefinitionContent.java | 18 +++++++++---- .../md/report/ReportDefinitionContent.java | 10 +++---- src/test/java/com/gooddata/ShowcaseAT.java | 4 ++- .../OneNumberReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionTest.java | 3 ++- .../oneNumberReportDefinition-input.json | 2 +- 8 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/gooddata/md/report/Filter.java diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java new file mode 100644 index 000000000..4d75b001d --- /dev/null +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -0,0 +1,27 @@ +package com.gooddata.md.report; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import static com.gooddata.util.Validate.notEmpty; + +/** + * Filter (in report definition) + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Filter { + + private final String expression; + + @JsonCreator + public Filter(@JsonProperty("expression") final String expression) { + this.expression = notEmpty(expression, "expression"); + } + + public String getExpression() { + return expression; + } +} diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index b6c3afe80..44fe92080 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -9,6 +9,8 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -21,12 +23,19 @@ public class GridReportDefinitionContent extends ReportDefinitionContent { public static final String FORMAT = "grid"; @JsonCreator - private GridReportDefinitionContent(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid) { - super(format, grid); + private GridReportDefinitionContent( + @JsonProperty("format") String format, + @JsonProperty("grid") Grid grid, + @JsonProperty("filters") Collection filters) { + super(format, grid, filters); + } + + GridReportDefinitionContent(Grid grid, Collection filters) { + this(FORMAT, grid, filters); } GridReportDefinitionContent(Grid grid) { - this(FORMAT, grid); + this(grid, Collections.emptyList()); } public String getFormat() { @@ -35,6 +44,11 @@ public String getFormat() { public static ReportDefinition create(String title, List columns, List rows, List metrics) { - return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics))); + return create(title, columns, rows, metrics, Collections.emptyList()); + } + + public static ReportDefinition create(String title, List columns, List rows, + List metrics, Collection filters) { + return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics), filters)); } } diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index 9e71f6158..e53cef183 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -9,6 +9,8 @@ import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.Collection; +import java.util.Collections; import java.util.List; /** @@ -24,14 +26,15 @@ public class OneNumberReportDefinitionContent extends ReportDefinitionContent { @JsonCreator private OneNumberReportDefinitionContent(@JsonProperty("format") String format, @JsonProperty("grid") Grid grid, - @JsonProperty("oneNumber") OneNumberVisualization oneNumber) { - super(format, grid); + @JsonProperty("oneNumber") OneNumberVisualization oneNumber, + @JsonProperty("filters") Collection filters) { + super(format, grid, filters); this.oneNumber = oneNumber; } /* Just for serialization test */ - OneNumberReportDefinitionContent(Grid grid, String description) { - super(FORMAT, grid); + OneNumberReportDefinitionContent(Grid grid, String description, Collection filters) { + super(FORMAT, grid, filters); oneNumber = new OneNumberVisualization(new OneNumberLabels(description)); } @@ -77,7 +80,12 @@ public String getDescription() { public static ReportDefinition create(String title, List columns, List rows, List metrics) { + return create(title, columns, rows, metrics, Collections.emptyList()); + } + + public static ReportDefinition create(String title, List columns, List rows, + List metrics, Collection filters) { return new ReportDefinition(new Meta(title), new OneNumberReportDefinitionContent( - new Grid(columns, rows, metrics), title)); + new Grid(columns, rows, metrics), title, filters)); } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index e4387ef3f..063ed8d88 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -11,8 +11,6 @@ import java.util.Collection; -import static java.util.Collections.emptyList; - /** * Report definition content */ @@ -29,12 +27,12 @@ public abstract class ReportDefinitionContent { private final String format; private final Grid grid; - private final Collection filters; //TODO proper type + private final Collection filters; - public ReportDefinitionContent(String format, Grid grid) { + public ReportDefinitionContent(String format, Grid grid, Collection filters) { this.format = format; this.grid = grid; - this.filters = emptyList(); + this.filters = filters; } @JsonIgnore // handled by type info @@ -46,7 +44,7 @@ public Grid getGrid() { return grid; } - public Collection getFilters() { + public Collection getFilters() { return filters; } } diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 1ea4a05d5..5a95f723a 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -18,6 +18,7 @@ import com.gooddata.md.*; import com.gooddata.md.ScheduledMail; import com.gooddata.md.report.AttributeInGrid; +import com.gooddata.md.report.Filter; import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; import com.gooddata.md.report.Report; @@ -262,7 +263,8 @@ public void createReport() throws Exception { "Department avg shoe size", asList("metricGroup"), asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), - asList(new GridElement(metric.getUri(), "Avg shoe size")) + asList(new GridElement(metric.getUri(), "Avg shoe size")), + asList(new Filter("(SELECT [" + metric.getUri() + "]) >= 0")) )); md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); } diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 337a6dbb2..89e3427a9 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -30,7 +30,7 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final OneNumberReportDefinitionContent def = new OneNumberReportDefinitionContent( new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc" + Collections.emptyList()), "desc", Collections.emptyList() ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index e2fcdbb1c..59716db6f 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -10,6 +10,7 @@ import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -32,7 +33,7 @@ public void testSerialization() throws Exception { final ReportDefinition def = new ReportDefinition("Untitled", new OneNumberReportDefinitionContent( new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc") + Collections.emptyList()), "desc", asList(new Filter("(SELECT [/gdc/md/projectId/obj/123]) >= 2"))) ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); } diff --git a/src/test/resources/md/report/oneNumberReportDefinition-input.json b/src/test/resources/md/report/oneNumberReportDefinition-input.json index 22af47a7d..4cb562329 100644 --- a/src/test/resources/md/report/oneNumberReportDefinition-input.json +++ b/src/test/resources/md/report/oneNumberReportDefinition-input.json @@ -17,7 +17,7 @@ } }, "format" : "oneNumber", - "filters" : [] + "filters" : [ { "expression" : "(SELECT [/gdc/md/projectId/obj/123]) >= 2" } ] }, "meta" : { "title" : "Untitled", From 27d0764b8cec7785c104ad8d173ded9df048eb81 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Thu, 14 May 2015 18:13:34 +0200 Subject: [PATCH 0174/1191] add support for metadata object removal --- README.md | 4 +- .../java/com/gooddata/md/MetadataService.java | 48 +++++++++++++++++++ .../com/gooddata/md/ObjNotFoundException.java | 19 ++++++++ src/test/java/com/gooddata/ShowcaseAT.java | 15 +++++- .../com/gooddata/md/MetadataServiceIT.java | 22 +++++++++ src/test/java/com/gooddata/md/MetricTest.java | 2 +- src/test/resources/md/metric-input.json | 3 +- src/test/resources/md/metric-new.json | 14 ++++++ 8 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 src/test/resources/md/metric-new.json diff --git a/README.md b/README.md index fd422ccf2..e74efc8ea 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ modelService.updateProjectModel(project, "MAQL DDL EXPRESSION").get(); ### Metadata API -Query, create and update project metadata - attributes, facts, metrics, reports,... +Query, create, update and remove project metadata - attributes, facts, metrics, reports,... ```java MetadataService md = gd.getMetadataService(); @@ -99,6 +99,8 @@ ReportDefinition definition = GridReportDefinitionContent.create( ); definition = md.createObj(project, definition); Report report = md.createObj(project, new Report(definition.getTitle(), definition)); + +md.removeObj(report) ``` Create and retrieve scheduled mails on reports and dashboards: diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 3530bdaac..c1d84ffd2 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -93,6 +93,54 @@ public T getObjByUri(String uri, Class cls) { } } + /** + * Remove metadata object URI + * + * @param obj metadata object to remove + * @param type of the object to be returned + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code + * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error + */ + public void removeObj(Obj obj) { + notNull(obj, "obj"); + try { + restTemplate.delete(obj.getUri()); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new ObjNotFoundException(obj); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to remove " + obj.getClass().getSimpleName().toLowerCase() + " " + obj.getUri(), e); + } + } + + /** + * Remove metadata object by URI (format is /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID}) + * + * @param uri URI in format /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID} + * @param type of the object to be returned + * @throws com.gooddata.md.ObjNotFoundException if metadata object not found + * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code + * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error + */ + public void removeObjByUri(String uri) { + notNull(uri, "uri"); + try { + restTemplate.delete(uri); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new ObjNotFoundException(uri); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to remove " + uri, e); + } + } + /** * Get metadata object by id. * diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index 7d927a8e3..62f52405c 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -19,6 +19,25 @@ public ObjNotFoundException(String uri, Class cls, Exception super(cls.getSimpleName() + " not found " + uri, e); } + /** + * Construct a new instance of ObjNotFoundException. + * + * @param obj metadata object you're working with + * @param the type of results you're searching for + */ + public ObjNotFoundException(Obj obj) { + super(obj.getClass().getSimpleName() + " not found " + obj.getUri()); + } + + /** + * Construct a new instance of ObjNotFoundException. + * + * @param uri the URI of metadata object you're searching for + */ + public ObjNotFoundException(String uri) { + super("not found " + uri); + } + /** * Construct a new instance of ObjNotFoundException. * diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 1ea4a05d5..6e9455ab5 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -82,6 +82,7 @@ public class ShowcaseAT { private Attribute attr; private Metric metric; private ReportDefinition reportDefinition; + private Report report; private String file; private String projectToken; private String warehouseToken; @@ -264,7 +265,7 @@ public void createReport() throws Exception { asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), asList(new GridElement(metric.getUri(), "Avg shoe size")) )); - md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); + report = md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); } @Test(groups = "md", dependsOnMethods = "createReport") @@ -354,6 +355,18 @@ public void exportReportDefinition() throws Exception { reportService.exportReport(reportDefinition, ReportExportFormat.CSV, System.out); } + @Test(dependsOnGroups = "report") + public void removeReport() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(report); + } + + @Test(dependsOnMethods = "removeReport") + public void removeDefinition() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(reportDefinition); + } + @Test(groups = "warehouse", dependsOnMethods = "login") public void createWarehouse() throws Exception { final WarehouseService warehouseService = gd.getWarehouseService(); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index b0e8f13dd..db15840d1 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -108,6 +108,28 @@ public void shouldCreateObj() throws Exception { assertThat(((Metric) result).getFormat(), is("FORMAT")); } + @Test + public void shouldRemoveObjByUri() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(204); + + gd.getMetadataService().removeObjByUri(SPECIFIC_OBJ_URI); + } + + @Test + public void shouldRemoveObj() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(204); + + gd.getMetadataService().removeObj(metricInput); + } + @Test public void shouldCreateMailScheduleObj() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 79c07b603..d1c98a2ce 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -25,6 +25,6 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final Metric metric = new Metric("Person Name", "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", "FORMAT"); - assertThat(metric, serializesToJson("/md/metric-input.json")); + assertThat(metric, serializesToJson("/md/metric-new.json")); } } \ No newline at end of file diff --git a/src/test/resources/md/metric-input.json b/src/test/resources/md/metric-input.json index 50731c554..8c995bb07 100644 --- a/src/test/resources/md/metric-input.json +++ b/src/test/resources/md/metric-input.json @@ -8,7 +8,8 @@ "title" : "Person Name", "deprecated" : "0", "locked": 0, - "unlisted": 0 + "unlisted": 0, + "uri": "/gdc/md/PROJECT_ID/obj/ID" } } } diff --git a/src/test/resources/md/metric-new.json b/src/test/resources/md/metric-new.json new file mode 100644 index 000000000..a68ede3b3 --- /dev/null +++ b/src/test/resources/md/metric-new.json @@ -0,0 +1,14 @@ +{ + "metric" : { + "content" : { + "expression" : "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", + "format" : "FORMAT" + }, + "meta" : { + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 + } + } +} From 09160b7f4b59ebf8fa57b84920b6e3db65e43650 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Nov 2014 10:59:45 +0100 Subject: [PATCH 0175/1191] add: zd4 connector incremental load suport Close #165 --- .../gooddata/connector/Zendesk4ProcessExecution.java | 10 ++++++++++ .../connector/Zendesk4ProcessExecutionTest.java | 8 ++++++++ .../connector/process-execution-incremental.json | 5 +++++ 3 files changed, 23 insertions(+) create mode 100644 src/test/resources/connector/process-execution-incremental.json diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 626f8bd2a..424633714 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -10,8 +10,18 @@ */ public class Zendesk4ProcessExecution implements ProcessExecution { + private Boolean incremental; + @Override public ConnectorType getConnectorType() { return ZENDESK4; } + + public Boolean getIncremental() { + return incremental; + } + + public void setIncremental(final Boolean incremental) { + this.incremental = incremental; + } } diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index 6a0fa443b..756a53fef 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -15,4 +15,12 @@ public void testShouldSerialize() throws Exception { assertThat(new Zendesk4ProcessExecution(), JsonMatchers.serializesToJson( "/connector/process-execution-empty.json")); } + + @Test + public void testShouldSerializeIncremental() throws Exception { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + execution.setIncremental(true); + assertThat(execution, JsonMatchers.serializesToJson( + "/connector/process-execution-incremental.json")); + } } \ No newline at end of file diff --git a/src/test/resources/connector/process-execution-incremental.json b/src/test/resources/connector/process-execution-incremental.json new file mode 100644 index 000000000..df16141de --- /dev/null +++ b/src/test/resources/connector/process-execution-incremental.json @@ -0,0 +1,5 @@ +{ + "process": { + "incremental": true + } +} \ No newline at end of file From 57b6bdc493474793f01c477ef0108eb59f0f1d2f Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Wed, 20 May 2015 11:22:29 +0200 Subject: [PATCH 0176/1191] BUILD: Check that all used dependencies are also declared It is not good practice to rely on transitive deps as your project can be easily broken by updating your deps. All used dependencies should be declared. maven-dependecy-plugin is now configured to break build if any used dep is not declared. Unfortunately problematic deps are shown only as warnings. --- pom.xml | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index ae16f356e..9bd69de5a 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,10 @@ UTF-8 UTF-8 4.3.3 + 1.9.12 + 3.2.13.RELEASE + 1.1.1 + 1.5.3 @@ -85,6 +89,23 @@ + + org.apache.maven.plugins + maven-dependency-plugin + 2.10 + + + analyze + + analyze-only + + + true + true + + + + @@ -177,6 +198,11 @@ gooddata-http-client 0.8.3 + + commons-lang + commons-lang + 2.6 + org.apache.httpcomponents httpclient @@ -187,10 +213,15 @@ httpcore ${httpclient.version} + + org.springframework + spring-core + ${spring.version} + org.springframework spring-web - 3.2.13.RELEASE + ${spring.version} aopalliance @@ -206,10 +237,15 @@ + + org.codehaus.jackson + jackson-core-asl + ${jackson-asl.version} + org.codehaus.jackson jackson-mapper-asl - 1.9.12 + ${jackson-asl.version} com.fasterxml.jackson.core @@ -228,6 +264,12 @@ 2.7 + + commons-io + commons-io + 2.4 + test + org.testng testng @@ -255,7 +297,13 @@ net.javacrumbs.json-unit json-unit - 1.5.3 + ${json-unit.version} + test + + + net.javacrumbs.json-unit + json-unit-core + ${json-unit.version} test @@ -264,10 +312,16 @@ 1.2.17 test + + net.jadler + jadler-core + ${jadler.version} + test + net.jadler jadler-all - 1.1.1 + ${jadler.version} test From c4994ce033184be24deadf27024550ebe1f76e53 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Wed, 20 May 2015 11:19:40 +0200 Subject: [PATCH 0177/1191] BUILD: Add animal-sniffer for checking targetJdk compat --- pom.xml | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/pom.xml b/pom.xml index 9bd69de5a..ba637b131 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,51 @@ + + org.codehaus.mojo + build-helper-maven-plugin + + + parse-version + + parse-version + + + + regex-property + + regex-property + + + animalSnifferJdkVersion + ${targetJdk} + ^1\.([0-9]+)$ + java1$1 + true + + + + + + org.codehaus.mojo + animal-sniffer-maven-plugin + 1.14 + + + org.codehaus.mojo.signature + ${animalSnifferJdkVersion} + 1.0 + + + + + package + + check + + + + org.apache.maven.plugins maven-dependency-plugin From 885e7015fcbcaf45e6ad6a1e8c5ded178fcb06ba Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 12:57:36 +0200 Subject: [PATCH 0178/1191] removed commons-lang (again) --- pom.xml | 5 ----- src/main/java/com/gooddata/project/Project.java | 4 ++-- src/main/java/com/gooddata/project/ProjectDriver.java | 2 +- src/main/java/com/gooddata/project/ProjectFeatureFlag.java | 4 ++-- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 9bd69de5a..e92c4649f 100644 --- a/pom.xml +++ b/pom.xml @@ -198,11 +198,6 @@ gooddata-http-client 0.8.3 - - commons-lang - commons-lang - 2.6 - org.apache.httpcomponents httpclient diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 5f49d3690..c1b4bf58d 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -21,9 +21,9 @@ import java.util.HashSet; import java.util.Set; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; -import static org.apache.commons.lang.Validate.notEmpty; -import static org.apache.commons.lang.Validate.notNull; /** * Project in GoodData platform diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java index 7e59f994c..fb063da68 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -4,7 +4,7 @@ package com.gooddata.project; -import static org.apache.commons.lang.Validate.notEmpty; +import static com.gooddata.util.Validate.notEmpty; public enum ProjectDriver { POSTGRES("Pg"), diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index 094c8f681..c137bfb1e 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -1,7 +1,5 @@ package com.gooddata.project; -import static org.apache.commons.lang.Validate.notNull; - import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -11,6 +9,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import org.springframework.web.util.UriTemplate; +import static com.gooddata.util.Validate.notNull; + /** * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform * on per project basis. From 490f3a59245716241a045f7d0fc1949b9e6e368a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 10:55:00 +0200 Subject: [PATCH 0179/1191] add Project environment support Close #147 --- .../java/com/gooddata/project/Project.java | 27 +++++++++++++++++++ .../gooddata/project/ProjectEnvironment.java | 14 ++++++++++ src/test/java/com/gooddata/ShowcaseAT.java | 5 +++- .../com/gooddata/project/ProjectTest.java | 3 +++ src/test/resources/project/project.json | 1 + 5 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/project/ProjectEnvironment.java diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 5f49d3690..2f7cd6d68 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -240,6 +240,20 @@ public void setDriver(ProjectDriver driver) { setDriver(driver.getValue()); } + @JsonIgnore + public String getEnvironment() { + return content.getEnvironment(); + } + + @JsonIgnore + public void setEnvironment(final String environment) { + content.setEnvironment(environment); + } + + public void setEnvironment(final ProjectEnvironment environment) { + notNull(environment, "environment"); + setEnvironment(environment.name()); + } @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) @@ -263,6 +277,9 @@ private static class ProjectContent { @JsonIgnore private String state; + @JsonProperty + private String environment; + public ProjectContent(final String authorizationToken) { this.authorizationToken = authorizationToken; guidedNavigation = "1"; @@ -275,6 +292,7 @@ public ProjectContent(@JsonProperty("authorizationToken") String authorizationTo @JsonProperty("cluster") String cluster, @JsonProperty("guidedNavigation") String guidedNavigation, @JsonProperty("isPublic") String isPublic, + @JsonProperty("environment") String environment, @JsonProperty("state") String state) { this.authorizationToken = authorizationToken; this.guidedNavigation = guidedNavigation; @@ -282,6 +300,7 @@ public ProjectContent(@JsonProperty("authorizationToken") String authorizationTo this.cluster = cluster; this.isPublic = isPublic; this.state = state; + this.environment = environment; } public String getState() { @@ -311,6 +330,14 @@ public String getIsPublic() { public void setDriver(String driver) { this.driver = driver; } + + public String getEnvironment() { + return environment; + } + + public void setEnvironment(final String environment) { + this.environment = environment; + } } @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/project/ProjectEnvironment.java b/src/main/java/com/gooddata/project/ProjectEnvironment.java new file mode 100644 index 000000000..4f014f77d --- /dev/null +++ b/src/main/java/com/gooddata/project/ProjectEnvironment.java @@ -0,0 +1,14 @@ +package com.gooddata.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. + */ +public enum ProjectEnvironment { + /** Default value, projects are backed-up and archived. */ + PRODUCTION, + /** no meaning yet and behavior is the same as for {@link #PRODUCTION} projects*/ + DEVELOPMENT, + /** 'TESTING' projects are not backed-up and archived. */ + TESTING +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 389e4eff9..39656cb38 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -56,6 +56,7 @@ import static com.gooddata.ProjectIdMatcher.hasSameIdAs; import static com.gooddata.WarehouseIdMatcher.hasSameIdAs; import static com.gooddata.md.Restriction.identifier; +import static com.gooddata.project.ProjectEnvironment.TESTING; import static java.nio.file.Files.createTempDirectory; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; @@ -127,7 +128,9 @@ public void login() throws Exception { @Test(groups = "project", dependsOnMethods = "login") public void createProject() throws Exception { - project = gd.getProjectService().createProject(new Project(title, projectToken)).get(); + final Project p = new Project(title, projectToken); + p.setEnvironment(TESTING); + project = gd.getProjectService().createProject(p).get(); } @Test(groups = "project", dependsOnMethods = "createProject") diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 71767820d..7b523e8e1 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -26,6 +26,7 @@ public void testDeserialize() throws Exception { assertThat(project.getCluster(), is("CLUSTER")); assertThat(project.isPublic(), is(false)); assertThat(project.getState(), is("ENABLED")); + assertThat(project.getEnvironment(), is("TESTING")); assertThat(project.getTitle(), is("TITLE")); assertThat(project.getSummary(), is("DESC")); @@ -57,6 +58,7 @@ public void testDeserialize() throws Exception { public void testSerialize() throws Exception { final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); project.setProjectTemplate("/projectTemplates/TEMPLATE"); + project.setEnvironment(ProjectEnvironment.TESTING); final String serializedProject = new ObjectMapper().writeValueAsString(project); assertThat(serializedProject, startsWith("{\"project\"")); @@ -73,6 +75,7 @@ public void testSerialize() throws Exception { assertThat(serializedProject, containsString("\"title\":\"TITLE\"")); assertThat(serializedProject, containsString("\"summary\":\"SUMMARY\"")); assertThat(serializedProject, containsString("\"projectTemplate\":\"/projectTemplates/TEMPLATE\"")); + assertThat(serializedProject, containsString("\"environment\":\"TESTING\"")); assertThat(serializedProject, not(containsString("\"author\""))); assertThat(serializedProject, not(containsString("\"contributor\""))); assertThat(serializedProject, not(containsString("\"created\""))); diff --git a/src/test/resources/project/project.json b/src/test/resources/project/project.json index 8f3223cbe..fa06c00c3 100644 --- a/src/test/resources/project/project.json +++ b/src/test/resources/project/project.json @@ -6,6 +6,7 @@ "guidedNavigation" : "1", "isPublic" : "0", "driver" : "Pg", + "environment" : "TESTING", "state" : "ENABLED" }, "links" : { From 558a10c9e5e1af8086bd7d818497aab8d4896f07 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 16:34:10 +0200 Subject: [PATCH 0180/1191] remove commons-lang usage where possible --- src/main/java/com/gooddata/UriPrefixer.java | 8 ++++---- src/main/java/com/gooddata/dataset/DatasetService.java | 2 +- src/main/java/com/gooddata/project/Project.java | 4 ++-- src/main/java/com/gooddata/project/ProjectDriver.java | 2 +- .../java/com/gooddata/project/ProjectFeatureFlag.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 67d348f15..8378920f3 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -3,15 +3,14 @@ */ package com.gooddata; -import org.apache.commons.lang.StringUtils; import org.springframework.web.util.UriComponentsBuilder; -import java.io.File; import java.net.URI; -import java.nio.file.Paths; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static org.springframework.util.StringUtils.trimLeadingCharacter; +import static org.springframework.util.StringUtils.trimTrailingCharacter; /** * Used internally by GoodData SDK to hold and set URI prefix (hostname and port) of all requests. @@ -55,8 +54,9 @@ public URI getUriPrefix() { */ public URI mergeUris(URI uri) { notNull(uri, "uri"); + final String path = trimTrailingCharacter(trimLeadingCharacter(uri.getRawPath(), '/'), '/'); return UriComponentsBuilder.fromUri(uriPrefix) - .pathSegment(StringUtils.strip(uri.getRawPath(), "/")) + .pathSegment(path) .query(uri.getRawQuery()) .fragment(uri.getRawFragment()) .build().toUri(); diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index d5d82316e..cf353c547 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -35,7 +35,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; -import static org.apache.commons.lang.StringUtils.isEmpty; +import static org.springframework.util.StringUtils.isEmpty; /** * Service to work with datasets and manifests. diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 91ddf6afb..2f7cd6d68 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -21,9 +21,9 @@ import java.util.HashSet; import java.util.Set; -import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; +import static org.apache.commons.lang.Validate.notEmpty; +import static org.apache.commons.lang.Validate.notNull; /** * Project in GoodData platform diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java index fb063da68..7e59f994c 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -4,7 +4,7 @@ package com.gooddata.project; -import static com.gooddata.util.Validate.notEmpty; +import static org.apache.commons.lang.Validate.notEmpty; public enum ProjectDriver { POSTGRES("Pg"), diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index c137bfb1e..094c8f681 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -1,5 +1,7 @@ package com.gooddata.project; +import static org.apache.commons.lang.Validate.notNull; + import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -9,8 +11,6 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import org.springframework.web.util.UriTemplate; -import static com.gooddata.util.Validate.notNull; - /** * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform * on per project basis. From a10848044cb1c4de8e34ca4ba28f8019fa8c6479 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 16:33:32 +0200 Subject: [PATCH 0181/1191] put back gdc-lang dependency as DatasetService uses RandomStringUtils --- pom.xml | 5 +++++ src/main/java/com/gooddata/project/Project.java | 4 ++-- src/main/java/com/gooddata/project/ProjectDriver.java | 2 +- src/main/java/com/gooddata/project/ProjectFeatureFlag.java | 4 ++-- 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 6b4d25acd..ba637b131 100644 --- a/pom.xml +++ b/pom.xml @@ -243,6 +243,11 @@ gooddata-http-client 0.8.3 + + commons-lang + commons-lang + 2.6 + org.apache.httpcomponents httpclient diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 2f7cd6d68..91ddf6afb 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -21,9 +21,9 @@ import java.util.HashSet; import java.util.Set; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; -import static org.apache.commons.lang.Validate.notEmpty; -import static org.apache.commons.lang.Validate.notNull; /** * Project in GoodData platform diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java index 7e59f994c..fb063da68 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -4,7 +4,7 @@ package com.gooddata.project; -import static org.apache.commons.lang.Validate.notEmpty; +import static com.gooddata.util.Validate.notEmpty; public enum ProjectDriver { POSTGRES("Pg"), diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index 094c8f681..c137bfb1e 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -1,7 +1,5 @@ package com.gooddata.project; -import static org.apache.commons.lang.Validate.notNull; - import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -11,6 +9,8 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; import org.springframework.web.util.UriTemplate; +import static com.gooddata.util.Validate.notNull; + /** * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform * on per project basis. From 128074d8dac565cbfba6535b6b8610c3a98bb83c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 17:03:02 +0200 Subject: [PATCH 0182/1191] [maven-release-plugin] prepare release gooddata-java-0.15.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba637b131..efd0b885a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.14.1-SNAPSHOT + 0.15.0 ${project.artifactId} GoodData Java SDK From 382871554f0fc0b36ad23b7e6eafef3b8b7f069f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 20 May 2015 17:03:03 +0200 Subject: [PATCH 0183/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index efd0b885a..e4303bac8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.15.0 + 0.15.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From f539de11c4f17e681c261e4cf675088157ca4194 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 22 May 2015 10:05:48 +0200 Subject: [PATCH 0184/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e74efc8ea..71e832d68 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.14.0 + 0.15.0 ``` From 674ac0fab84f8729679bc1c0789808489ce8488a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 15 May 2015 07:22:08 +0200 Subject: [PATCH 0185/1191] introduce connection params --- src/main/java/com/gooddata/GoodData.java | 69 ++++++++- .../java/com/gooddata/GoodDataSettings.java | 145 ++++++++++++++++++ .../java/com/gooddata/AbstractGoodDataIT.java | 2 +- .../com/gooddata/GoodDataSettingsTest.java | 30 ++++ 4 files changed, 239 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gooddata/GoodDataSettings.java create mode 100644 src/test/java/com/gooddata/GoodDataSettingsTest.java diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 893d145e4..4b61c7118 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -19,7 +19,9 @@ import com.gooddata.report.ReportService; import org.apache.http.HttpHost; import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.VersionInfo; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; @@ -84,7 +86,18 @@ public class GoodData { * @param password GoodData user's password */ public GoodData(String login, String password) { - this(HOSTNAME, login, password); + this(HOSTNAME, login, password, new GoodDataSettings()); + } + + /** + * Create instance configured to communicate with GoodData Platform under user with given credentials. + * + * @param login GoodData user's login + * @param password GoodData user's password + * @param settings additional settings + */ + public GoodData(String login, String password, GoodDataSettings settings) { + this(HOSTNAME, login, password, settings); } /** @@ -96,7 +109,22 @@ public GoodData(String login, String password) { * @param password GoodData user's password */ public GoodData(String hostname, String login, String password) { - this(hostname, login, password, PORT, PROTOCOL); + this(hostname, login, password, PORT, PROTOCOL, new GoodDataSettings()); + } + + + + /** + * Create instance configured to communicate with GoodData Platform running on given host using given user's + * credentials. + * + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param login GoodData user's login + * @param password GoodData user's password + * @param settings additional settings + */ + public GoodData(String hostname, String login, String password, GoodDataSettings settings) { + this(hostname, login, password, PORT, PROTOCOL, settings); } /** @@ -109,7 +137,21 @@ public GoodData(String hostname, String login, String password) { * @param port GoodData Platform's API port (e.g. 443) */ public GoodData(String hostname, String login, String password, int port) { - this(hostname, login, password, port, PROTOCOL); + this(hostname, login, password, port, PROTOCOL, new GoodDataSettings()); + } + + /** + * Create instance configured to communicate with GoodData Platform running on given host and port using given user's + * credentials. + * + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param login GoodData user's login + * @param password GoodData user's password + * @param port GoodData Platform's API port (e.g. 443) + * @param settings additional settings + */ + public GoodData(String hostname, String login, String password, int port, GoodDataSettings settings) { + this(hostname, login, password, port, PROTOCOL, settings); } @@ -123,13 +165,13 @@ public GoodData(String hostname, String login, String password, int port) { * @param port GoodData Platform's API port (e.g. 443) * @param protocol GoodData Platform's API protocol (e.g. https) */ - protected GoodData(String hostname, String login, String password, int port, String protocol) { + protected GoodData(String hostname, String login, String password, int port, String protocol, GoodDataSettings settings) { notEmpty(hostname, "hostname"); notEmpty(login, "login"); notEmpty(password, "password"); notEmpty(protocol, "protocol"); - final HttpClientBuilder httpClientBuilder = HttpClientBuilder.create() - .setUserAgent(getUserAgent()); + final HttpClientBuilder httpClientBuilder = createHttpClientBuilder(settings); + restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, protocol); accountService = new AccountService(getRestTemplate()); @@ -179,6 +221,21 @@ private RestTemplate createRestTemplate(String login, String password, String ho return restTemplate; } + private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings settings) { + final PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); + connectionManager.setDefaultMaxPerRoute(settings.getMaxConnections()); + connectionManager.setMaxTotal(settings.getMaxConnections()); + + final RequestConfig.Builder requestConfig = RequestConfig.copy(RequestConfig.DEFAULT); + requestConfig.setConnectTimeout(settings.getConnectionTimeout()); + requestConfig.setSocketTimeout(settings.getSocketTimeout()); + + return HttpClientBuilder.create() + .setUserAgent(getUserAgent()) + .setConnectionManager(connectionManager) + .setDefaultRequestConfig(requestConfig.build()); + } + /* * Set accept header (application/json by default) and append rest api versioning information which is mandatory * for some resources. diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java new file mode 100644 index 000000000..786db2743 --- /dev/null +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -0,0 +1,145 @@ +package com.gooddata; + +import static org.springframework.util.Assert.isTrue; + +import org.apache.http.client.config.RequestConfig; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.springframework.util.Assert; + +import java.util.concurrent.TimeUnit; + +/** + * Gather various additional settings of {@link GoodData}. Can be passed to the {@link GoodData} constructor to tune up it's behaviour. + * Settings are applied only once at the beginning. Changing this bean after it's passed to {@link GoodData} has no effect. + */ +public class GoodDataSettings { + + private int maxConnections = 20; + private int connectionTimeout = secondsToMillis(10); + private int socketTimeout = secondsToMillis(60); + + + /** + * Set maximum number of connections used. This applies same for connections per host as for total connections. + * (As we assume GoodData connects to single host). + * + * The default value is 20. + * + * @param maxConnections maximum number of connections used. + */ + public void setMaxConnections(int maxConnections) { + isTrue(connectionTimeout > 0, "connectionTimeout must be greater than zero"); + this.maxConnections = maxConnections; + } + + /** + * Maximum number of connection used + * @return maximum number of connection used + */ + public int getMaxConnections() { + return maxConnections; + } + + /** + * Set timeout milliseconds until connection established. + * The default value is 10 seconds (10000 ms). + * Set to 0 for infinite. + * + * @param connectionTimeout connection timeout milliseconds + */ + public void setConnectionTimeout(int connectionTimeout) { + isTrue(connectionTimeout >= 0, "connectionTimeout must be not negative"); + this.connectionTimeout = connectionTimeout; + } + + /** + * Set timeout seconds until connection established. + * The default value is 10 seconds. + * Set to 0 for infinite. + * + * @param connectionTimeout connection timeout seconds + */ + public void setConnectionTimeoutSeconds(int connectionTimeout) { + setConnectionTimeout(secondsToMillis(connectionTimeout)); + } + + /** + * Milliseconds until connection established. + * @return milliseconds until connection established + */ + public int getConnectionTimeout() { + return connectionTimeout; + } + + /** + * Set socket timeout (maximum period inactivity between two consecutive data packets) milliseconds. + * The default value is 60 seconds (60000 ms). + * Set to 0 for infinite. + * + * @param socketTimeout socket timeout milliseconds + */ + public void setSocketTimeout(int socketTimeout) { + isTrue(socketTimeout >= 0, "socketTimeout must be not negative"); + this.socketTimeout = socketTimeout; + } + + /** + * Set socket timeout (maximum period inactivity between two consecutive data packets) seconds. + * The default value is 60 seconds. + * Set to 0 for infinite. + * + * @param socketTimeout socket timeout seconds + */ + public void setSocketTimeoutSeconds(int socketTimeout) { + setSocketTimeout(secondsToMillis(socketTimeout)); + } + + /** + * Milliseconds for inactivity between two consecutive data packets. + * @return milliseconds for inactivity between two consecutive data packets + */ + public int getSocketTimeout() { + return socketTimeout; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof GoodDataSettings)) + return false; + + GoodDataSettings that = (GoodDataSettings) o; + + if (maxConnections != that.maxConnections) + return false; + if (connectionTimeout != that.connectionTimeout) + return false; + return socketTimeout == that.socketTimeout; + + } + + @Override + public int hashCode() { + int result = maxConnections; + result = 31 * result + connectionTimeout; + result = 31 * result + socketTimeout; + return result; + } + + @Override + public String toString() { + return "GoodDataSettings{" + + "maxConnections=" + maxConnections + + ", connectionTimeout=" + connectionTimeout + + ", socketTimeout=" + socketTimeout + + '}'; + } + + private static int secondsToMillis(int seconds) { + return (int) TimeUnit.SECONDS.toMillis(seconds); + } + + +} diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 0f7eec2fe..d8f8e8e81 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -25,7 +25,7 @@ public abstract class AbstractGoodDataIT { @BeforeMethod public void commonSetUp() { initJadler().that().respondsWithDefaultContentType("application/json"); - gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http") { + gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http", new GoodDataSettings()) { @Override protected HttpClient createHttpClient(final String login, final String password, final String hostname, final int port, final String protocol, diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java new file mode 100644 index 000000000..dca0d6da5 --- /dev/null +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -0,0 +1,30 @@ +package com.gooddata; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + +import org.apache.http.impl.client.HttpClientBuilder; +import org.testng.annotations.Test; + + +public class GoodDataSettingsTest { + + @Test + public void testHasDefaults() throws Exception { + final GoodDataSettings settings = new GoodDataSettings(); + assertTrue(settings.getMaxConnections() > 0); + assertTrue(settings.getConnectionTimeout() >= 0); + assertTrue(settings.getSocketTimeout() >= 0); + } + + @Test + public void testSetSeconds() throws Exception { + final GoodDataSettings settings = new GoodDataSettings(); + settings.setConnectionTimeoutSeconds(53); + settings.setSocketTimeoutSeconds(71); + + assertEquals(53000, settings.getConnectionTimeout()); + assertEquals(71000, settings.getSocketTimeout()); + } +} \ No newline at end of file From f3a91f990b33a1cc1980ff6703ee7d8f48660f51 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 27 May 2015 16:44:25 +0200 Subject: [PATCH 0186/1191] fix failing reportDefinition AT --- src/test/java/com/gooddata/ShowcaseAT.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 39656cb38..68ce2f464 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -301,6 +301,12 @@ public void retrieveScheduledMail() throws Exception { } } + @Test(groups = "md", dependsOnMethods = "retrieveScheduledMail") + public void removeScheduledMail() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(scheduledMail); + } + @Test(groups = "datastore", dependsOnMethods = "login") public void datastoreUpload() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); @@ -366,7 +372,7 @@ public void removeReport() throws Exception { metadataService.removeObj(report); } - @Test(dependsOnMethods = "removeReport") + @Test(dependsOnMethods = {"removeReport", "removeScheduledMail"}) public void removeDefinition() throws Exception { final MetadataService metadataService = gd.getMetadataService(); metadataService.removeObj(reportDefinition); From 586365965b422fac701cfabe38c774af3a360036 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Thu, 28 May 2015 11:08:56 +0200 Subject: [PATCH 0187/1191] fix javadoc for object removal method --- src/main/java/com/gooddata/md/MetadataService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index c1d84ffd2..c7aedc123 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -97,7 +97,6 @@ public T getObjByUri(String uri, Class cls) { * Remove metadata object URI * * @param obj metadata object to remove - * @param type of the object to be returned * @throws com.gooddata.md.ObjNotFoundException if metadata object not found * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error @@ -121,7 +120,6 @@ public void removeObj(Obj obj) { * Remove metadata object by URI (format is /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID}) * * @param uri URI in format /gdc/md/{PROJECT_ID}/obj/{OBJECT_ID} - * @param type of the object to be returned * @throws com.gooddata.md.ObjNotFoundException if metadata object not found * @throws com.gooddata.GoodDataRestException if GoodData REST API returns unexpected status code * @throws com.gooddata.GoodDataException if no response from API or client-side HTTP error From 2a729aaf76b3a3f010629bba0515b32ffbc54223 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 1 Jun 2015 08:53:28 +0200 Subject: [PATCH 0188/1191] introduce get for connector settings --- .../gooddata/connector/ConnectorService.java | 30 +++++++++++++++++++ .../connector/ConnectorServiceIT.java | 23 ++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 0de7e2165..c79dea10f 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -133,6 +133,36 @@ public void updateIntegration(final Project project, final ConnectorType connect } } + /** + * Get settings for zendesk4 connector. + * @param project project + * @return settings for zendesk4 connector + */ + public Zendesk4Settings getZendesk4Settings(Project project) { + return getSettings(project, ConnectorType.ZENDESK4, Zendesk4Settings.class); + } + + /** + * Get settings for given connector of given class. + * + * @param project project + * @param connectorType type of connector to fetch settings ofr + * @param settingsClass class of settings fetched + * @param type of fetched settings + * @return settings of connector + */ + public T getSettings(Project project, ConnectorType connectorType, Class settingsClass) { + notNull(project, "project"); + notNull(connectorType, "connectorType"); + notNull(settingsClass, "settingsClass"); + + try { + return restTemplate.getForObject(Settings.URL, settingsClass, project.getId(), connectorType.getName()); + } catch (GoodDataRestException | RestClientException e) { + throw new ConnectorException("Unable to get " + connectorType + " integration settings", e); + } + } + /** * Update integration settings * diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 92c1cb857..8390198f5 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -2,12 +2,14 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.JsonMatchers; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static com.gooddata.JsonMatchers.serializesToJson; import static com.gooddata.connector.Status.Code.ERROR; import static com.gooddata.connector.Status.Code.SYNCHRONIZED; import static com.gooddata.util.ResourceUtils.*; @@ -146,4 +148,25 @@ public void shouldFailExecuteProcess() throws Exception { final ProcessStatus process = connectors.executeProcess(project, new Zendesk4ProcessExecution()).get(); assertThat(process.getStatus().getCode(), is(ERROR.name())); } + + @Test + public void shouldGetSettings() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .respond() + .withBody(readFromResource("/connector/settings-zendesk4.json")); + + final Zendesk4Settings zendesk4Settings = connectors.getZendesk4Settings(project); + assertThat(zendesk4Settings, serializesToJson("/connector/settings-zendesk4.json")); + } + + @Test(expectedExceptions = ConnectorException.class) + public void shouldGetSettingsNotFound() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .respond() + .withStatus(404); + + connectors.getZendesk4Settings(project); + } } From a2ad8a646cc977d64cba2768d199ac458a79c94b Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Sun, 31 May 2015 08:16:59 +0200 Subject: [PATCH 0189/1191] introduce metadata object update --- src/main/java/com/gooddata/md/Attribute.java | 2 +- .../com/gooddata/md/AttributeDisplayForm.java | 2 +- src/main/java/com/gooddata/md/Fact.java | 2 +- .../java/com/gooddata/md/MetadataService.java | 19 +++++++++ src/main/java/com/gooddata/md/Metric.java | 2 +- .../com/gooddata/md/ObjUpdateException.java | 31 +++++++++++++++ .../java/com/gooddata/md/ScheduledMail.java | 2 +- src/main/java/com/gooddata/md/Updatable.java | 7 ++++ .../java/com/gooddata/md/report/Report.java | 3 +- .../gooddata/md/report/ReportDefinition.java | 3 +- src/test/java/com/gooddata/ShowcaseAT.java | 10 +++++ .../com/gooddata/md/MetadataServiceIT.java | 25 ++++++++++++ .../com/gooddata/md/MetadataServiceTest.java | 39 +++++++++++++++++++ 13 files changed, 140 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gooddata/md/ObjUpdateException.java create mode 100644 src/main/java/com/gooddata/md/Updatable.java diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index c3f0c7320..672a93f0e 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -23,7 +23,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Attribute extends AbstractObj implements Queryable { +public class Attribute extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private final Content content; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index c73b997cf..faea0a86f 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -14,7 +14,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class AttributeDisplayForm extends DisplayForm { +public class AttributeDisplayForm extends DisplayForm implements Updatable { @JsonCreator private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 188a5cc21..46aa0be13 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -22,7 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Fact extends AbstractObj implements Queryable { +public class Fact extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private final Content content; diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index c7aedc123..5ecd971a2 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -93,6 +93,25 @@ public T getObjByUri(String uri, Class cls) { } } + /** + * Update given metadata object. + * + * @param obj object to update + * @param type of the updated object + * @return updated metadata object + * @throws com.gooddata.md.ObjUpdateException in case of error + */ + @SuppressWarnings("unchecked") + public T updateObj(T obj) { + notNull(obj, "obj"); + try { + restTemplate.put(obj.getUri(), obj); + return getObjByUri(obj.getUri(), (Class) obj.getClass()); + } catch (GoodDataException | RestClientException e) { + throw new ObjUpdateException(obj, e); + } + } + /** * Remove metadata object URI * diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index c9e0ff11e..dbd38ae23 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -18,7 +18,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Metric extends AbstractObj implements Queryable { +public class Metric extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private final Content content; diff --git a/src/main/java/com/gooddata/md/ObjUpdateException.java b/src/main/java/com/gooddata/md/ObjUpdateException.java new file mode 100644 index 000000000..8a909e8f7 --- /dev/null +++ b/src/main/java/com/gooddata/md/ObjUpdateException.java @@ -0,0 +1,31 @@ +package com.gooddata.md; + +import com.gooddata.GoodDataException; + +/** + * Metadata object couldn't be updated + */ +public class ObjUpdateException extends GoodDataException { + + /** + * Construct a new instance of ObjUpdateException. + * + * @param obj the metadata object you're trying to update + * @param cause the cause of error + * @param the type of metadata object you're trying to update + */ + public ObjUpdateException(T obj, Throwable cause) { + super("Can't update metadata object: " + obj.getClass().getSimpleName(), cause); + } + + /** + * Construct a new instance of ObjUpdateException. + * + * @param message the detail message + * @param obj the metadata object you're trying to update + * @param the type of metadata object you're trying to update + */ + public ObjUpdateException(String message, T obj) { + super("Can't update metadata object: " + obj.getClass().getSimpleName() + "; Cause: " + message); + } +} diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 408d5487c..1925635ff 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -27,7 +27,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ScheduledMail extends AbstractObj implements Queryable { +public class ScheduledMail extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private Content content; diff --git a/src/main/java/com/gooddata/md/Updatable.java b/src/main/java/com/gooddata/md/Updatable.java new file mode 100644 index 000000000..71800487f --- /dev/null +++ b/src/main/java/com/gooddata/md/Updatable.java @@ -0,0 +1,7 @@ +package com.gooddata.md; + +/** + * Marker interface for metadata objects which can be updated. (see {@link MetadataService#updateObj(Updatable)}). + */ +public interface Updatable extends Obj { +} diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 984351db3..cb52b114f 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -6,6 +6,7 @@ import com.gooddata.md.AbstractObj; import com.gooddata.md.Meta; import com.gooddata.md.Queryable; +import com.gooddata.md.Updatable; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -25,7 +26,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Report extends AbstractObj implements Queryable { +public class Report extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private final Content content; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 68e3e2a9d..6a0195d3c 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -6,6 +6,7 @@ import com.gooddata.md.AbstractObj; import com.gooddata.md.Meta; import com.gooddata.md.Queryable; +import com.gooddata.md.Updatable; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -21,7 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class ReportDefinition extends AbstractObj implements Queryable { +public class ReportDefinition extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") private final ReportDefinitionContent content; diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 68ce2f464..ee52c18fb 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -253,6 +253,16 @@ public void getObjs() throws Exception { attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); } + @Test(groups = "md", dependsOnMethods = "getObjs") + public void updateObj() throws Exception { + final MetadataService md = gd.getMetadataService(); + + attr.setSummary("Changed person department"); + attr = md.updateObj(attr); + assertThat(attr, is(notNullValue())); + assertThat(attr.getSummary(), is("Changed person department")); + } + @Test(groups = "md", dependsOnMethods = "getObjs") public void createMetric() throws Exception { final MetadataService md = gd.getMetadataService(); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index db15840d1..d1d56d03c 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -108,6 +108,31 @@ public void shouldCreateObj() throws Exception { assertThat(((Metric) result).getFormat(), is("FORMAT")); } + @Test + public void shouldUpdateObj() throws Exception { + onRequest() + .havingMethodEqualTo("PUT") + .havingBodyEqualTo(MAPPER.writeValueAsString(metricInput)) + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(SPECIFIC_OBJ_URI) + .respond() + .withStatus(200) + .withBody(readFromResource("/md/metric.json")); + + final Metric result = gd.getMetadataService().updateObj(metricInput); + + assertThat(result, is(notNullValue())); + assertThat(result, is(instanceOf(Metric.class))); + assertThat(result.getTitle(), is("Person Name")); + assertThat(result.getFormat(), is("FORMAT")); + + } + @Test public void shouldRemoveObjByUri() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 4d7154d4b..4be30045f 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -25,7 +25,9 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class MetadataServiceTest { @@ -85,6 +87,43 @@ public void testCreateObj() throws Exception { assertThat(result, is(notNullValue())); } + @Test + public void testUpdateObj() throws Exception { + final Updatable obj = mock(Updatable.class); + final Updatable resultObj = mock(Updatable.class); + + when(obj.getUri()).thenReturn(URI); + when(restTemplate.getForObject(URI, obj.getClass())).thenReturn(resultObj); + + final Obj result = service.updateObj(obj); + + verify(restTemplate).put(obj.getUri(), obj); + assertThat(result, is(notNullValue())); + } + + @Test(expectedExceptions = ObjUpdateException.class) + public void testUpdateObjNotFound() throws Exception { + final Updatable obj = mock(Updatable.class); + + final GoodDataRestException restException = mock(GoodDataRestException.class); + when(restException.getStatusCode()).thenReturn(HttpStatus.NOT_FOUND.value()); + + when(obj.getUri()).thenReturn(URI); + when(restTemplate.getForObject(URI, obj.getClass())).thenThrow(restException); + + service.updateObj(obj); + } + + @Test(expectedExceptions = ObjUpdateException.class) + public void testUpdateObjRestException() throws Exception { + final Updatable obj = mock(Updatable.class); + + when(obj.getUri()).thenReturn(URI); + doThrow(RestClientException.class).when(restTemplate).put(URI, obj); + + service.updateObj(obj); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testGetObjByUriNullUri() throws Exception { service.getObjByUri(null, Obj.class); From 21a7fc600f1f0e1b4b3183dac403e66189ef5ebd Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 1 Jun 2015 07:20:42 +0200 Subject: [PATCH 0190/1191] introduce metadata object setters --- .../java/com/gooddata/md/AbstractObj.java | 32 +++++++++++++++++ src/main/java/com/gooddata/md/Meta.java | 35 +++++++++++++++++-- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index b0b6b9ffc..dcd2c20da 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -41,11 +41,19 @@ public String getSummary() { return meta.getSummary(); } + public void setSummary(String summary) { + meta.setSummary(summary); + } + @JsonIgnore public String getTitle() { return meta.getTitle(); } + public void setTitle(String title) { + meta.setTitle(title); + } + @JsonIgnore public DateTime getUpdated() { return meta.getUpdated(); @@ -56,11 +64,19 @@ public String getCategory() { return meta.getCategory(); } + public void setCategory(String category) { + meta.setCategory(category); + } + @JsonIgnore public String getTags() { return meta.getTags(); } + public void setTags(String tags) { + meta.setTags(tags); + } + @JsonIgnore public String getUri() { return meta.getUri(); @@ -71,21 +87,37 @@ public boolean isDeprecated() { return meta.isDeprecated(); } + public void setDeprecated(boolean deprecated) { + meta.setDeprecated(deprecated); + } + @JsonIgnore public String getIdentifier() { return meta.getIdentifier(); } + public void setIdentifier(String identifier) { + meta.setIdentifier(identifier); + } + @JsonIgnore public boolean isLocked() { return meta.isLocked(); } + public void setLocked(boolean locked) { + meta.setLocked(locked); + } + @JsonIgnore public boolean isUnlisted() { return meta.isUnlisted(); } + public void setUnlisted(boolean unlisted) { + meta.setUnlisted(unlisted); + } + /** * Get list of URIs of the given {@link Obj}s * @param objs metadata objects diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 937528bfe..7eb16d469 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -91,10 +91,18 @@ public String getSummary() { return summary; } + public void setSummary(String summary) { + this.summary = summary; + } + public String getTitle() { return title; } + public void setTitle(String title) { + this.title = title; + } + @JsonSerialize(using = GDDateTimeSerializer.class, include = Inclusion.NON_NULL) public DateTime getUpdated() { return updated; @@ -104,10 +112,18 @@ public String getCategory() { return category; } + public void setCategory(String category) { + this.category = category; + } + public String getTags() { return tags; } + public void setTags(String tags) { + this.tags = tags; + } + public String getUri() { return uri; } @@ -117,18 +133,33 @@ public boolean isDeprecated() { return deprecated; } + public void setDeprecated(boolean deprecated) { + this.deprecated = deprecated; + } + public String getIdentifier() { return identifier; } - @JsonSerialize(using = BooleanIntegerSerializer.class) + public void setIdentifier(String identifier) { + this.identifier = identifier; + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) public boolean isLocked() { return locked; } - @JsonSerialize(using = BooleanIntegerSerializer.class) + public void setLocked(boolean locked) { + this.locked = locked; + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) public boolean isUnlisted() { return unlisted; } + public void setUnlisted(boolean unlisted) { + this.unlisted = unlisted; + } } From 32c1beacc2486db1815d5cf5dd5b11c8f3905be6 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Tue, 2 Jun 2015 09:58:48 +0200 Subject: [PATCH 0191/1191] add metadata object identifiers to uri translation method --- .../java/com/gooddata/md/IdentifierToUri.java | 8 ++-- .../java/com/gooddata/md/MetadataService.java | 43 ++++++++++++++++--- src/test/java/com/gooddata/ShowcaseAT.java | 27 ++++++++++-- .../com/gooddata/md/MetadataServiceIT.java | 22 ++++++++++ 4 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index 6f9677bbf..1cdb6d92e 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -3,7 +3,7 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonProperty; -import java.util.List; +import java.util.Collection; import static com.gooddata.util.Validate.notNull; @@ -12,15 +12,15 @@ */ class IdentifierToUri { - private final List identifierToUri; + private final Collection identifierToUri; @JsonCreator - IdentifierToUri(@JsonProperty("identifierToUri") final List identifierToUri) { + IdentifierToUri(@JsonProperty("identifierToUri") final Collection identifierToUri) { notNull(identifierToUri, "identifierToUri"); this.identifierToUri = identifierToUri; } - public List getIdentifierToUri() { + public Collection getIdentifierToUri() { return identifierToUri; } diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index c7aedc123..c25f0e272 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -15,7 +15,10 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; @@ -327,12 +330,7 @@ public Collection findUris(Project project, Restriction... restrictions) ids.add(restriction.getValue()); } - final IdentifiersAndUris response; - try { - response = restTemplate.postForObject(IdentifiersAndUris.URI, new IdentifierToUri(ids), IdentifiersAndUris.class, project.getId()); - } catch (GoodDataRestException | RestClientException e) { - throw new GoodDataException("Unable to get URIs from identifiers.", e); - } + final IdentifiersAndUris response = getUrisForIdentifiers(project, ids); final List uris = new ArrayList<>(); for (IdentifierAndUri idAndUri : response.getIdentifiers()) { @@ -341,4 +339,37 @@ public Collection findUris(Project project, Restriction... restrictions) return uris; } + + /** + * Find metadata URIs for given identifiers. + * + * @param project project where to search for the metadata + * @param identifiers query restrictions + * @return the map of identifiers as keys and metadata URIs as values + * @throws com.gooddata.GoodDataException if unable to query metadata + * @see #findUris(Project, Restriction...) + */ + public Map identifiersToUris(Project project, Collection identifiers) { + notNull(project, "project" ); + noNullElements(identifiers, "identifiers"); + + final IdentifiersAndUris response = getUrisForIdentifiers(project, identifiers); + + final Map identifiersToUris = new HashMap<>(); + for (IdentifierAndUri idAndUri : response.getIdentifiers()) { + identifiersToUris.put(idAndUri.getIdentifier(), idAndUri.getUri()); + } + + return Collections.unmodifiableMap(identifiersToUris); + } + + private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Collection identifiers) { + final IdentifiersAndUris response; + try { + response = restTemplate.postForObject(IdentifiersAndUris.URI, new IdentifierToUri(identifiers), IdentifiersAndUris.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to get URIs from identifiers.", e); + } + return response; + } } diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 68ce2f464..d247b90ab 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -15,7 +15,11 @@ import com.gooddata.dataset.DatasetManifest; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; -import com.gooddata.md.*; +import com.gooddata.md.Attribute; +import com.gooddata.md.Entry; +import com.gooddata.md.Fact; +import com.gooddata.md.MetadataService; +import com.gooddata.md.Metric; import com.gooddata.md.ScheduledMail; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.Filter; @@ -50,13 +54,21 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static com.gooddata.ProcessIdMatcher.hasSameIdAs; import static com.gooddata.ProjectIdMatcher.hasSameIdAs; import static com.gooddata.WarehouseIdMatcher.hasSameIdAs; import static com.gooddata.md.Restriction.identifier; import static com.gooddata.project.ProjectEnvironment.TESTING; +import static com.gooddata.report.ReportExportFormat.PDF; +import static com.gooddata.report.ReportExportFormat.XLS; import static java.nio.file.Files.createTempDirectory; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; @@ -71,7 +83,6 @@ import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; import static org.testng.AssertJUnit.fail; -import static com.gooddata.report.ReportExportFormat.*; public class ShowcaseAT { @@ -307,6 +318,16 @@ public void removeScheduledMail() throws Exception { metadataService.removeObj(scheduledMail); } + @Test(groups = "md", dependsOnMethods = "createModel") + public void identifiersToUri() { + final MetadataService metadataService = gd.getMetadataService(); + final Map idsToUris = + metadataService.identifiersToUris(project, asList("attr.person.department")); + assertThat(idsToUris.entrySet(), hasSize(1)); + final Attribute attribute = metadataService.getObjByUri(idsToUris.get("attr.person.department"), Attribute.class); + assertThat(attribute.getIdentifier(), is("attr.person.department")); + } + @Test(groups = "datastore", dependsOnMethods = "login") public void datastoreUpload() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index db15840d1..5333421e7 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -14,8 +14,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import static com.gooddata.util.ResourceUtils.readFromResource; +import static java.util.Arrays.asList; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; @@ -85,6 +87,26 @@ public void testFindIdentifierUris() throws IOException { assertThat(uris.iterator().next(), is(OBJ_URI)); } + @Test + public void testIdentifiersToUris() throws IOException { + final IdentifierAndUri identifierAndUri = new IdentifierAndUri(ID, OBJ_URI); + + final List identifiersAndUris = new ArrayList<>(); + identifiersAndUris.add(identifierAndUri); + IdentifiersAndUris response = new IdentifiersAndUris(identifiersAndUris); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(IDENTIFIERS_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(response)); + + final Map uris = gd.getMetadataService().identifiersToUris(project, asList(ID)); + assertThat(uris.size(), is(1)); + assertThat(uris.get(ID), is(OBJ_URI)); + } + @Test public void shouldCreateObj() throws Exception { onRequest() From f452954664ca967fa4e628e9048e856f29bc0cb0 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 2 Jun 2015 11:00:20 +0200 Subject: [PATCH 0192/1191] add link to dimension into attribute --- src/main/java/com/gooddata/md/Attribute.java | 20 +++++++++++++++++-- .../java/com/gooddata/md/AttributeTest.java | 3 +++ src/test/resources/md/attribute.json | 3 ++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index 672a93f0e..3628af08a 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -37,7 +37,7 @@ private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Cont /* Just for serialization test */ Attribute(String title, Key primaryKey, Key foreignKey) { super(new Meta(title)); - content = new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList()); + content = new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null); } @JsonIgnore @@ -60,19 +60,30 @@ public DisplayForm getDefaultDisplayForm() { return getDisplayForms().iterator().next(); } + @JsonIgnore + public String getDimensionLink() { + return content.getDimensionLink(); + } + + public boolean hasDimension() { + return getDimensionLink() != null; + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content { private final Collection pk; private final Collection fk; private final Collection displayForms; + private final String dimension; @JsonCreator public Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, - @JsonProperty("displayForms") Collection displayForms) { + @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension) { this.pk = pk; this.fk = fk; this.displayForms = displayForms; + this.dimension = dimension; } public Collection getPk() { @@ -86,6 +97,11 @@ public Collection getFk() { public Collection getDisplayForms() { return displayForms; } + + @JsonProperty("dimension") + public String getDimensionLink() { + return dimension; + } } } diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 16fa22e38..5fc266114 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -50,6 +50,9 @@ public void shouldDeserialize() throws Exception { assertThat(foreignKeys, is(Matchers.notNullValue())); assertThat(foreignKeys, hasSize(1)); assertThat(foreignKeys.iterator().next(), is(Matchers.notNullValue())); + + assertThat(attribute.hasDimension(), is(true)); + assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); } @Test diff --git a/src/test/resources/md/attribute.json b/src/test/resources/md/attribute.json index b7ce28041..d1be57d6e 100644 --- a/src/test/resources/md/attribute.json +++ b/src/test/resources/md/attribute.json @@ -37,7 +37,8 @@ "data" : "/gdc/md/PROJECT_ID/obj/FK_ID", "type" : "col" } - ] + ], + "dimension": "/gdc/md/PROJECT_ID/obj/DIM_ID" }, "meta" : { "author" : "/gdc/account/profile/USER_ID", From 56a486bbef107ea60e1ace5a796b3a2d58ac8eb0 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 27 May 2015 14:19:07 +0200 Subject: [PATCH 0193/1191] add batch support for metadata usedBy resource --- .../md/{InUse.java => InUseMany.java} | 35 ++++++------ .../java/com/gooddata/md/MetadataService.java | 31 +++++++++-- src/main/java/com/gooddata/md/Usage.java | 31 +++++++++++ src/main/java/com/gooddata/md/UseMany.java | 29 ++++++++++ ...{InUseEntries.java => UseManyEntries.java} | 16 +++--- src/test/java/com/gooddata/ShowcaseAT.java | 41 +++++++++++++- .../com/gooddata/md/MetadataServiceIT.java | 53 +++++++++++++++---- 7 files changed, 200 insertions(+), 36 deletions(-) rename src/main/java/com/gooddata/md/{InUse.java => InUseMany.java} (73%) create mode 100644 src/main/java/com/gooddata/md/Usage.java create mode 100644 src/main/java/com/gooddata/md/UseMany.java rename src/main/java/com/gooddata/md/{InUseEntries.java => UseManyEntries.java} (67%) diff --git a/src/main/java/com/gooddata/md/InUse.java b/src/main/java/com/gooddata/md/InUseMany.java similarity index 73% rename from src/main/java/com/gooddata/md/InUse.java rename to src/main/java/com/gooddata/md/InUseMany.java index fedcb9e2f..2f00ffb8b 100644 --- a/src/main/java/com/gooddata/md/InUse.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -10,6 +10,7 @@ import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -19,35 +20,35 @@ import static java.beans.Introspector.decapitalize; /** - * UsedBy/Using result + * UsedBy/Using batch request */ -@JsonTypeName("inUse") +@JsonTypeName("inUseMany") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -class InUse { +class InUseMany { public static final String USEDBY_URI = "/gdc/md/{projectId}/usedby2"; - private final String uri; + private final Collection uris; private final Set types; private final boolean nearest; @JsonCreator - InUse(@JsonProperty("uri") String uri, + InUseMany(@JsonProperty("uris") Collection uris, @JsonProperty("nearest") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean nearest, @JsonProperty("types") Set types) { - this.uri = notEmpty(uri, "uri"); - this.types = types; - this.nearest = nearest; + this.uris = notEmpty(uris, "uris"); + this.types = types; + this.nearest = nearest; } @SafeVarargs - public InUse(String uri, boolean nearest, Class... type) { - this.uri = notNull(uri, "uri"); + public InUseMany(Collection uris, boolean nearest, Class... type) { + this.uris = notNull(uris, "uris"); noNullElements(type, "type"); this.types = new HashSet<>(); for (Class t: type) { @@ -61,25 +62,25 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; - InUse inUse = (InUse) o; + InUseMany inUseMany = (InUseMany) o; - if (nearest != inUse.nearest) return false; - if (!types.equals(inUse.types)) return false; - if (!uri.equals(inUse.uri)) return false; + if (nearest != inUseMany.nearest) return false; + if (!types.equals(inUseMany.types)) return false; + if (!uris.equals(inUseMany.uris)) return false; return true; } @Override public int hashCode() { - int result = uri.hashCode(); + int result = uris.hashCode(); result = 31 * result + types.hashCode(); result = 31 * result + (nearest ? 1 : 0); return result; } - public String getUri() { - return uri; + public Collection getUris() { + return uris; } public Set getTypes() { diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index dc67251a7..2325c5ce8 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -22,6 +22,7 @@ import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; +import static java.util.Arrays.asList; /** * Query, create and update project metadata - attributes, facts, metrics, reports,... @@ -315,18 +316,42 @@ public Collection usedBy(Project project, Obj obj, boolean nearest, Class * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', * 'table'...) * @return objects using given objects. + * @see #usedBy(Project, Collection, boolean, Class[]) */ public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { notNull(uri, "uri"); notNull(project, "project"); - final InUseEntries response; + final Collection usages = usedBy(project, asList(uri), nearest, types); + return usages.size() > 0 ? usages.iterator().next().getUsedBy() : Collections.emptyList(); + } + + /** + * Find all objects which use the given objects. Batch alternative to {@link #usedBy(Project, String, boolean, Class[])} + * @param project project + * @param uris URIs of object to find using objects for + * @param nearest find nearest objects only + * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', + * 'table'...), returns all objects if no type is provided + * @return objects usages + * @see #usedBy(Project, String, boolean, Class[]) + */ + public Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { + notNull(uris, "uris"); + notNull(project, "project"); + + final UseMany response; try { - response = restTemplate.postForObject(InUse.USEDBY_URI, new InUse(uri, nearest, types), InUseEntries.class, project.getId()); + response = restTemplate.postForObject(InUseMany.USEDBY_URI, new InUseMany(uris, nearest, types), UseMany.class, project.getId()); } catch (GoodDataRestException | RestClientException e) { throw new GoodDataException("Unable to find objects.", e); } - return response.getEntries(); + final List usages = new ArrayList<>(uris.size()); + final Collection useManyEntries = response.getUseMany(); + for (UseManyEntries useMany : useManyEntries) { + usages.add(new Usage(useMany.getUri(), useMany.getEntries())); + } + return usages; } /** diff --git a/src/main/java/com/gooddata/md/Usage.java b/src/main/java/com/gooddata/md/Usage.java new file mode 100644 index 000000000..422e6ebed --- /dev/null +++ b/src/main/java/com/gooddata/md/Usage.java @@ -0,0 +1,31 @@ +package com.gooddata.md; + +import java.util.Collection; + +/** + * Describes object usages. Object is represented by its URI and objects using it by collection of entries. + */ +public class Usage { + + private final String uri; + + private final Collection usedBy; + + /** + * Constructs object. + * @param uri object URI + * @param usedBy using objects + */ + Usage(final String uri, final Collection usedBy) { + this.uri = uri; + this.usedBy = usedBy; + } + + public String getUri() { + return uri; + } + + public Collection getUsedBy() { + return usedBy; + } +} diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java new file mode 100644 index 000000000..5842bd3a7 --- /dev/null +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -0,0 +1,29 @@ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; + +import static com.gooddata.util.Validate.notNull; + +/** + * UsedBy/Using batch result + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class UseMany { + + private final Collection useMany; + + @JsonCreator + UseMany(@JsonProperty("useMany") final Collection useMany) { + this.useMany = notNull(useMany, "useMany"); + } + + public Collection getUseMany() { + return useMany; + } +} diff --git a/src/main/java/com/gooddata/md/InUseEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java similarity index 67% rename from src/main/java/com/gooddata/md/InUseEntries.java rename to src/main/java/com/gooddata/md/UseManyEntries.java index cc0daa830..358bf2873 100644 --- a/src/main/java/com/gooddata/md/InUseEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -7,22 +7,26 @@ import java.util.Collection; -/** - * UsedBy/Using result - */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -class InUseEntries { +class UseManyEntries { + + private final String uri; private final Collection entries; @JsonCreator - InUseEntries(@JsonProperty("entries") Collection entries) { + UseManyEntries(@JsonProperty("uri") final String uri, + @JsonProperty("entries") final Collection entries) { + this.uri = uri; this.entries = entries; } + public String getUri() { + return uri; + } + public Collection getEntries() { return entries; } - } diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 4479ed81d..99e334f74 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -21,6 +21,7 @@ import com.gooddata.md.MetadataService; import com.gooddata.md.Metric; import com.gooddata.md.ScheduledMail; +import com.gooddata.md.Usage; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.Filter; import com.gooddata.md.report.GridElement; @@ -57,6 +58,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -82,6 +84,7 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.testng.AssertJUnit.assertTrue; import static org.testng.AssertJUnit.fail; public class ShowcaseAT { @@ -256,6 +259,42 @@ public void createModel() throws Exception { modelService.updateProjectModel(project, projectModelDiff).get(); } + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedBy() { + final MetadataService metadataService = gd.getMetadataService(); + final String uri = metadataService.findUris(project, identifier("attr.person.department")).iterator().next(); + + final Collection usage = metadataService.usedBy(project, uri, false); + assertThat(usage, hasSize(5)); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedByNotExists() { + final MetadataService metadataService = gd.getMetadataService(); + + assertThat(metadataService.usedBy(project, "/gdc/md/" + project.getId() + "/obj/1234567", false), empty()); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedByBatch() { + final MetadataService metadataService = gd.getMetadataService(); + final Map uris = + metadataService.identifiersToUris(project, asList("attr.person.department", "attr.person.role")); + + final Collection usages = metadataService.usedBy(project, uris.values(), false); + assertThat(usages, hasSize(2)); + + final Iterator usageIterator = usages.iterator(); + + final Usage usage1 = usageIterator.next(); + assertTrue(uris.containsValue(usage1.getUri())); + assertThat(usage1.getUsedBy(), hasSize(2)); + + final Usage usage2 = usageIterator.next(); + assertTrue(uris.containsValue(usage2.getUri())); + assertThat(usage2.getUsedBy(), hasSize(5)); + } + @Test(groups = "md", dependsOnGroups = "model") public void getObjs() throws Exception { final MetadataService md = gd.getMetadataService(); @@ -397,7 +436,7 @@ public void exportReportDefinition() throws Exception { reportService.exportReport(reportDefinition, ReportExportFormat.CSV, System.out); } - @Test(dependsOnGroups = "report") + @Test(dependsOnGroups = "report", dependsOnMethods = {"usedBy", "usedByBatch"}) public void removeReport() throws Exception { final MetadataService metadataService = gd.getMetadataService(); metadataService.removeObj(report); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index a8486867f..b3717362c 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -13,6 +13,8 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; @@ -31,9 +33,11 @@ public class MetadataServiceIT extends AbstractGoodDataIT { private static final String USEDBY_URI = "/gdc/md/PROJECT_ID/usedby2"; private static final String IDENTIFIERS_URI = "/gdc/md/PROJECT_ID/identifiers"; private static final String OBJ_URI = "/gdc/md/PROJECT_ID/obj"; + private static final String OBJ_URI2 = "/gdc/md/PROJECT_ID/obj2"; private static final String SPECIFIC_OBJ_URI = "/gdc/md/PROJECT_ID/obj/ID"; private static final String ID = "ID"; private static final String TITLE = "TITLE"; + private static final String TITLE2 = "TITLE2"; private Project project; private Metric metricInput; @@ -48,25 +52,56 @@ public void setUp() throws Exception { @Test public void testUsedBy() throws Exception { - final List entryList = new ArrayList<>(); - final Entry entry = new Entry(null, TITLE, null, null, null, null, false, null, null, null, null, false, false); - entryList.add(entry); - final InUseEntries entries = new InUseEntries(entryList); + final List entryList = new ArrayList<>(); + final Entry entry1 = new Entry(null, TITLE, null, null, null, null, false, null, null, null, null, false, false); + entryList.add(new UseManyEntries(OBJ_URI, asList(entry1))); + final UseMany useMany = new UseMany(entryList); onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(USEDBY_URI) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(entries)); + .withBody(MAPPER.writeValueAsString(useMany)); final Collection result = gd.getMetadataService().usedBy(project, OBJ_URI, false, ReportDefinition.class); - assertThat(result, is(notNullValue())); - assertThat(result.size(), is(1)); + assertThat(result, hasSize(1)); assertThat(result.iterator().next().getTitle(), is(TITLE)); } + @Test + public void testUsedByBatch() throws Exception { + final List entryList = new ArrayList<>(); + final Entry entry1 = new Entry(null, TITLE, null, null, null, null, false, null, null, null, null, false, false); + final Entry entry2 = new Entry(null, TITLE2, null, null, null, null, false, null, null, null, null, false, false); + entryList.add(new UseManyEntries(OBJ_URI, asList(entry1))); + entryList.add(new UseManyEntries(OBJ_URI2, asList(entry1, entry2))); + final UseMany useMany = new UseMany(entryList); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(USEDBY_URI) + .respond() + .withStatus(200) + .withBody(MAPPER.writeValueAsString(useMany)); + + final Collection result = gd.getMetadataService().usedBy(project, new HashSet<>(asList(OBJ_URI, OBJ_URI2)), false, ReportDefinition.class); + + assertThat(result, hasSize(2)); + final Iterator usages = result.iterator(); + + final Usage usage1 = usages.next(); + assertThat(usage1.getUri(), is(OBJ_URI)); + assertThat(usage1.getUsedBy().iterator().next().getTitle(), is(TITLE)); + + final Usage usage2 = usages.next(); + assertThat(usage2.getUri(), is(OBJ_URI2)); + final Iterator obj2Entries = usage2.getUsedBy().iterator(); + assertThat(obj2Entries.next().getTitle(), is(TITLE)); + assertThat(obj2Entries.next().getTitle(), is(TITLE2)); + } + @Test public void testFindIdentifierUris() throws IOException { final IdentifierAndUri identifierAndUri = new IdentifierAndUri(ID, OBJ_URI); @@ -83,7 +118,7 @@ public void testFindIdentifierUris() throws IOException { .withBody(MAPPER.writeValueAsString(response)); final Collection uris = gd.getMetadataService().findUris(project, Restriction.identifier(ID)); - assertThat(uris.size(), is(1)); + assertThat(uris, hasSize(1)); assertThat(uris.iterator().next(), is(OBJ_URI)); } @@ -103,7 +138,7 @@ public void testIdentifiersToUris() throws IOException { .withBody(MAPPER.writeValueAsString(response)); final Map uris = gd.getMetadataService().identifiersToUris(project, asList(ID)); - assertThat(uris.size(), is(1)); + assertThat(uris.keySet(), hasSize(1)); assertThat(uris.get(ID), is(OBJ_URI)); } From 62f06d4ac4b92bdffe6a56675cc0fde727fd53c2 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 3 Jun 2015 17:34:30 +0200 Subject: [PATCH 0194/1191] fix future result incompatibility --- src/main/java/com/gooddata/FutureResult.java | 12 +++++++++--- src/main/java/com/gooddata/PollResult.java | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index a64e966c0..b5458e810 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -16,7 +16,7 @@ public interface FutureResult { * @return true if so * @throws GoodDataException when polling fails or the thread was interrupted */ - public boolean isDone(); + boolean isDone(); /** * Wait for the result to be available and return it's value @@ -24,7 +24,7 @@ public interface FutureResult { * @return result value * @throws GoodDataException when polling fails or the thread was interrupted */ - public T get(); + T get(); /** * Wait for the result to be available up to given time and return it's value @@ -34,6 +34,12 @@ public interface FutureResult { * @return result value * @throws GoodDataException when polling fails, the timeout expires or the thread was interrupted */ - public T get(final long timeout, final TimeUnit unit); + T get(final long timeout, final TimeUnit unit); + /** + * Get URI used for polling + * + * @return URI string + */ + String getPollingUri(); } diff --git a/src/main/java/com/gooddata/PollResult.java b/src/main/java/com/gooddata/PollResult.java index 66ed382f6..9781a9aa4 100644 --- a/src/main/java/com/gooddata/PollResult.java +++ b/src/main/java/com/gooddata/PollResult.java @@ -51,6 +51,7 @@ public T get(final long timeout, final TimeUnit unit) { * * @return URI string */ + @Override public String getPollingUri() { return handler.getPollingUri(); } From bb6b4448243d1073a508fc7b238cbd35e5f1fdbb Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 2 Jun 2015 14:15:56 +0200 Subject: [PATCH 0195/1191] introduce dimension metadata --- src/main/java/com/gooddata/md/Attribute.java | 86 +---------- src/main/java/com/gooddata/md/Dimension.java | 60 ++++++++ .../java/com/gooddata/md/NestedAttribute.java | 101 +++++++++++++ .../java/com/gooddata/md/AttributeTest.java | 3 + .../java/com/gooddata/md/DimensionTest.java | 37 +++++ .../com/gooddata/md/NestedAttributeTest.java | 55 +++++++ src/test/resources/md/dimension-input.json | 13 ++ src/test/resources/md/dimension.json | 139 ++++++++++++++++++ src/test/resources/md/dimensionAttribute.json | 59 ++++++++ 9 files changed, 474 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/gooddata/md/Dimension.java create mode 100644 src/main/java/com/gooddata/md/NestedAttribute.java create mode 100644 src/test/java/com/gooddata/md/DimensionTest.java create mode 100644 src/test/java/com/gooddata/md/NestedAttributeTest.java create mode 100644 src/test/resources/md/dimension-input.json create mode 100644 src/test/resources/md/dimension.json create mode 100644 src/test/resources/md/dimensionAttribute.json diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index 3628af08a..de8795569 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -1,21 +1,19 @@ /* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. */ package com.gooddata.md; +import static java.util.Arrays.asList; + import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; -import java.util.Collection; import java.util.Collections; -import static java.util.Arrays.asList; - /** * Attribute of GoodData project dataset */ @@ -23,85 +21,15 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) -public class Attribute extends AbstractObj implements Queryable, Updatable { - - @JsonProperty("content") - private final Content content; +public class Attribute extends NestedAttribute implements Queryable, Updatable { @JsonCreator - private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { - super(meta); - this.content = content; + private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") NestedAttribute.Content content) { + super(meta, content); } /* Just for serialization test */ Attribute(String title, Key primaryKey, Key foreignKey) { - super(new Meta(title)); - content = new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null); - } - - @JsonIgnore - public Collection getDisplayForms() { - return content.getDisplayForms(); - } - - @JsonIgnore - public Collection getPrimaryKeys() { - return content.getPk(); - } - - @JsonIgnore - public Collection getForeignKeys() { - return content.getFk(); - } - - @JsonIgnore - public DisplayForm getDefaultDisplayForm() { - return getDisplayForms().iterator().next(); + this(new Meta(title), new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null)); } - - @JsonIgnore - public String getDimensionLink() { - return content.getDimensionLink(); - } - - public boolean hasDimension() { - return getDimensionLink() != null; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) - private static class Content { - private final Collection pk; - private final Collection fk; - private final Collection displayForms; - private final String dimension; - - @JsonCreator - public Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, - @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension) { - this.pk = pk; - this.fk = fk; - this.displayForms = displayForms; - this.dimension = dimension; - } - - public Collection getPk() { - return pk; - } - - public Collection getFk() { - return fk; - } - - public Collection getDisplayForms() { - return displayForms; - } - - @JsonProperty("dimension") - public String getDimensionLink() { - return dimension; - } - } - } diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java new file mode 100644 index 000000000..7b7fb4d2f --- /dev/null +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; +import java.util.Collections; + +/** + * Represents metadata dimension. + */ +@JsonTypeName("dimension") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Dimension extends AbstractObj implements Queryable, Updatable { + + @JsonProperty("content") + private final Content content; + + @JsonCreator + private Dimension(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + /* for serialization test */ + Dimension(String title) { + this(new Meta(title), new Content(Collections.emptyList())); + } + + @JsonIgnore + public Collection getAttributes() { + return content.getAttributes(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Content { + + @JsonProperty("attributes") + private final Collection attributes; + + @JsonCreator + public Content(@JsonProperty("attributes") Collection attributes) { + this.attributes = attributes; + } + + public Collection getAttributes() { + return attributes; + } + } +} diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java new file mode 100644 index 000000000..dad33f767 --- /dev/null +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collection; +import java.util.Collections; + +import static java.util.Arrays.asList; + +/** + * Attribute representation which is nested in some other metadata object (i.e. within {@link Dimension}). + * Can't be queried, get or updated directly - use {@link Attribute} for these operations. + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class NestedAttribute extends AbstractObj { + + @JsonProperty("content") + private final Content content; + + @JsonCreator + protected NestedAttribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + @JsonIgnore + public Collection getDisplayForms() { + return content.getDisplayForms(); + } + + @JsonIgnore + public Collection getPrimaryKeys() { + return content.getPk(); + } + + @JsonIgnore + public Collection getForeignKeys() { + return content.getFk(); + } + + @JsonIgnore + public DisplayForm getDefaultDisplayForm() { + return getDisplayForms().iterator().next(); + } + + @JsonIgnore + public String getDimensionLink() { + return content.getDimensionLink(); + } + + public boolean hasDimension() { + return getDimensionLink() != null; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + protected static class Content { + private final Collection pk; + private final Collection fk; + private final Collection displayForms; + private final String dimension; + + @JsonCreator + public Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, + @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension) { + this.pk = pk; + this.fk = fk; + this.displayForms = displayForms; + this.dimension = dimension; + } + + public Collection getPk() { + return pk; + } + + public Collection getFk() { + return fk; + } + + public Collection getDisplayForms() { + return displayForms; + } + + @JsonProperty("dimension") + public String getDimensionLink() { + return dimension; + } + } + +} diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 5fc266114..46f5df818 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -1,3 +1,6 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import org.codehaus.jackson.map.ObjectMapper; diff --git a/src/test/java/com/gooddata/md/DimensionTest.java b/src/test/java/com/gooddata/md/DimensionTest.java new file mode 100644 index 000000000..44a7a8262 --- /dev/null +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collection; + +public class DimensionTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/dimension.json"); + final Dimension dimension = new ObjectMapper().readValue(stream, Dimension.class); + assertThat(dimension, is(notNullValue())); + + final Collection attributes = dimension.getAttributes(); + assertThat(attributes, is(notNullValue())); + assertThat(attributes, hasSize(2)); + } + + @Test + public void shouldSerialize() throws Exception { + final Dimension dimension = new Dimension("Dimension"); + assertThat(dimension, serializesToJson("/md/dimension-input.json")); + + } +} \ 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 new file mode 100644 index 000000000..dc6ab75ee --- /dev/null +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.hamcrest.Matchers; +import org.testng.annotations.Test; + +import java.util.Collection; + +public class NestedAttributeTest { + + @Test + public void testDeserialization() throws Exception { + final NestedAttribute attribute = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/dimensionAttribute.json"), NestedAttribute.class); + assertThat(attribute, is(notNullValue())); + + final Collection displayForms = attribute.getDisplayForms(); + assertThat(displayForms, is(notNullValue())); + assertThat(displayForms, hasSize(1)); + + final DisplayForm displayForm = displayForms.iterator().next(); + assertThat(displayForm, is(notNullValue())); + + assertThat(displayForm.getFormOf(), is("/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID")); + assertThat(displayForm.getExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]")); + assertThat(displayForm.getLdmExpression(), isEmptyString()); + + final DisplayForm defaultDisplayForm = attribute.getDefaultDisplayForm(); + assertThat(defaultDisplayForm, is(notNullValue())); + + assertThat(defaultDisplayForm.getFormOf(), is("/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID")); + assertThat(defaultDisplayForm.getExpression(), is("[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]")); + assertThat(defaultDisplayForm.getLdmExpression(), isEmptyString()); + + final Collection primaryKeys = attribute.getPrimaryKeys(); + assertThat(primaryKeys, is(Matchers.notNullValue())); + assertThat(primaryKeys, hasSize(1)); + assertThat(primaryKeys.iterator().next(), is(Matchers.notNullValue())); + + final Collection foreignKeys = attribute.getForeignKeys(); + assertThat(foreignKeys, is(Matchers.notNullValue())); + assertThat(foreignKeys, hasSize(1)); + assertThat(foreignKeys.iterator().next(), is(Matchers.notNullValue())); + + assertThat(attribute.hasDimension(), is(true)); + assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); + } +} \ No newline at end of file diff --git a/src/test/resources/md/dimension-input.json b/src/test/resources/md/dimension-input.json new file mode 100644 index 000000000..991562641 --- /dev/null +++ b/src/test/resources/md/dimension-input.json @@ -0,0 +1,13 @@ +{ + "dimension" : { + "content" : { + "attributes" : [] + }, + "meta" : { + "title" : "Dimension", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/dimension.json b/src/test/resources/md/dimension.json new file mode 100644 index 000000000..a34435812 --- /dev/null +++ b/src/test/resources/md/dimension.json @@ -0,0 +1,139 @@ +{ + "dimension" : { + "content" : { + "attributes" : [ + { + "content" : { + "direction" : "asc", + "sort" : "pk", + "pk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/4", + "type" : "col" + } + ], + "dimension" : "/gdc/md/PROJECT_ID/obj/2", + "type" : "GDC.time.date", + "displayForms" : [ + { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/28", + "expression" : "[/gdc/md/PROJECT_ID/obj/24]", + "type" : "GDC.time.day_us", + "ldmexpression" : "" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/31/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/31", + "tags" : "", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.date.mmddyyyy", + "deprecated" : "0", + "summary" : "DisplayForm mm/dd/yyyy.", + "title" : "mm/dd/yyyy (Ticket Created)", + "category" : "attributeDisplayForm", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + ], + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/1177", + "type" : "col" + } + ] + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/28", + "tags" : "date", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.date", + "deprecated" : "0", + "summary" : "Date ticket created", + "title" : "Date (Ticket Created)", + "category" : "attribute", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + }, + { + "content" : { + "pk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/36", + "type" : "col" + } + ], + "displayForms" : [ + { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/40", + "expression" : "[/gdc/md/PROJECT_ID/obj/39]", + "ldmexpression" : "" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/43/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/43", + "tags" : "", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.abY81lMifn6q", + "deprecated" : "0", + "summary" : "DisplayForm Long (Monday).", + "title" : "Long (Monday) (Ticket Created)", + "category" : "attributeDisplayForm", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + ], + "direction" : "asc", + "drillDownStepAttributeDF" : "/gdc/md/PROJECT_ID/obj/31", + "sort" : "pk", + "dimension" : "/gdc/md/PROJECT_ID/obj/2", + "type" : "GDC.time.day_in_euweek", + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/8", + "type" : "col" + } + ] + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/40", + "tags" : "date day eu week", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.day.in.euweek", + "deprecated" : "0", + "summary" : "Generic Day based on EU Week (Mon-Sun)", + "title" : "Day of Week (Mon-Sun) (Ticket Created)", + "category" : "attribute", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + ] + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/2", + "tags" : "", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.dim_date", + "deprecated" : "0", + "summary" : "", + "title" : "Date (Ticket Created)", + "category" : "dimension", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/dimensionAttribute.json b/src/test/resources/md/dimensionAttribute.json new file mode 100644 index 000000000..9dc03e7b0 --- /dev/null +++ b/src/test/resources/md/dimensionAttribute.json @@ -0,0 +1,59 @@ +{ + "content" : { + "direction" : "asc", + "sort" : "pk", + "pk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/4", + "type" : "col" + } + ], + "dimension" : "/gdc/md/PROJECT_ID/obj/DIM_ID", + "type" : "GDC.time.date", + "displayForms" : [ + { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "type" : "GDC.time.day_us", + "ldmexpression" : "" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/31/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/31", + "tags" : "", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.date.mmddyyyy", + "deprecated" : "0", + "summary" : "DisplayForm mm/dd/yyyy.", + "title" : "mm/dd/yyyy (Ticket Created)", + "category" : "attributeDisplayForm", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + ], + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/1177", + "type" : "col" + } + ] + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/28", + "tags" : "date", + "created" : "2015-05-19 11:54:05", + "identifier" : "created.date", + "deprecated" : "0", + "summary" : "Date ticket created", + "title" : "Date (Ticket Created)", + "category" : "attribute", + "updated" : "2015-05-19 11:54:05", + "contributor" : "/gdc/account/profile/USER_ID" + } +} \ No newline at end of file From b70fb17e6b9cc5731982672e774075588369e838 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 4 Jun 2015 19:23:43 +0200 Subject: [PATCH 0196/1191] metadata AbstractObj no longer implements Obj AbstractObj is useful ancestor keeping most of metadata objects, including those which can't be considered as first class citizens (they are nested into another object and it is not possible to manipulate them directly) --- src/main/java/com/gooddata/md/AbstractObj.java | 2 +- src/main/java/com/gooddata/md/Obj.java | 2 +- src/main/java/com/gooddata/md/ObjNotFoundException.java | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index dcd2c20da..01bc4a12a 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -12,7 +12,7 @@ /** * Metadata object (common part) */ -public abstract class AbstractObj implements Obj { +public abstract class AbstractObj { @JsonProperty("meta") protected final Meta meta; diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 73f6fa4a4..ac9f098d4 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -3,7 +3,7 @@ import org.springframework.web.util.UriTemplate; /** - * Metadata object + * First class metadata object - only dto objects, which have URI pointing to themselves should implement this. */ public interface Obj { diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index 62f52405c..7bf4d475d 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -12,7 +12,7 @@ public class ObjNotFoundException extends GoodDataException { * * @param uri the URI of metadata object you're searching for * @param cls class of metadata object you're searching for - * @param e caused by this exception + * @param e caused of this exception * @param the type of results you're searching for */ public ObjNotFoundException(String uri, Class cls, Exception e) { @@ -23,7 +23,6 @@ public ObjNotFoundException(String uri, Class cls, Exception * Construct a new instance of ObjNotFoundException. * * @param obj metadata object you're working with - * @param the type of results you're searching for */ public ObjNotFoundException(Obj obj) { super(obj.getClass().getSimpleName() + " not found " + obj.getUri()); @@ -44,7 +43,7 @@ public ObjNotFoundException(String uri) { * @param cls class of metadata object you're searching for * @param the type of results you're searching for */ - public ObjNotFoundException(Class cls) { + public ObjNotFoundException(Class cls) { super(cls.getSimpleName() + " not found"); } } From 0d65c597c31b1bbf8a2f67b3ca431245f34e015a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 3 Jun 2015 15:28:01 +0200 Subject: [PATCH 0197/1191] add "type" and fix "default" field at display form Removing the DisplayForm.isDefault() method because nested display form has no such field (it was returning false allways). The isDefault() now exists only for AttributeDisplayForm. Adding type optional field to both DisplayForm and AttributeDisplayForm to prevent deleting that type accidentally, when updating. --- .../com/gooddata/md/AttributeDisplayForm.java | 38 ++++++++++++++++++- .../java/com/gooddata/md/DisplayForm.java | 29 +++++++------- .../gooddata/md/AttributeDisplayFormTest.java | 7 +++- .../java/com/gooddata/md/DisplayFormTest.java | 6 +-- .../md/attributeDisplayForm-input.json | 3 +- .../resources/md/attributeDisplayForm.json | 3 +- src/test/resources/md/displayForm-input.json | 1 - src/test/resources/md/displayForm.json | 1 - 8 files changed, 61 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index faea0a86f..cfdafe54c 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,10 +1,14 @@ package com.gooddata.md; +import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanStringSerializer; import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; /** @@ -16,13 +20,43 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class AttributeDisplayForm extends DisplayForm implements Updatable { + @JsonProperty("content") + protected final Content content; + @JsonCreator private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { super(meta, content); + this.content = content; } /* Just for serialization test */ - AttributeDisplayForm(String title, String formOf, String expression, boolean isDefault, String ldmExpression) { - super(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression)); + AttributeDisplayForm(String title, String formOf, String expression, boolean isDefault, String ldmExpression, String type) { + this(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression, type)); + } + + @JsonIgnore + public boolean isDefault() { + return content.isDefault(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + private static class Content extends DisplayForm.Content { + + private final boolean isDefault; + + private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, + @JsonProperty("default") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean isDefault, + @JsonProperty("ldmexpression") String ldmExpression, + @JsonProperty("type") String type) { + super(formOf, expression, ldmExpression, type); + this.isDefault = isDefault; + } + + @JsonProperty("default") + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean isDefault() { + return isDefault; + } } } diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 19abee5ba..df55bf909 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -20,7 +20,7 @@ public class DisplayForm extends AbstractObj { @JsonProperty("content") - private final Content content; + protected final Content content; @JsonCreator protected DisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { @@ -39,13 +39,13 @@ public String getExpression() { } @JsonIgnore - public boolean isDefault() { - return content.isDefault(); + public String getLdmExpression() { + return content.getLdmExpression(); } @JsonIgnore - public String getLdmExpression() { - return content.getLdmExpression(); + public String getType() { + return content.getType(); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -54,17 +54,16 @@ protected static class Content { private final String formOf; private final String expression; - private final boolean isDefault; private final String ldmExpression; + private final String type; @JsonCreator public Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean isDefault, - @JsonProperty("ldmexpression") String ldmExpression) { + @JsonProperty("ldmexpression") String ldmExpression, @JsonProperty("type") String type) { this.formOf = formOf; this.expression = expression; - this.isDefault = isDefault; this.ldmExpression = ldmExpression; + this.type = type; } public String getFormOf() { @@ -75,16 +74,14 @@ public String getExpression() { return expression; } - @JsonProperty("default") - @JsonSerialize(using = BooleanIntegerSerializer.class) - public boolean isDefault() { - return isDefault; - } - - @JsonProperty("ldmexpression") + @JsonProperty("ldmexpression") public String getLdmExpression() { return ldmExpression; } + + public String getType() { + return type; + } } } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 6f0ab6b82..e481d97f4 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -15,7 +15,9 @@ 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 TYPE = "TYPE"; @Test public void shouldDeserialize() throws Exception { @@ -25,14 +27,15 @@ public void shouldDeserialize() throws Exception { assertThat(attrDF.getFormOf(), is(FORM_OF)); assertThat(attrDF.getExpression(), is(EXPRESSION)); - assertThat(attrDF.isDefault(), is(DEFAULT)); + assertThat(attrDF.isDefault(), is(DEFAULT_TRUE)); assertThat(attrDF.getLdmExpression(), is(LDM_EXPRESSION)); + assertThat(attrDF.getType(), is(TYPE)); } @Test public void testSerialization() throws Exception { final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, - LDM_EXPRESSION); + LDM_EXPRESSION, TYPE); assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-input.json")); } diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index f15a0fa62..0a5de5473 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -11,13 +11,13 @@ import static com.gooddata.JsonMatchers.serializesToJson; 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 DisplayFormTest { 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 String LDM_EXPRESSION = ""; @Test @@ -28,14 +28,14 @@ public void shouldDeserialize() throws Exception { assertThat(displayForm.getFormOf(), is(FORM_OF)); assertThat(displayForm.getExpression(), is(EXPRESSION)); - assertThat(displayForm.isDefault(), is(DEFAULT)); assertThat(displayForm.getLdmExpression(), is(LDM_EXPRESSION)); + assertThat(displayForm.getType(), is(nullValue())); } @Test public void testSerialization() throws Exception { final DisplayForm displayForm = new DisplayForm(new Meta("Person Name"), - new DisplayForm.Content(FORM_OF, EXPRESSION, DEFAULT, LDM_EXPRESSION)); + new DisplayForm.Content(FORM_OF, EXPRESSION, LDM_EXPRESSION, null)); assertThat(displayForm, serializesToJson("/md/displayForm-input.json")); } diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json index 71f448dae..bb44d6b12 100644 --- a/src/test/resources/md/attributeDisplayForm-input.json +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -3,7 +3,8 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : 0, + "default" : "0", + "type" : "TYPE", "ldmexpression" : "" }, "meta" : { diff --git a/src/test/resources/md/attributeDisplayForm.json b/src/test/resources/md/attributeDisplayForm.json index 171b94f20..b42ecc225 100644 --- a/src/test/resources/md/attributeDisplayForm.json +++ b/src/test/resources/md/attributeDisplayForm.json @@ -3,7 +3,8 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : 0, + "default" : "1", + "type": "TYPE", "ldmexpression" : "" }, "links" : { diff --git a/src/test/resources/md/displayForm-input.json b/src/test/resources/md/displayForm-input.json index 76bccda76..f6bcfcebf 100644 --- a/src/test/resources/md/displayForm-input.json +++ b/src/test/resources/md/displayForm-input.json @@ -2,7 +2,6 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : 0, "ldmexpression" : "" }, "meta" : { diff --git a/src/test/resources/md/displayForm.json b/src/test/resources/md/displayForm.json index e54d4eedd..4b2c4dca5 100644 --- a/src/test/resources/md/displayForm.json +++ b/src/test/resources/md/displayForm.json @@ -2,7 +2,6 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : 0, "ldmexpression" : "" }, "links" : { From e2303f36952b337d47dd4699886d63d6c6d49d83 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Jun 2015 09:34:24 +0200 Subject: [PATCH 0198/1191] [maven-release-plugin] prepare release gooddata-java-0.16.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e4303bac8..606a8670e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.15.1-SNAPSHOT + 0.16.0 ${project.artifactId} GoodData Java SDK From 1baf60ca54427f04fcaad8195626d528f7a41c5f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Jun 2015 09:34:24 +0200 Subject: [PATCH 0199/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 606a8670e..5848ab2bb 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.16.0 + 0.16.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From a5ab759dd2b3699f890d2d1309372940b99e734c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 8 Jun 2015 09:57:36 +0200 Subject: [PATCH 0200/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 71e832d68..ee9f93551 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.15.0 + 0.16.0 ``` From f1be98292ee1e78e2a63f8732756a13a92acb7f1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 12 Jun 2015 15:20:50 +0200 Subject: [PATCH 0201/1191] add warehouse environment --- .../com/gooddata/project/Environment.java | 14 ++++++++++++++ .../java/com/gooddata/project/Project.java | 5 +++++ .../gooddata/project/ProjectEnvironment.java | 3 ++- .../com/gooddata/warehouse/Warehouse.java | 19 ++++++++++++++++++- src/test/java/com/gooddata/ShowcaseAT.java | 5 ++++- .../com/gooddata/warehouse/WarehouseTest.java | 4 +++- .../resources/warehouse/warehouse-create.json | 3 ++- src/test/resources/warehouse/warehouse.json | 1 + 8 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gooddata/project/Environment.java diff --git a/src/main/java/com/gooddata/project/Environment.java b/src/main/java/com/gooddata/project/Environment.java new file mode 100644 index 000000000..be54f9eca --- /dev/null +++ b/src/main/java/com/gooddata/project/Environment.java @@ -0,0 +1,14 @@ +package com.gooddata.project; + +/** + * Optional property for project or warehouse create, the property is ignored during update. + * Default value is {@link #PRODUCTION} which is also environment for all currently existing projects or warehouses. + */ +public enum Environment { + /** Default value, projects or warehouses are backed-up and archived. */ + PRODUCTION, + /** no meaning yet and behavior is the same as for {@link #PRODUCTION} projects or warehouses. */ + DEVELOPMENT, + /** 'TESTING' projects or warehouses are not backed-up and archived. */ + TESTING +} diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 91ddf6afb..0c8262625 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -255,6 +255,11 @@ public void setEnvironment(final ProjectEnvironment environment) { setEnvironment(environment.name()); } + public void setEnvironment(final Environment environment) { + notNull(environment, "environment"); + setEnvironment(environment.name()); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class ProjectContent { diff --git a/src/main/java/com/gooddata/project/ProjectEnvironment.java b/src/main/java/com/gooddata/project/ProjectEnvironment.java index 4f014f77d..b96697dc0 100644 --- a/src/main/java/com/gooddata/project/ProjectEnvironment.java +++ b/src/main/java/com/gooddata/project/ProjectEnvironment.java @@ -2,7 +2,8 @@ /** * 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. + * Default value is {@link #PRODUCTION} which is also environment for all currently existing projects.

+ * Preffer {@link com.gooddata.project.Environment} if possible. */ public enum ProjectEnvironment { /** Default value, projects are backed-up and archived. */ diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 2df54c2b9..d17151035 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -3,6 +3,7 @@ import static com.gooddata.util.Validate.notNull; import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL; +import com.gooddata.project.Environment; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; import org.codehaus.jackson.annotate.JsonCreator; @@ -45,6 +46,7 @@ public class Warehouse { private String createdBy; private String updatedBy; private String status; + private String environment; private Map links; private String warehouseHost; @@ -66,13 +68,15 @@ public Warehouse(String title, String authToken, String description) { @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, - @JsonProperty("status") String status, @JsonProperty("links") Map links) { + @JsonProperty("status") String status, @JsonProperty("environment") String environment, + @JsonProperty("links") Map links) { this(title, authToken, description); this.created = created; this.updated = updated; this.createdBy = createdBy; this.updatedBy = updatedBy; this.status = status; + this.environment = environment; this.links = links; } @@ -126,6 +130,19 @@ void setWarehousePort(int warehousePort) { this.warehousePort = warehousePort; } + public String getEnvironment() { + return environment; + } + + public void setEnvironment(final String environment) { + this.environment = environment; + } + + public void setEnvironment(final Environment environment) { + notNull(environment, "environment"); + setEnvironment(environment.name()); + } + /** * Get jdbc connection string. Works only on Warehouse loaded from API (using WarehouseService). * @return jdbc connection string diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 99e334f74..88c08c574 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -30,6 +30,7 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; import com.gooddata.model.ModelService; +import com.gooddata.project.Environment; import com.gooddata.project.Project; import com.gooddata.project.ProjectFeatureFlag; import com.gooddata.project.ProjectService; @@ -451,7 +452,9 @@ public void removeDefinition() throws Exception { @Test(groups = "warehouse", dependsOnMethods = "login") public void createWarehouse() throws Exception { final WarehouseService warehouseService = gd.getWarehouseService(); - warehouse = warehouseService.createWarehouse(new Warehouse(title, warehouseToken)).get(); + final Warehouse wh = new Warehouse(title, warehouseToken); + wh.setEnvironment(Environment.TESTING); + warehouse = warehouseService.createWarehouse(wh).get(); String jdbc = warehouse.getJdbcConnectionString(); } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index a83bb611f..6552950aa 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -1,10 +1,10 @@ package com.gooddata.warehouse; - import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.assertThat; +import com.gooddata.project.Environment; import org.codehaus.jackson.map.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -17,6 +17,7 @@ public class WarehouseTest { @Test public void testSerialization() throws Exception { final Warehouse warehouse = new Warehouse("New ADS", "Your-ADS-Token", "ADS Description"); + warehouse.setEnvironment(Environment.TESTING); assertThat(warehouse, serializesToJson("/warehouse/warehouse-create.json")); } @@ -28,6 +29,7 @@ public void testDeserialization() throws Exception { assertThat(warehouse.getTitle(), is("Test")); assertThat(warehouse.getDescription(), is("Storage")); assertThat(warehouse.getAuthorizationToken(), is("{Token}")); + assertThat(warehouse.getEnvironment(), is("TESTING")); assertThat(warehouse.getCreatedBy(), is("/gdc/account/profile/createdBy")); assertThat(warehouse.getUpdatedBy(), is("/gdc/account/profile/updatedBy")); assertThat(warehouse.getCreated(), is(new DateTime(2014, 5, 5, 8, 27, 33, DateTimeZone.UTC))); diff --git a/src/test/resources/warehouse/warehouse-create.json b/src/test/resources/warehouse/warehouse-create.json index 9ac123a17..a51dfb9cb 100644 --- a/src/test/resources/warehouse/warehouse-create.json +++ b/src/test/resources/warehouse/warehouse-create.json @@ -2,6 +2,7 @@ "instance": { "title": "New ADS", "authorizationToken": "Your-ADS-Token", - "description": "ADS Description" + "description": "ADS Description", + "environment": "TESTING" } } \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouse.json b/src/test/resources/warehouse/warehouse.json index bd19dc42a..29deb45e5 100644 --- a/src/test/resources/warehouse/warehouse.json +++ b/src/test/resources/warehouse/warehouse.json @@ -8,6 +8,7 @@ "updated" : "2014-05-05T08:27:34.000Z", "createdBy" : "/gdc/account/profile/createdBy", "updatedBy" : "/gdc/account/profile/updatedBy", + "environment" : "TESTING", "links" : { "self" : "/gdc/datawarehouse/instances/instanceId", "parent" : "/gdc/datawarehouse/instances", From f65cc9f7fcde2e63ca67a109c82a8a111dfbf8e5 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 17 Jun 2015 11:44:38 +0200 Subject: [PATCH 0202/1191] add listing of aggregated feature flags for project --- .../java/com/gooddata/gdc/FeatureFlag.java | 53 +++++++++++++++++ .../java/com/gooddata/gdc/FeatureFlags.java | 59 +++++++++++++++++++ .../com/gooddata/project/ProjectService.java | 56 +++++++++++++----- src/test/java/com/gooddata/ShowcaseAT.java | 10 ++++ .../com/gooddata/gdc/FeatureFlagsTest.java | 28 +++++++++ .../gooddata/project/ProjectServiceIT.java | 19 ++++++ .../gooddata/project/ProjectServiceTest.java | 39 ++++++++++++ src/test/resources/gdc/featureFlags.json | 6 ++ 8 files changed, 256 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/gooddata/gdc/FeatureFlag.java create mode 100644 src/main/java/com/gooddata/gdc/FeatureFlags.java create mode 100644 src/test/java/com/gooddata/gdc/FeatureFlagsTest.java create mode 100644 src/test/resources/gdc/featureFlags.json diff --git a/src/main/java/com/gooddata/gdc/FeatureFlag.java b/src/main/java/com/gooddata/gdc/FeatureFlag.java new file mode 100644 index 000000000..be09a43ee --- /dev/null +++ b/src/main/java/com/gooddata/gdc/FeatureFlag.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import static com.gooddata.util.Validate.notNull; + +/** + * Feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform. + * It can be used in various scopes (per project, per project group, per user, global etc.). + */ +public class FeatureFlag { + + private final String name; + private boolean enabled; + + public FeatureFlag(final String name, final boolean enabled) { + this.name = notNull(name, "name cannot be null"); + this.enabled = enabled; + } + + public String getName() { + return name; + } + + public boolean getEnabled() { + return enabled; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final FeatureFlag that = (FeatureFlag) o; + + if (enabled != that.enabled) return false; + return !(name != null ? !name.equals(that.name) : that.name != null); + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (enabled ? 1 : 0); + return result; + } + + @Override + public String toString() { + return "{name='" + name + '\'' + ", enabled=" + enabled + "}"; + } +} diff --git a/src/main/java/com/gooddata/gdc/FeatureFlags.java b/src/main/java/com/gooddata/gdc/FeatureFlags.java new file mode 100644 index 000000000..112aaac0a --- /dev/null +++ b/src/main/java/com/gooddata/gdc/FeatureFlags.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.codehaus.jackson.annotate.JsonAnySetter; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.ArrayList; +import java.util.List; + +import static org.springframework.util.Assert.notNull; +import static org.springframework.util.CollectionUtils.isEmpty; + +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("featureFlags") +@JsonIgnoreProperties(ignoreUnknown = true) +public class FeatureFlags { + + public static final String AGGREGATED_FEATURE_FLAGS_URI = "/gdc/internal/projects/{projectId}/featureFlags"; + public static final UriTemplate AGGREGATED_FEATURE_FLAGS_TEMPLATE = new UriTemplate(AGGREGATED_FEATURE_FLAGS_URI); + + private final List featureFlags = new ArrayList<>(); + + /* protected helper method for JSON deserialization */ + @JsonAnySetter + protected void addFlag(final String name, final boolean enabled) { + notNull(name); + featureFlags.add(new FeatureFlag(name, enabled)); + } + + public List getFeatureFlags() { + return featureFlags; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final FeatureFlags that = (FeatureFlags) o; + + return !(featureFlags != null ? !featureFlags.equals(that.featureFlags) : that.featureFlags != null); + + } + + @Override + public int hashCode() { + return featureFlags != null ? featureFlags.hashCode() : 0; + } + + @Override + public String toString() { + return "FeatureFlags{" + featureFlags + "}"; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 67b6b129c..fdd952c8b 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -6,14 +6,16 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; -import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.PollResult; import com.gooddata.SimplePollHandler; import com.gooddata.account.AccountService; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; import com.gooddata.gdc.AsyncTask; +import com.gooddata.gdc.FeatureFlag; +import com.gooddata.gdc.FeatureFlags; import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; @@ -28,8 +30,9 @@ import java.util.List; import java.util.Set; -import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.gdc.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; +import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; @@ -345,14 +348,39 @@ public Role getRoleByUri(String uri) { } /** - * Lists all feature flags for given project. - * It doesn't matter wheter feature flag is enabled or not, it'll be included in all cases. + * Lists aggregated feature flags for given project and current user (aggregates global, project group, project and user feature flags). + * It doesn't matter whether feature flag is enabled or not, it'll be included in all cases. + * + * @param project project, cannot be null + * @return list of aggregated feature flags for given project and current user + */ + public List listAggregatedFeatureFlags(final Project project) { + notNull(project, "project"); + try { + final FeatureFlags featureFlags = + restTemplate.getForObject(AGGREGATED_FEATURE_FLAGS_TEMPLATE.expand(project.getId()), + FeatureFlags.class); + + if (featureFlags == null) { + throw new GoodDataException("empty response from API call"); + } + + return featureFlags.getFeatureFlags(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list aggregated feature flags for project ID=" + project.getId(), e); + } + } + + /** + * Lists all project feature flags (only project scoped flags, use {@link #listAggregatedFeatureFlags(Project)} for + * aggregated flags from all scopes). + * It doesn't matter whether feature flag is enabled or not, it'll be included in all cases. * * @param project project, cannot be null * @return list of all feature flags for given project */ public List listFeatureFlags(Project project) { - notNull(project, "project cannot be null!"); + notNull(project, "project"); try { final ProjectFeatureFlags projectFeatureFlags = restTemplate.getForObject(FEATURE_FLAGS_TEMPLATE.expand(project.getId()), ProjectFeatureFlags.class); @@ -377,14 +405,14 @@ public List listFeatureFlags(Project project) { * @param featureFlag feature flag to be created, cannot be null */ public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { - notNull(project, "project cannot be null!"); - notNull(featureFlag, "featureFlag cannot be null!"); + notNull(project, "project"); + notNull(featureFlag, "featureFlag"); final String featureFlagsUri = FEATURE_FLAGS_TEMPLATE.expand(project.getId()).toString(); try { final URI featureFlagUri = restTemplate.postForLocation(featureFlagsUri, featureFlag); - notNull(featureFlagsUri, "URI of new featureFlag should not be null!"); + notNull(featureFlagsUri, "URI of new featureFlag"); return getFeatureFlag(featureFlagUri.toString()); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to create feature flag: " + featureFlag, e); @@ -399,8 +427,8 @@ public ProjectFeatureFlag createFeatureFlag(final Project project, final Project * @return feature flag */ public ProjectFeatureFlag getFeatureFlag(final Project project, final String featureFlagName) { - notNull(project, "project cannot be null!"); - notEmpty(featureFlagName, "featureFlagName cannot be empty!"); + notNull(project, "project"); + notEmpty(featureFlagName, "featureFlagName"); return restTemplate.getForObject(getFeatureFlagUri(project, featureFlagName), ProjectFeatureFlag.class); } @@ -413,8 +441,8 @@ public ProjectFeatureFlag getFeatureFlag(final Project project, final String fea * @return updated feature flag */ public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag) { - notNull(featureFlag, "featureFlag cannot be null!"); - notEmpty(featureFlag.getUri(), "featureFlag uri cannot be empty!"); + notNull(featureFlag, "featureFlag"); + notEmpty(featureFlag.getUri(), "featureFlag"); try { restTemplate.put(featureFlag.getUri(), featureFlag); @@ -430,8 +458,8 @@ public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag * @param featureFlag existing project feature flag with links set properly, cannot be null */ public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { - notNull(featureFlag, "featureFlag cannot be null!"); - notEmpty(featureFlag.getUri(), "featureFlag uri cannot be empty!"); + notNull(featureFlag, "featureFlag"); + notEmpty(featureFlag.getUri(), "featureFlag URI"); try { restTemplate.delete(featureFlag.getUri()); diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java index 99e334f74..846f20fc2 100644 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ b/src/test/java/com/gooddata/ShowcaseAT.java @@ -15,6 +15,7 @@ import com.gooddata.dataset.DatasetManifest; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; +import com.gooddata.gdc.FeatureFlag; import com.gooddata.md.Attribute; import com.gooddata.md.Entry; import com.gooddata.md.Fact; @@ -212,6 +213,15 @@ public void listProjectFeatureFlags() throws Exception { new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); } + @Test(groups = "project", dependsOnMethods = "listProjectFeatureFlags") + public void listAggregatedFeatureFlags() throws Exception { + final List flags = gd.getProjectService().listAggregatedFeatureFlags(project); + + assertThat(flags, containsInAnyOrder( + new FeatureFlag("mostRecentFeatureFlag", true), + new FeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") public void getProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = diff --git a/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java b/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java new file mode 100644 index 000000000..b51924ef7 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.hasSize; +import static org.testng.AssertJUnit.assertNotNull; + +public class FeatureFlagsTest { + + @Test + public void testDeserialize() { + final FeatureFlags featureFlags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", + FeatureFlags.class); + assertNotNull(featureFlags); + + assertThat(featureFlags.getFeatureFlags(), hasSize(2)); + assertThat(featureFlags.getFeatureFlags(), contains( + new FeatureFlag("testFeature", true), + new FeatureFlag("testFeature2", false))); + } + +} diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index aa63808a1..60295bfb8 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -4,6 +4,8 @@ import com.gooddata.GoodDataException; import com.gooddata.collections.PageRequest; import com.gooddata.gdc.AsyncTask; +import com.gooddata.gdc.FeatureFlag; +import com.gooddata.gdc.FeatureFlags; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; import org.codehaus.jackson.map.ObjectMapper; @@ -319,6 +321,23 @@ public void shouldListPagedUsers() throws Exception { assertThat(secondPage, empty()); } + @Test + public void shouldListAggregatedFeatureFlags() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) + .respond() + .withBody(readStringFromResource("/gdc/featureFlags.json")) + .withStatus(200); + + final List featureFlags = gd.getProjectService().listAggregatedFeatureFlags(enabled); + + assertThat(featureFlags, hasSize(2)); + assertThat(featureFlags, contains( + new FeatureFlag("testFeature", true), + new FeatureFlag("testFeature2", false))); + } + @Test public void shouldListProjectFeatureFlags() throws Exception { diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java index 44e4a439d..377d3d703 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceTest.java +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -7,6 +7,8 @@ import com.gooddata.GoodDataRestException; import com.gooddata.account.Account; import com.gooddata.account.AccountService; +import com.gooddata.gdc.FeatureFlag; +import com.gooddata.gdc.FeatureFlags; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.web.client.RestClientException; @@ -14,12 +16,15 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import java.net.URI; import java.util.Collection; +import java.util.List; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasSize; import static org.mockito.Mockito.when; @@ -28,6 +33,7 @@ public class ProjectServiceTest { private static final String ACCOUNT_ID = "17"; private static final String ID = "11"; private static final String URI = "/gdc/projects/11"; + private static final String FEATURE_FLAGS_URI = "/gdc/internal/projects/11/featureFlags"; @Mock private Project project; @@ -46,6 +52,7 @@ public void setUp() throws Exception { service = new ProjectService(restTemplate, accountService); when(accountService.getCurrent()).thenReturn(account); when(account.getId()).thenReturn(ACCOUNT_ID); + when(project.getId()).thenReturn(ID); } @Test @@ -109,4 +116,36 @@ public void testGetProjectById() throws Exception { assertThat(result, is(project)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void testListAggregatedFeatureFlagsWithNullId() throws Exception { + service.listAggregatedFeatureFlags(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListAggregatedFeatureFlagsWithEmptyResponse() throws Exception { + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)).thenReturn(null); + service.listAggregatedFeatureFlags(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListAggregatedFeatureFlagsWithClientErrorResponse() throws Exception { + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)) + .thenThrow(new RestClientException("")); + service.listAggregatedFeatureFlags(project); + } + + @Test + public void testListAggregatedFeatureFlags() throws Exception { + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)) + .thenReturn(new FeatureFlags() {{ + this.addFlag("flag1", true); + }}); + + final List flagList = service.listAggregatedFeatureFlags(project); + + assertThat(flagList, hasSize(1)); + assertThat(flagList, contains( + new FeatureFlag("flag1", true))); + } + } \ No newline at end of file diff --git a/src/test/resources/gdc/featureFlags.json b/src/test/resources/gdc/featureFlags.json new file mode 100644 index 000000000..72ff8f9d2 --- /dev/null +++ b/src/test/resources/gdc/featureFlags.json @@ -0,0 +1,6 @@ +{ + "featureFlags": { + "testFeature": true, + "testFeature2": false + } +} \ No newline at end of file From 39af689d8f6d346fd9c7bf6745736a04cad1f80c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sun, 14 Jun 2015 00:52:13 +0200 Subject: [PATCH 0203/1191] Move usage doc from README to wiki --- CONTRIBUTING.md | 27 ++++--- README.md | 186 +++--------------------------------------------- 2 files changed, 26 insertions(+), 187 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c15ff209c..3c34ff211 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,8 @@ Below are few **rules, recommendations and best practices** we try to follow whe * Every pull request with non-trivial change must be **associated with an issue**. * Every closed non-rejected pull request and issue must be marked with exactly **one milestone version**. * Issue must be **properly labeled** (bug/enhancement/backward incompatible/...). -* Add usage examples of new high level functionality to [README.md](README.md) +* Add usage examples of new high level functionality to +[documentation](https://github.com/martiner/gooddata-java/wiki/Code-Examples). ## Design @@ -15,7 +16,8 @@ Below are few **rules, recommendations and best practices** we try to follow whe * Don't create single implementation interfaces for services. ### DTOs -* All DTOs which can be updated should be **mutable**. Please keep mutable only the fields which are subject of change, the rest should be immutable. +* All DTOs which can be updated should be **mutable**. Please keep mutable only the fields which are subject of change, +the rest should be immutable. * Create method named `String getUri()` to provide **link to self**. * Introduce **constants**: ```java @@ -23,24 +25,29 @@ public static final String URI = "/gdc/someresource/{resource-id}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); ``` * Put _Jackson_ annotations on getters rather then on fields. -* Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed in related service. +* Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed +in related service. * Test all DTOs using _[JsonUnit](https://github.com/lukas-krecan/JsonUnit)_. ### Enums -* Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use them when deserializing**. +* Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use +them when deserializing**. * Where make sense, use overloaded methods with an enum argument as well as `String` argument. ### Services -* When programming client for some polling return [`FutureResult`](src/main/java/com/gooddata/FutureResult.java) to enable user asynchronous call. -* Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java) when you feel the case is specific enough. +* When programming client for some polling return [`FutureResult`](src/main/java/com/gooddata/FutureResult.java) +to enable user asynchronous call. +* Create custom [`GoodDataException`](src/main/java/com/gooddata/GoodDataException.java) when you feel the case +is specific enough. * Prefer DTOs to `String` or primitive arguments. * **Method naming**: - * `get*()` when searching form single object (throw exception when no or multiple objects are found, never return `null`) + * `get*()` when searching form single object (throw exception when no or multiple objects are found, + never return `null`) * `find*()` when searching for multiple objects (collection of objects, never return `null`) * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` * Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. * If it is possible write **acceptance tests** to be run with the real backend. -* Update [`README`](README.md) with usage examples. +* Update [documentation](https://github.com/martiner/gooddata-java/wiki/Code-Examples) with usage examples. ## Best practices * **Test class naming**: @@ -48,4 +55,6 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); * `*IT` integration tests (see [`AbstractGoodDataIT`](src/test/java/com/gooddata/AbstractGoodDataIT.java)) * `*AT` acceptance tests * Everything public should be **documented** using _javadoc_. -* When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. +* When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has +its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, +use _abstract utility class pattern_. diff --git a/README.md b/README.md index ee9f93551..60445228a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -# GoodData Java SDK - -[![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) +# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 @@ -8,6 +6,9 @@ and currently the SDK is transitioned to be an official GoodData project. ## Usage +See [Wiki](https://github.com/martiner/gooddata-java/wiki) for [Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) +and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-GoodData-Java-SDK). + The *GoodData Java SDK* is available in Maven Central Repository, to use it from Maven add to `pom.xml`: ```xml @@ -28,180 +29,9 @@ The *GoodData Java SDK* uses: * the *Spring Framework* (version 3.x) * the *Jackson JSON Processor* (version 1.9) -### General - -```java -GoodData gd = new GoodData("roman@gooddata.com", "Roman1"); -gd.logout(); -``` - -### Project API - -List projects, create a project,... -```java -ProjectService projectService = gd.getProjectService(); -Collection projects = projectService.getProjects(); -Project project = projectService.createProject(new Project("my project", "MyToken")).get(); -``` - -Validate project -```java -Set types = projectService.getAvailableProjectValidationTypes(project); -ProjectValidationResults results = projectService.validateProject(project, types).get(); -``` - -List project users -```java -ProjectService projectService = gd.getProjectService(); -List users = new ArrayList<>(); -List page; -while (!(page = projectService.listUsers(project, new PageRequest(users.size(), 100))).isEmpty()) { - users.addAll(page); -} -``` - -List project user roles -```java -ProjectService projectService = gd.getProjectService(); -Set roles = projectService.getRoles(project); -``` - -### Project Model API - -Create and update the project model, execute MAQL DDL,... - -```java -ModelService modelService = gd.getModelService(); -ModelDiff diff = modelService.getProjectModelDiff(project, - new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); -modelService.updateProjectModel(project, diff).get(); - -modelService.updateProjectModel(project, "MAQL DDL EXPRESSION").get(); -``` - -### Metadata API - -Query, create, update and remove project metadata - attributes, facts, metrics, reports,... - -```java -MetadataService md = gd.getMetadataService(); - -String fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); -Metric m = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); - -Attribute attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); - -ReportDefinition definition = GridReportDefinitionContent.create( - "Department avg shoe size", - asList("metricGroup"), - asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), - asList(new GridElement(m.getUri(), "Avg shoe size")) -); -definition = md.createObj(project, definition); -Report report = md.createObj(project, new Report(definition.getTitle(), definition)); - -md.removeObj(report) -``` - -Create and retrieve scheduled mails on reports and dashboards: - -```java -Project project = ... -ReportDefinition reportDefinition = ... - -MetadataService md = gd.getMetadataService(); -ScheduledMail scheduledMail = md.createObj( - project, - (new ScheduledMail("Scheduled Mail Title", "Scheduled Mail Summary")) - .setRecurrency("0:0:0:1*12:0:0") - .setStartDate(new LocalDate(2012, 6, 5)) - .setTimeZone("America/Los_Angeles") - .addToAddress("user_in_project@example.com") - .addBccAddress("another_user_in_project@example.com") - .setSubject("Mail subject") - .setBody("Mail body") - .addReportAttachment(reportDefinition, - Collections.singletonMap("pageOrientation", "landscape"), - pdf, xls) -); - -Collection result = md.find(project, ScheduledMail.class); -for (Entry e : result) { - ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); -} -``` - -### Dataset API - -Upload data to datasets,.. - -```java -DatasetService datasetService = gd.getDatasetService(); -datasetService.loadDataset(project, "datasetId", new FileInputStream("data.csv")).get(); -``` -Upload data to datasets using batch upload ,.. - -```java -DatasetService datasetService = gd.getDatasetService(); -final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); -personManifest.setSource(getClass().getResourceAsStream("/person.csv")); - -final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); -cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); - -datasetService.loadDatasets(project, personManifest, cityManifest).get(); -``` - -Update data in dataset -```java -DatasetService datasetService = gd.getDatasetService(); -datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); -``` - -### Report API - -Execute and export reports. - -```java -ReportService reportService = gd.getReportService(); -reportService.exportReport(definition, PNG, new FileOutputStream("report.png")).get(); -``` - -### DataStore API - -Manage files on the data store (currently backed by WebDAV) - user staging area. - -```java -DataStoreService dataStoreService = gd.getDataStoreService(); -dataStoreService.upload("/dir/file.txt", new FileInputStream("file.txt")); -InputStream stream = dataStoreService.download("/dir/file.txt"); -dataStoreService.delete("/dir/file.txt"); -``` - -### Warehouse API -Manage warehouses - create, update, list and delete. -```java -WarehouseService warehouseService = gd.getWarehouseService(); -Warehouse warehouse = warehouseService.createWarehouse(new Warehouse("title", "authToken", "description")).get(); -String jdbc = warehouse.getJdbcConnectionString(); - -Collection warehouseList = warehouseService.listWarehouses(); -warehouseService.removeWarehouse(warehouse); -``` - -### Dataload processes API -Manage dataload processes - create, update, list, delete, and process executions - execute, get logs, schedules, ... -```java -ProcessService processService = gd.getProcessService(); -DataloadProcess process = processService.createProcess(project, new DataloadProcess("name", "GRAPH"), new File("path/to/processdatadir")); - -ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "myGraph.grf")).get(); -processService.getExecutionLog(executionDetail, new FileOutputStream("file/where/the/log/willbewritten")); - -processService.createSchedule(project, new Schedule(process, "myGraph.grf", "0 0 * * *")); -``` +## License +The *GoodData Java SDK* is free and open-source software under [BSD License](LICENSE.txt). ##Contribute -Missing functionality? Found a BUG? - -Please create an [issue](https://github.com/martiner/gooddata-java/issues) or simply [contribute your code](CONTRIBUTING.md). +Missing functionality? Found a BUG? Please create an [issue](https://github.com/martiner/gooddata-java/issues) +or simply [contribute your code](CONTRIBUTING.md). From f0e18a557c98d400ccf5b7cd8a9a4d9c5cb40d57 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 17 Jun 2015 14:29:33 +0200 Subject: [PATCH 0204/1191] [maven-release-plugin] prepare release gooddata-java-0.17.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5848ab2bb..212c01c71 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.16.1-SNAPSHOT + 0.17.0 ${project.artifactId} GoodData Java SDK From 6b0e72942acd1cb17ec127dbfc8dd106e4642162 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 17 Jun 2015 14:29:34 +0200 Subject: [PATCH 0205/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 212c01c71..fd0c7eaa5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.17.0 + 0.17.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From b2339bcc99aea320bcba0b3e713709794e511dc4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 17 Jun 2015 16:26:58 +0200 Subject: [PATCH 0206/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 60445228a..558d5faf6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.16.0 + 0.17.0 ``` From 5c4e5960bc177b21a6f31cfe71e9a19558d2f8d9 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 18 Jun 2015 19:27:19 +0200 Subject: [PATCH 0207/1191] Add missing javadocs to GoodData class --- src/main/java/com/gooddata/GoodData.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 4b61c7118..73820a494 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -354,9 +354,15 @@ public ReportService getReportService() { return reportService; } + /** + * Get initialized service for dataload processes management and process executions. + * + * @return initialized service for dataload processes management and process executions + */ public ProcessService getProcessService() { return processService; } + /** * Get initialized service for ADS management (create, access and delete ads instances). * @@ -365,6 +371,12 @@ public ProcessService getProcessService() { public WarehouseService getWarehouseService() { return warehouseService; } + + /** + * Get initialized service for connector integration management (create, update, start process, ...). + * + * @return initialized service for connector integration management + */ public ConnectorService getConnectorService() { return connectorService; } From 786a1b0088f5994b7b6cff014f49dc14d44fcfdf Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 19 Jun 2015 19:07:17 +0200 Subject: [PATCH 0208/1191] Add build-helper-maven-plugin version Add plugin version to stabilise builds. Also remove one of it's executions which is superfluous and add descriptive identifiers of plugin executions. --- pom.xml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index fd0c7eaa5..f78c5265d 100644 --- a/pom.xml +++ b/pom.xml @@ -92,15 +92,10 @@ org.codehaus.mojo build-helper-maven-plugin + 1.9.1 - parse-version - - parse-version - - - - regex-property + set-animalSnifferJdkVersion-property regex-property @@ -127,6 +122,7 @@ + check-compatibility-with-java-api package check From 6a0949fb0614aea0b9f9c72167e38507f4e8df80 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 19 Jun 2015 22:04:50 +0200 Subject: [PATCH 0209/1191] Specify JDK version in dependencies in README Useful for users to know what's the minimum required Java version. --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 558d5faf6..29b492baf 100644 --- a/README.md +++ b/README.md @@ -24,10 +24,11 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info ### Dependencies The *GoodData Java SDK* uses: -* the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) (version 0.8.2 or later) -* the *Apache HTTP Client* (version 4.3 or later, for white-labeled domains at least version 4.3.2 is required) -* the *Spring Framework* (version 3.x) -* the *Jackson JSON Processor* (version 1.9) +* the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.8.2 or later +* the *Apache HTTP Client* version 4.3 or later (for white-labeled domains at least version 4.3.2 is required) +* the *Spring Framework* version 3.x +* the *Jackson JSON Processor* version 1.9 +* the *Java Development Kit (JDK)* version 7 or later ## License The *GoodData Java SDK* is free and open-source software under [BSD License](LICENSE.txt). From 37e659745fe0d67c8d1baa03d001aefe2a2f4f05 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 11 Jul 2015 00:40:47 +0200 Subject: [PATCH 0210/1191] Fix setMaxConnections in GoodDataSettings Validation has been examining different variable. Also add tests examining those validations. --- .../java/com/gooddata/GoodDataSettings.java | 11 ++----- .../com/gooddata/GoodDataSettingsTest.java | 30 +++++++++++++++---- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index 786db2743..5d2ca9dc1 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -1,14 +1,9 @@ package com.gooddata; -import static org.springframework.util.Assert.isTrue; - -import org.apache.http.client.config.RequestConfig; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.springframework.util.Assert; - import java.util.concurrent.TimeUnit; +import static org.springframework.util.Assert.isTrue; + /** * Gather various additional settings of {@link GoodData}. Can be passed to the {@link GoodData} constructor to tune up it's behaviour. * Settings are applied only once at the beginning. Changing this bean after it's passed to {@link GoodData} has no effect. @@ -29,7 +24,7 @@ public class GoodDataSettings { * @param maxConnections maximum number of connections used. */ public void setMaxConnections(int maxConnections) { - isTrue(connectionTimeout > 0, "connectionTimeout must be greater than zero"); + isTrue(maxConnections > 0, "maxConnections must be greater than zero"); this.maxConnections = maxConnections; } diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java index dca0d6da5..68edc48ef 100644 --- a/src/test/java/com/gooddata/GoodDataSettingsTest.java +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -1,18 +1,22 @@ package com.gooddata; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; -import org.apache.http.impl.client.HttpClientBuilder; -import org.testng.annotations.Test; +public class GoodDataSettingsTest { + private GoodDataSettings settings; -public class GoodDataSettingsTest { + @BeforeMethod + public void setUp() throws Exception { + settings = new GoodDataSettings(); + } @Test public void testHasDefaults() throws Exception { - final GoodDataSettings settings = new GoodDataSettings(); assertTrue(settings.getMaxConnections() > 0); assertTrue(settings.getConnectionTimeout() >= 0); assertTrue(settings.getSocketTimeout() >= 0); @@ -20,11 +24,25 @@ public void testHasDefaults() throws Exception { @Test public void testSetSeconds() throws Exception { - final GoodDataSettings settings = new GoodDataSettings(); settings.setConnectionTimeoutSeconds(53); settings.setSocketTimeoutSeconds(71); assertEquals(53000, settings.getConnectionTimeout()); assertEquals(71000, settings.getSocketTimeout()); } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void setNegativeConnectionTimeoutFails() throws Exception { + settings.setConnectionTimeout(-3); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void setNegativeSocketTimeoutFails() throws Exception { + settings.setSocketTimeout(-5); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void setZeroMaxConnectionsFails() throws Exception { + settings.setMaxConnections(0); + } } \ No newline at end of file From 951578e01b4b03bb358f59317027c00661b0cf7b Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 11 Jul 2015 00:52:51 +0200 Subject: [PATCH 0211/1191] Add connectionRequestTimeout to settings Add missing timeout used when requesting a connection from the connection manager. --- src/main/java/com/gooddata/GoodData.java | 1 + .../java/com/gooddata/GoodDataSettings.java | 87 +++++++++++++++---- .../com/gooddata/GoodDataSettingsTest.java | 8 ++ 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 73820a494..24d9d75c7 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -228,6 +228,7 @@ private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings setting final RequestConfig.Builder requestConfig = RequestConfig.copy(RequestConfig.DEFAULT); requestConfig.setConnectTimeout(settings.getConnectionTimeout()); + requestConfig.setConnectionRequestTimeout(settings.getConnectionRequestTimeout()); requestConfig.setSocketTimeout(settings.getSocketTimeout()); return HttpClientBuilder.create() diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index 5d2ca9dc1..a679f5c86 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -5,20 +5,24 @@ import static org.springframework.util.Assert.isTrue; /** - * Gather various additional settings of {@link GoodData}. Can be passed to the {@link GoodData} constructor to tune up it's behaviour. - * Settings are applied only once at the beginning. Changing this bean after it's passed to {@link GoodData} has no effect. + * Gather various additional settings of {@link GoodData}. Can be passed to the {@link GoodData} constructor to tune up + * it's behaviour. + *

+ * Settings are applied only once at the beginning. Changing this bean after it's passed to {@link GoodData} has + * no effect. */ public class GoodDataSettings { private int maxConnections = 20; private int connectionTimeout = secondsToMillis(10); + private int connectionRequestTimeout = secondsToMillis(10); private int socketTimeout = secondsToMillis(60); /** * Set maximum number of connections used. This applies same for connections per host as for total connections. * (As we assume GoodData connects to single host). - * + *

* The default value is 20. * * @param maxConnections maximum number of connections used. @@ -30,6 +34,7 @@ public void setMaxConnections(int maxConnections) { /** * Maximum number of connection used + * * @return maximum number of connection used */ public int getMaxConnections() { @@ -38,7 +43,9 @@ public int getMaxConnections() { /** * Set timeout milliseconds until connection established. + *

* The default value is 10 seconds (10000 ms). + *

* Set to 0 for infinite. * * @param connectionTimeout connection timeout milliseconds @@ -50,7 +57,9 @@ public void setConnectionTimeout(int connectionTimeout) { /** * Set timeout seconds until connection established. + *

* The default value is 10 seconds. + *

* Set to 0 for infinite. * * @param connectionTimeout connection timeout seconds @@ -61,15 +70,55 @@ public void setConnectionTimeoutSeconds(int connectionTimeout) { /** * Milliseconds until connection established. + * * @return milliseconds until connection established */ public int getConnectionTimeout() { return connectionTimeout; } + /** + * Set timeout in milliseconds used when requesting a connection from the connection manager. + *

+ * The default value is 10 seconds (10000 ms). + *

+ * Set to 0 for infinite. + * + * @param connectionRequestTimeout connection request timeout milliseconds + */ + public void setConnectionRequestTimeout(final int connectionRequestTimeout) { + isTrue(connectionRequestTimeout >= 0, "connectionRequestTimeout must not be negative"); + this.connectionRequestTimeout = connectionRequestTimeout; + } + + /** + * Set timeout in seconds used when requesting a connection from the connection manager. + *

+ * The default value is 10 seconds. + *

+ * Set to 0 for infinite. + *

+ * + * @param connectionRequestTimeout connection request timeout seconds + */ + public void setConnectionRequestTimeoutSeconds(final int connectionRequestTimeout) { + setConnectionRequestTimeout(secondsToMillis(connectionRequestTimeout)); + } + + /** + * Returns the timeout in milliseconds used when requesting a connection from the connection manager. + * + * @return milliseconds used as timeout when requesting a connection from the connection manager + */ + public int getConnectionRequestTimeout() { + return connectionRequestTimeout; + } + /** * Set socket timeout (maximum period inactivity between two consecutive data packets) milliseconds. + *

* The default value is 60 seconds (60000 ms). + *

* Set to 0 for infinite. * * @param socketTimeout socket timeout milliseconds @@ -81,7 +130,9 @@ public void setSocketTimeout(int socketTimeout) { /** * Set socket timeout (maximum period inactivity between two consecutive data packets) seconds. + *

* The default value is 60 seconds. + *

* Set to 0 for infinite. * * @param socketTimeout socket timeout seconds @@ -91,26 +142,24 @@ public void setSocketTimeoutSeconds(int socketTimeout) { } /** - * Milliseconds for inactivity between two consecutive data packets. - * @return milliseconds for inactivity between two consecutive data packets + * Milliseconds for inactivity between two consecutive data packets. + * + * @return milliseconds for inactivity between two consecutive data packets */ public int getSocketTimeout() { return socketTimeout; } @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (!(o instanceof GoodDataSettings)) - return false; - - GoodDataSettings that = (GoodDataSettings) o; - - if (maxConnections != that.maxConnections) - return false; - if (connectionTimeout != that.connectionTimeout) - return false; + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final GoodDataSettings that = (GoodDataSettings) o; + + if (maxConnections != that.maxConnections) return false; + if (connectionTimeout != that.connectionTimeout) return false; + if (connectionRequestTimeout != that.connectionRequestTimeout) return false; return socketTimeout == that.socketTimeout; } @@ -119,6 +168,7 @@ public boolean equals(Object o) { public int hashCode() { int result = maxConnections; result = 31 * result + connectionTimeout; + result = 31 * result + connectionRequestTimeout; result = 31 * result + socketTimeout; return result; } @@ -126,7 +176,8 @@ public int hashCode() { @Override public String toString() { return "GoodDataSettings{" + - "maxConnections=" + maxConnections + + "connectionRequestTimeout=" + connectionRequestTimeout + + ", maxConnections=" + maxConnections + ", connectionTimeout=" + connectionTimeout + ", socketTimeout=" + socketTimeout + '}'; diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java index 68edc48ef..0a1ba8753 100644 --- a/src/test/java/com/gooddata/GoodDataSettingsTest.java +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -19,15 +19,18 @@ public void setUp() throws Exception { public void testHasDefaults() throws Exception { assertTrue(settings.getMaxConnections() > 0); assertTrue(settings.getConnectionTimeout() >= 0); + assertTrue(settings.getConnectionRequestTimeout() >= 0); assertTrue(settings.getSocketTimeout() >= 0); } @Test public void testSetSeconds() throws Exception { settings.setConnectionTimeoutSeconds(53); + settings.setConnectionRequestTimeoutSeconds(69); settings.setSocketTimeoutSeconds(71); assertEquals(53000, settings.getConnectionTimeout()); + assertEquals(69000, settings.getConnectionRequestTimeout()); assertEquals(71000, settings.getSocketTimeout()); } @@ -36,6 +39,11 @@ public void setNegativeConnectionTimeoutFails() throws Exception { settings.setConnectionTimeout(-3); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void setNegativeConnectionRequestTimeoutFails() throws Exception { + settings.setConnectionRequestTimeout(-1); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void setNegativeSocketTimeoutFails() throws Exception { settings.setSocketTimeout(-5); From f8cf56e78b73dcd109378fddf4dbe4eccb2a3f8a Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 14 Jul 2015 17:38:47 +0200 Subject: [PATCH 0212/1191] Extend PageRequest with String offset. Offset parameter for paging may be of type int or String. --- .../com/gooddata/collections/PageRequest.java | 19 +++++++++++++++---- .../gooddata/collections/PageRequestTest.java | 9 +++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index a5829fb7a..491c32f72 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -11,16 +11,27 @@ */ public class PageRequest implements Page { - private final int offset; + private final String offset; private final int limit; /** - * Creates new page with provided values. + * Creates new page definition with provided values. * - * @param offset page offset - * @param limit item count on a page + * @param offset page offset (position in the collection) + * @param limit maximal number of returned elements (on a page) */ public PageRequest(final int offset, final int limit) { + this.offset = String.valueOf(offset); + this.limit = limit; + } + + /** + * Creates new page definition with provided values. + * + * @param offset page offset (position in the collection) + * @param limit maximal number of returned elements (on a page) + */ + public PageRequest(final String offset, final int limit) { this.offset = offset; this.limit = limit; } diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index 450a60ce2..d70d0d279 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -19,4 +19,13 @@ public void testGetPageUri() throws Exception { assertThat(pageUri, notNullValue()); assertThat(pageUri.toString(), is("test_uri?offset=12&limit=10")); } + + @Test + public void testGetPageUriWithStringOffset() throws Exception { + final PageRequest pageRequest = new PageRequest("17", 10); + final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("test_uri"); + final URI pageUri = pageRequest.getPageUri(uriBuilder); + assertThat(pageUri, notNullValue()); + assertThat(pageUri.toString(), is("test_uri?offset=17&limit=10")); + } } \ No newline at end of file From 0102bf03cc72ce20a46a528a7f2469de05660472 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 15 Jul 2015 11:26:16 +0200 Subject: [PATCH 0213/1191] split acceptance tests into multiple classes --- .../java/com/gooddata/AbstractGoodDataAT.java | 51 ++ src/test/java/com/gooddata/ShowcaseAT.java | 563 ------------------ .../gooddata/account/AccountServiceAT.java | 23 + .../processes}/ProcessIdMatcher.java | 3 +- .../dataload/processes/ProcessServiceAT.java | 99 +++ .../gooddata/dataset/DatasetServiceAT.java | 38 ++ .../com/gooddata/gdc/DatastoreServiceAT.java | 46 ++ .../com/gooddata/md/MetadataServiceAT.java | 163 +++++ .../gooddata/md/report/ReportServiceAT.java | 19 + .../com/gooddata/model/ModelServiceAT.java | 23 + .../{ => project}/ProjectIdMatcher.java | 4 +- .../gooddata/project/ProjectServiceAT.java | 172 ++++++ .../{ => warehouse}/WarehouseIdMatcher.java | 3 +- .../warehouse/WarehouseServiceAT.java | 54 ++ 14 files changed, 691 insertions(+), 570 deletions(-) create mode 100644 src/test/java/com/gooddata/AbstractGoodDataAT.java delete mode 100644 src/test/java/com/gooddata/ShowcaseAT.java create mode 100644 src/test/java/com/gooddata/account/AccountServiceAT.java rename src/test/java/com/gooddata/{ => dataload/processes}/ProcessIdMatcher.java (89%) create mode 100644 src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java create mode 100644 src/test/java/com/gooddata/dataset/DatasetServiceAT.java create mode 100644 src/test/java/com/gooddata/gdc/DatastoreServiceAT.java create mode 100644 src/test/java/com/gooddata/md/MetadataServiceAT.java create mode 100644 src/test/java/com/gooddata/md/report/ReportServiceAT.java create mode 100644 src/test/java/com/gooddata/model/ModelServiceAT.java rename src/test/java/com/gooddata/{ => project}/ProjectIdMatcher.java (87%) create mode 100644 src/test/java/com/gooddata/project/ProjectServiceAT.java rename src/test/java/com/gooddata/{ => warehouse}/WarehouseIdMatcher.java (91%) create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java new file mode 100644 index 000000000..952869606 --- /dev/null +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -0,0 +1,51 @@ +package com.gooddata; + +import com.gooddata.md.Attribute; +import com.gooddata.md.Metric; +import com.gooddata.md.ScheduledMail; +import com.gooddata.md.report.Report; +import com.gooddata.md.report.ReportDefinition; +import com.gooddata.project.Project; +import org.joda.time.LocalDate; +import org.testng.annotations.AfterSuite; + +/** + * Parent for acceptance tests + */ +public abstract class AbstractGoodDataAT { + + protected final String title; + protected final GoodData gd; + + protected Project project; + + protected String fact; + protected Attribute attr; + protected Metric metric; + protected Report report; + protected ReportDefinition reportDefinition; + protected ScheduledMail scheduledMail; + + + public AbstractGoodDataAT() { + title = "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); + gd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); + } + + public static String getProperty(String name) { + final String value = System.getenv(name); + if (value != null) { + return value; + } + throw new IllegalArgumentException("Environment variable " + name + " not found! Available variables: " + + System.getenv().keySet()); + } + + @AfterSuite + public void logout() throws Exception { + if (gd != null) { + gd.logout(); + } + System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); + } +} diff --git a/src/test/java/com/gooddata/ShowcaseAT.java b/src/test/java/com/gooddata/ShowcaseAT.java deleted file mode 100644 index f205327b4..000000000 --- a/src/test/java/com/gooddata/ShowcaseAT.java +++ /dev/null @@ -1,563 +0,0 @@ -package com.gooddata; - -import com.gooddata.account.Account; -import com.gooddata.account.AccountService; -import com.gooddata.collections.PageRequest; -import com.gooddata.collections.PageableList; -import com.gooddata.dataload.processes.DataloadProcess; -import com.gooddata.dataload.processes.ProcessExecution; -import com.gooddata.dataload.processes.ProcessExecutionDetail; -import com.gooddata.dataload.processes.ProcessExecutionException; -import com.gooddata.dataload.processes.ProcessService; -import com.gooddata.dataload.processes.ProcessType; -import com.gooddata.dataload.processes.Schedule; -import com.gooddata.dataload.processes.ScheduleState; -import com.gooddata.dataset.DatasetManifest; -import com.gooddata.dataset.DatasetService; -import com.gooddata.gdc.DataStoreService; -import com.gooddata.gdc.FeatureFlag; -import com.gooddata.md.Attribute; -import com.gooddata.md.Entry; -import com.gooddata.md.Fact; -import com.gooddata.md.MetadataService; -import com.gooddata.md.Metric; -import com.gooddata.md.ScheduledMail; -import com.gooddata.md.Usage; -import com.gooddata.md.report.AttributeInGrid; -import com.gooddata.md.report.Filter; -import com.gooddata.md.report.GridElement; -import com.gooddata.md.report.GridReportDefinitionContent; -import com.gooddata.md.report.Report; -import com.gooddata.md.report.ReportDefinition; -import com.gooddata.model.ModelDiff; -import com.gooddata.model.ModelService; -import com.gooddata.project.Environment; -import com.gooddata.project.Project; -import com.gooddata.project.ProjectFeatureFlag; -import com.gooddata.project.ProjectService; -import com.gooddata.project.ProjectValidationResults; -import com.gooddata.project.Role; -import com.gooddata.project.User; -import com.gooddata.report.ReportExportFormat; -import com.gooddata.report.ReportService; -import com.gooddata.warehouse.Warehouse; -import com.gooddata.warehouse.WarehouseService; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.joda.time.LocalDate; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpStatus; -import org.testng.annotations.AfterClass; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; - -import static com.gooddata.ProcessIdMatcher.hasSameIdAs; -import static com.gooddata.ProjectIdMatcher.hasSameIdAs; -import static com.gooddata.WarehouseIdMatcher.hasSameIdAs; -import static com.gooddata.md.Restriction.identifier; -import static com.gooddata.project.ProjectEnvironment.TESTING; -import static com.gooddata.report.ReportExportFormat.PDF; -import static com.gooddata.report.ReportExportFormat.XLS; -import static java.nio.file.Files.createTempDirectory; -import static java.util.Arrays.asList; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.allOf; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.empty; -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; -import static org.testng.AssertJUnit.assertTrue; -import static org.testng.AssertJUnit.fail; - -public class ShowcaseAT { - - private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; - - private String title; - private GoodData gd; - private Project project; - private String fact; - private Attribute attr; - private Metric metric; - private ReportDefinition reportDefinition; - private Report report; - private String file; - private String projectToken; - private String warehouseToken; - private Warehouse warehouse; - private DataloadProcess process; - private ScheduledMail scheduledMail; - - @BeforeClass - public void setUp() throws Exception { - projectToken = getProperty("projectToken"); - warehouseToken = getProperty("warehouseToken"); - gd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); - title = "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); - } - - private static String getProperty(String name) { - final String value = System.getenv(name); - if (value != null) { - return value; - } - throw new IllegalArgumentException("Environment variable " + name + " not found! Available variables: " + - System.getenv().keySet()); - } - - @AfterClass - public void tearDown() throws Exception { - if (gd != null && project != null) { - gd.getProjectService().removeProject(project); - } - if (gd != null) { - gd.logout(); - } - } - - @Test - public void login() throws Exception { - final AccountService accountService = gd.getAccountService(); - final Account current = accountService.getCurrent(); - assertThat(current.getId(), is(notNullValue())); - } - - @Test(groups = "project", dependsOnMethods = "login") - public void createProject() throws Exception { - final Project p = new Project(title, projectToken); - p.setEnvironment(TESTING); - project = gd.getProjectService().createProject(p).get(); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void listProjects() throws Exception { - final ProjectService projectService = gd.getProjectService(); - - final Collection projects = projectService.getProjects(); - assertThat(projects, hasItem(hasSameIdAs(project))); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void listProjectUsers() throws Exception { - final ProjectService projectService = gd.getProjectService(); - - final List users = new ArrayList<>(); - List page; - while (!(page = projectService.listUsers(project, new PageRequest(users.size(), 100))).isEmpty()) { - users.addAll(page); - } - assertThat(users, not(empty())); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void listProjectRoles() throws Exception { - final ProjectService projectService = gd.getProjectService(); - - final Set roles = projectService.getRoles(project); - assertThat(roles, not(empty())); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void getProjectById() throws Exception { - final Project project = gd.getProjectService().getProjectById(this.project.getId()); - assertThat(project, hasSameIdAs(this.project)); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void getProjectByUri() throws Exception { - final Project project = gd.getProjectService().getProjectByUri(this.project.getUri()); - assertThat(project, hasSameIdAs(this.project)); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void validateProject() throws Exception { - final ProjectValidationResults results = gd.getProjectService().validateProject(project).get(); - assertThat(results, is(notNullValue())); - assertThat(results.getResults(), is(notNullValue())); - } - - @Test(groups = "project", dependsOnMethods = "createProject") - public void createProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); - checkFeatureFlag(featureFlag, true); - } - - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void listProjectFeatureFlags() throws Exception { - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); - - final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(project); - - assertThat(projectFeatureFlags, containsInAnyOrder( - new ProjectFeatureFlag("mostRecentFeatureFlag", true), - new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); - } - - @Test(groups = "project", dependsOnMethods = "listProjectFeatureFlags") - public void listAggregatedFeatureFlags() throws Exception { - final List flags = gd.getProjectService().listAggregatedFeatureFlags(project); - - assertThat(flags, containsInAnyOrder( - new FeatureFlag("mostRecentFeatureFlag", true), - new FeatureFlag(PROJECT_FEATURE_FLAG, true))); - } - - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void getProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); - checkFeatureFlag(featureFlag, true); - } - - @Test(groups = "project", dependsOnMethods = "getProjectFeatureFlag") - public void updateProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); - - // disable (update) feature flag - featureFlag.setEnabled(false); - final ProjectFeatureFlag disabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); - checkFeatureFlag(disabledFlag, false); - - // enable again - featureFlag.setEnabled(true); - final ProjectFeatureFlag enabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); - checkFeatureFlag(enabledFlag, true); - } - - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void deleteProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("temporaryFeatureFlag")); - - gd.getProjectService().deleteFeatureFlag(featureFlag); - - try { - gd.getProjectService().getFeatureFlag(project, featureFlag.getName()); - fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); - } catch (GoodDataRestException e) { - assertThat(e.getStatusCode(), is(HttpStatus.NOT_FOUND.value())); - } - } - - @Test(groups = "model", dependsOnGroups = "project") - public void createModel() throws Exception { - final ModelService modelService = gd.getModelService(); - - final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, - new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); - modelService.updateProjectModel(project, projectModelDiff).get(); - } - - @Test(groups = "md", dependsOnMethods = "createReport") - public void usedBy() { - final MetadataService metadataService = gd.getMetadataService(); - final String uri = metadataService.findUris(project, identifier("attr.person.department")).iterator().next(); - - final Collection usage = metadataService.usedBy(project, uri, false); - assertThat(usage, hasSize(5)); - } - - @Test(groups = "md", dependsOnMethods = "createReport") - public void usedByNotExists() { - final MetadataService metadataService = gd.getMetadataService(); - - assertThat(metadataService.usedBy(project, "/gdc/md/" + project.getId() + "/obj/1234567", false), empty()); - } - - @Test(groups = "md", dependsOnMethods = "createReport") - public void usedByBatch() { - final MetadataService metadataService = gd.getMetadataService(); - final Map uris = - metadataService.identifiersToUris(project, asList("attr.person.department", "attr.person.role")); - - final Collection usages = metadataService.usedBy(project, uris.values(), false); - assertThat(usages, hasSize(2)); - - final Iterator usageIterator = usages.iterator(); - - final Usage usage1 = usageIterator.next(); - assertTrue(uris.containsValue(usage1.getUri())); - assertThat(usage1.getUsedBy(), hasSize(2)); - - final Usage usage2 = usageIterator.next(); - assertTrue(uris.containsValue(usage2.getUri())); - assertThat(usage2.getUsedBy(), hasSize(5)); - } - - @Test(groups = "md", dependsOnGroups = "model") - public void getObjs() throws Exception { - final MetadataService md = gd.getMetadataService(); - - fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); - attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); - } - - @Test(groups = "md", dependsOnMethods = "getObjs") - public void updateObj() throws Exception { - final MetadataService md = gd.getMetadataService(); - - attr.setSummary("Changed person department"); - attr = md.updateObj(attr); - assertThat(attr, is(notNullValue())); - assertThat(attr.getSummary(), is("Changed person department")); - } - - @Test(groups = "md", dependsOnMethods = "getObjs") - public void createMetric() throws Exception { - final MetadataService md = gd.getMetadataService(); - metric = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); - } - - @Test(groups = "md", dependsOnMethods = "createMetric") - public void createReport() throws Exception { - final MetadataService md = gd.getMetadataService(); - - reportDefinition = md.createObj(project, GridReportDefinitionContent.create( - "Department avg shoe size", - asList("metricGroup"), - asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), - asList(new GridElement(metric.getUri(), "Avg shoe size")), - asList(new Filter("(SELECT [" + metric.getUri() + "]) >= 0")) - )); - report = md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); - } - - @Test(groups = "md", dependsOnMethods = "createReport") - public void createScheduledMail() throws Exception { - final MetadataService md = gd.getMetadataService(); - - scheduledMail = md.createObj(project, - (new ScheduledMail("Scheduled Mail Title", "Scheduled Mail Summary")) - .setRecurrency("0:0:0:1*12:0:0") - .setStartDate(new LocalDate(2012, 6, 5)) - .setTimeZone("America/Los_Angeles") - .addToAddress(getProperty("login")) - .addBccAddress(getProperty("login")) - .setSubject("Mail subject") - .setBody("Mail body") - .addReportAttachment(reportDefinition, - Collections.singletonMap("pageOrientation", "landscape"), - PDF, XLS)); - } - - @Test(groups = "md", dependsOnMethods = "createScheduledMail") - public void retrieveScheduledMail() throws Exception { - final MetadataService md = gd.getMetadataService(); - Collection result = md.find(project, ScheduledMail.class); - assertThat(result, hasSize(1)); - for (Entry e : result) { - ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); - } - } - - @Test(groups = "md", dependsOnMethods = "retrieveScheduledMail") - public void removeScheduledMail() throws Exception { - final MetadataService metadataService = gd.getMetadataService(); - metadataService.removeObj(scheduledMail); - } - - @Test(groups = "md", dependsOnMethods = "createModel") - public void identifiersToUri() { - final MetadataService metadataService = gd.getMetadataService(); - final Map idsToUris = - metadataService.identifiersToUris(project, asList("attr.person.department")); - assertThat(idsToUris.entrySet(), hasSize(1)); - final Attribute attribute = metadataService.getObjByUri(idsToUris.get("attr.person.department"), Attribute.class); - assertThat(attribute.getIdentifier(), is("attr.person.department")); - } - - @Test(groups = "datastore", dependsOnMethods = "login") - public void datastoreUpload() throws Exception { - DataStoreService dataStoreService = gd.getDataStoreService(); - - file = "/" + UUID.randomUUID().toString() + "/file.csv"; - dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); - } - - @Test(groups = "datastore", dependsOnMethods = "datastoreUpload") - public void datastoreDownload() throws Exception { - DataStoreService dataStoreService = gd.getDataStoreService(); - - final File file = File.createTempFile("file", ".txt"); - try (InputStream stream = dataStoreService.download(this.file)) { - file.deleteOnExit(); - IOUtils.copy(stream, new FileOutputStream(file)); - } finally { - file.delete(); - } - } - - @Test(groups = "datastore", dependsOnMethods = "datastoreDownload") - public void datastoreDelete() throws Exception { - DataStoreService dataStoreService = gd.getDataStoreService(); - dataStoreService.delete(this.file); - } - - @Test(groups = "dataset", dependsOnGroups = {"md", "datastore"}) - public void loadDataset() throws Exception { - final DatasetService datasetService = gd.getDatasetService(); - - final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); - datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/person.csv")).get(); - } - - @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) - public void loadDatasetBatch() throws Exception { - final DatasetService datasetService = gd.getDatasetService(); - - final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); - personManifest.setSource(getClass().getResourceAsStream("/person.csv")); - final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); - cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); - - datasetService.loadDatasets(project, personManifest, cityManifest).get(); - } - - @Test(groups = "dataset", dependsOnMethods = "loadDatasetBatch") - public void updateData() { - final DatasetService datasetService = gd.getDatasetService(); - datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); - } - - @Test(groups = "report", dependsOnGroups = "dataset") - public void exportReportDefinition() throws Exception { - final ReportService reportService = gd.getReportService(); - reportService.exportReport(reportDefinition, ReportExportFormat.CSV, System.out); - } - - @Test(dependsOnGroups = "report", dependsOnMethods = {"usedBy", "usedByBatch"}) - public void removeReport() throws Exception { - final MetadataService metadataService = gd.getMetadataService(); - metadataService.removeObj(report); - } - - @Test(dependsOnMethods = {"removeReport", "removeScheduledMail"}) - public void removeDefinition() throws Exception { - final MetadataService metadataService = gd.getMetadataService(); - metadataService.removeObj(reportDefinition); - } - - @Test(groups = "warehouse", dependsOnMethods = "login") - public void createWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - final Warehouse wh = new Warehouse(title, warehouseToken); - wh.setEnvironment(Environment.TESTING); - warehouse = warehouseService.createWarehouse(wh).get(); - String jdbc = warehouse.getJdbcConnectionString(); - } - - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") - public void getWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - final Warehouse warehouse = warehouseService.getWarehouseById(this.warehouse.getId()); - assertThat(warehouse, is(hasSameIdAs(warehouse))); - } - - @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") - public void listWarehouses() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - final Collection warehouses = warehouseService.listWarehouses(); - assertThat(warehouses, hasItem(hasSameIdAs(warehouse))); - } - - @Test(dependsOnGroups = "warehouse") - public void removeWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - warehouseService.removeWarehouse(warehouse); - } - - @Test(groups = "process", dependsOnGroups = "project") - public void createProcess() throws Exception { - final File dir = createTempDirectory("sdktest").toFile(); - try { - copy("sdktest.grf", dir); - copy("invalid.grf", dir); - copy("workspace.prm", dir); - process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); - final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); - - assertThat(schedule, notNullValue()); - assertThat(schedule.getExecutable(), is("sdktest.grf")); - - final PageableList collection = gd.getProcessService().listSchedules(project); - assertThat(collection, notNullValue()); - assertThat(collection, hasSize(1)); - assertThat(collection.getNextPage(), nullValue()); - - schedule.setState(ScheduleState.DISABLED); - assertThat(gd.getProcessService().updateSchedule(project, schedule).isEnabled(), is(false)); - - gd.getProcessService().removeSchedule(schedule); - } finally { - FileUtils.deleteDirectory(dir); - } - } - - public void copy(final String file, final File dir) throws IOException { - IOUtils.copy( - new ClassPathResource("/dataload/processes/testgraph/" + file, getClass()).getInputStream(), - new FileOutputStream(new File(dir, file)) - ); - } - - @Test(groups = "process", dependsOnMethods = "createProcess") - public void processes() { - final Collection processes = gd.getProcessService().listProcesses(project); - assertThat(processes, hasItem(hasSameIdAs(process))); - } - - @Test(groups = "process", dependsOnMethods = "createProcess") - public void executeProcess() throws Exception { - ProcessService processService = gd.getProcessService(); - ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "sdktest.grf")).get(); - final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - processService.getExecutionLog(executionDetail, outputStream); - assertThat(outputStream.toString("UTF-8"), allOf(containsString("infoooooooo"), containsString("waaaaaaaarn"), - containsString("errooooooor"), containsString("fataaaaaaal"))); - } - - @Test(groups = "process", dependsOnMethods = "createProcess", - expectedExceptions = ProcessExecutionException.class, expectedExceptionsMessageRegExp = "(?s)Can't execute.*") - public void failExecuteProcess() throws Exception { - ProcessService processService = gd.getProcessService(); - processService.executeProcess(new ProcessExecution(process, "invalid.grf")).get(); - } - - @Test(dependsOnGroups = "process") - public void removeProcess() throws Exception { - gd.getProcessService().removeProcess(process); - final Collection processes = gd.getProcessService().listProcesses(project); - assertThat(processes, not(hasItem(hasSameIdAs(process)))); - } - - - - private void checkFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { - assertThat(featureFlag, is(notNullValue())); - assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); - assertThat(featureFlag.getEnabled(), is(expectedValue)); - } - -} diff --git a/src/test/java/com/gooddata/account/AccountServiceAT.java b/src/test/java/com/gooddata/account/AccountServiceAT.java new file mode 100644 index 000000000..ac393316b --- /dev/null +++ b/src/test/java/com/gooddata/account/AccountServiceAT.java @@ -0,0 +1,23 @@ +package com.gooddata.account; + +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +/** + * Account acceptance tests. + */ +@Test(groups = "account") +public class AccountServiceAT extends AbstractGoodDataAT { + + @Test + public void login() throws Exception { + final AccountService accountService = gd.getAccountService(); + final Account current = accountService.getCurrent(); + assertThat(current.getId(), is(notNullValue())); + } + +} diff --git a/src/test/java/com/gooddata/ProcessIdMatcher.java b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java similarity index 89% rename from src/test/java/com/gooddata/ProcessIdMatcher.java rename to src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java index 0703c5386..9ca460576 100644 --- a/src/test/java/com/gooddata/ProcessIdMatcher.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java @@ -1,6 +1,5 @@ -package com.gooddata; +package com.gooddata.dataload.processes; -import com.gooddata.dataload.processes.DataloadProcess; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java new file mode 100644 index 000000000..e5d088725 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -0,0 +1,99 @@ +package com.gooddata.dataload.processes; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.collections.PageableList; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.springframework.core.io.ClassPathResource; +import org.testng.annotations.Test; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Collection; + +import static com.gooddata.dataload.processes.ProcessIdMatcher.hasSameIdAs; +import static java.nio.file.Files.createTempDirectory; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.containsString; +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; + +/** + * Dataload processes acceptance tests. + */ +public class ProcessServiceAT extends AbstractGoodDataAT { + + private DataloadProcess process; + + @Test(groups = "process", dependsOnGroups = "project") + public void createProcess() throws Exception { + final File dir = createTempDirectory("sdktest").toFile(); + try { + copy("sdktest.grf", dir); + copy("invalid.grf", dir); + copy("workspace.prm", dir); + process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); + final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); + + assertThat(schedule, notNullValue()); + assertThat(schedule.getExecutable(), is("sdktest.grf")); + + final PageableList collection = gd.getProcessService().listSchedules(project); + assertThat(collection, notNullValue()); + assertThat(collection, hasSize(1)); + assertThat(collection.getNextPage(), nullValue()); + + schedule.setState(ScheduleState.DISABLED); + assertThat(gd.getProcessService().updateSchedule(project, schedule).isEnabled(), is(false)); + + gd.getProcessService().removeSchedule(schedule); + } finally { + FileUtils.deleteDirectory(dir); + } + } + + public void copy(final String file, final File dir) throws IOException { + IOUtils.copy( + new ClassPathResource("/dataload/processes/testgraph/" + file, getClass()).getInputStream(), + new FileOutputStream(new File(dir, file)) + ); + } + + @Test(groups = "process", dependsOnMethods = "createProcess") + public void processes() { + final Collection processes = gd.getProcessService().listProcesses(project); + assertThat(processes, hasItem(hasSameIdAs(process))); + } + + @Test(groups = "process", dependsOnMethods = "createProcess") + public void executeProcess() throws Exception { + ProcessService processService = gd.getProcessService(); + ProcessExecutionDetail executionDetail = processService.executeProcess(new ProcessExecution(process, "sdktest.grf")).get(); + final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + processService.getExecutionLog(executionDetail, outputStream); + assertThat(outputStream.toString("UTF-8"), allOf(containsString("infoooooooo"), containsString("waaaaaaaarn"), + containsString("errooooooor"), containsString("fataaaaaaal"))); + } + + @Test(groups = "process", dependsOnMethods = "createProcess", + expectedExceptions = ProcessExecutionException.class, expectedExceptionsMessageRegExp = "(?s)Can't execute.*") + public void failExecuteProcess() throws Exception { + ProcessService processService = gd.getProcessService(); + processService.executeProcess(new ProcessExecution(process, "invalid.grf")).get(); + } + + @Test(dependsOnGroups = "process") + public void removeProcess() throws Exception { + gd.getProcessService().removeProcess(process); + final Collection processes = gd.getProcessService().listProcesses(project); + assertThat(processes, not(hasItem(hasSameIdAs(process)))); + } + +} diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java new file mode 100644 index 000000000..6afb34cdb --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -0,0 +1,38 @@ +package com.gooddata.dataset; + +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +/** + * Dataset acceptance tests. + */ +public class DatasetServiceAT extends AbstractGoodDataAT { + + @Test(groups = "dataset", dependsOnGroups = {"md", "datastore"}) + public void loadDataset() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + + final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); + datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/person.csv")).get(); + } + + @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) + public void loadDatasetBatch() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + + final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); + personManifest.setSource(getClass().getResourceAsStream("/person.csv")); + final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); + cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); + + datasetService.loadDatasets(project, personManifest, cityManifest).get(); + } + + @Test(groups = "dataset", dependsOnMethods = "loadDatasetBatch") + public void updateData() { + final DatasetService datasetService = gd.getDatasetService(); + datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); + } + + +} diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java new file mode 100644 index 000000000..972c09977 --- /dev/null +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -0,0 +1,46 @@ +package com.gooddata.gdc; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.gdc.DataStoreService; +import org.apache.commons.io.IOUtils; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.util.UUID; + +/** + * Data store acceptance test + */ +public class DatastoreServiceAT extends AbstractGoodDataAT { + + private String file; + + @Test(groups = "datastore", dependsOnGroups = "account") + public void datastoreUpload() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + + file = "/" + UUID.randomUUID().toString() + "/file.csv"; + dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); + } + + @Test(groups = "datastore", dependsOnMethods = "datastoreUpload") + public void datastoreDownload() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + + final File file = File.createTempFile("file", ".txt"); + try (InputStream stream = dataStoreService.download(this.file)) { + file.deleteOnExit(); + IOUtils.copy(stream, new FileOutputStream(file)); + } finally { + file.delete(); + } + } + + @Test(groups = "datastore", dependsOnMethods = "datastoreDownload") + public void datastoreDelete() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + dataStoreService.delete(this.file); + } +} diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java new file mode 100644 index 000000000..96207b92a --- /dev/null +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -0,0 +1,163 @@ +package com.gooddata.md; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.md.report.AttributeInGrid; +import com.gooddata.md.report.Filter; +import com.gooddata.md.report.GridElement; +import com.gooddata.md.report.GridReportDefinitionContent; +import com.gooddata.md.report.Report; +import org.joda.time.LocalDate; +import org.testng.annotations.Test; + +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; + +import static com.gooddata.md.Restriction.identifier; +import static com.gooddata.report.ReportExportFormat.PDF; +import static com.gooddata.report.ReportExportFormat.XLS; +import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.testng.AssertJUnit.assertTrue; + +/** + * Metadata acceptance tests. + */ +public class MetadataServiceAT extends AbstractGoodDataAT { + + @Test(groups = "md", dependsOnGroups = "model") + public void getObjs() throws Exception { + final MetadataService md = gd.getMetadataService(); + + fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize")); + attr = md.getObj(project, Attribute.class, identifier("attr.person.department")); + } + + @Test(groups = "md", dependsOnMethods = "getObjs") + public void updateObj() throws Exception { + final MetadataService md = gd.getMetadataService(); + + attr.setSummary("Changed person department"); + attr = md.updateObj(attr); + assertThat(attr, is(notNullValue())); + assertThat(attr.getSummary(), is("Changed person department")); + } + + @Test(groups = "md", dependsOnMethods = "getObjs") + public void createMetric() throws Exception { + final MetadataService md = gd.getMetadataService(); + metric = md.createObj(project, new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0")); + } + + @Test(groups = "md", dependsOnMethods = "createMetric") + public void createReport() throws Exception { + final MetadataService md = gd.getMetadataService(); + + reportDefinition = md.createObj(project, GridReportDefinitionContent.create( + "Department avg shoe size", + asList("metricGroup"), + asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), + asList(new GridElement(metric.getUri(), "Avg shoe size")), + asList(new Filter("(SELECT [" + metric.getUri() + "]) >= 0")) + )); + report = md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedBy() { + final MetadataService metadataService = gd.getMetadataService(); + final String uri = metadataService.findUris(project, identifier("attr.person.department")).iterator().next(); + + final Collection usage = metadataService.usedBy(project, uri, false); + assertThat(usage, hasSize(5)); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedByNotExists() { + final MetadataService metadataService = gd.getMetadataService(); + + assertThat(metadataService.usedBy(project, "/gdc/md/" + project.getId() + "/obj/1234567", false), empty()); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void usedByBatch() { + final MetadataService metadataService = gd.getMetadataService(); + final Map uris = + metadataService.identifiersToUris(project, asList("attr.person.department", "attr.person.role")); + + final Collection usages = metadataService.usedBy(project, uris.values(), false); + assertThat(usages, hasSize(2)); + + final Iterator usageIterator = usages.iterator(); + + final Usage usage1 = usageIterator.next(); + assertTrue(uris.containsValue(usage1.getUri())); + assertThat(usage1.getUsedBy(), hasSize(2)); + + final Usage usage2 = usageIterator.next(); + assertTrue(uris.containsValue(usage2.getUri())); + assertThat(usage2.getUsedBy(), hasSize(5)); + } + + @Test(groups = "md", dependsOnMethods = "createReport") + public void createScheduledMail() throws Exception { + final MetadataService md = gd.getMetadataService(); + + scheduledMail = md.createObj(project, + (new ScheduledMail("Scheduled Mail Title", "Scheduled Mail Summary")) + .setRecurrency("0:0:0:1*12:0:0") + .setStartDate(new LocalDate(2012, 6, 5)) + .setTimeZone("America/Los_Angeles") + .addToAddress(getProperty("login")) + .addBccAddress(getProperty("login")) + .setSubject("Mail subject") + .setBody("Mail body") + .addReportAttachment(reportDefinition, + Collections.singletonMap("pageOrientation", "landscape"), + PDF, XLS)); + } + + @Test(groups = "md", dependsOnMethods = "createScheduledMail") + public void retrieveScheduledMail() throws Exception { + final MetadataService md = gd.getMetadataService(); + Collection result = md.find(project, ScheduledMail.class); + assertThat(result, hasSize(1)); + for (Entry e : result) { + ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); + } + } + + @Test(groups = "md", dependsOnMethods = "retrieveScheduledMail") + public void removeScheduledMail() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(scheduledMail); + } + + @Test(groups = "md", dependsOnGroups = "model") + public void identifiersToUri() { + final MetadataService metadataService = gd.getMetadataService(); + final Map idsToUris = + metadataService.identifiersToUris(project, asList("attr.person.department")); + assertThat(idsToUris.entrySet(), hasSize(1)); + final Attribute attribute = metadataService.getObjByUri(idsToUris.get("attr.person.department"), Attribute.class); + assertThat(attribute.getIdentifier(), is("attr.person.department")); + } + + @Test(dependsOnGroups = "report", dependsOnMethods = {"usedBy", "usedByBatch"}) + public void removeReport() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(report); + } + + @Test(dependsOnMethods = {"removeReport", "removeScheduledMail"}) + public void removeDefinition() throws Exception { + final MetadataService metadataService = gd.getMetadataService(); + metadataService.removeObj(reportDefinition); + } + +} diff --git a/src/test/java/com/gooddata/md/report/ReportServiceAT.java b/src/test/java/com/gooddata/md/report/ReportServiceAT.java new file mode 100644 index 000000000..45f46c4fc --- /dev/null +++ b/src/test/java/com/gooddata/md/report/ReportServiceAT.java @@ -0,0 +1,19 @@ +package com.gooddata.md.report; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.report.ReportExportFormat; +import com.gooddata.report.ReportService; +import org.testng.annotations.Test; + +/** + * Report acceptance tests. + */ +public class ReportServiceAT extends AbstractGoodDataAT { + + @Test(groups = "report", dependsOnGroups = "dataset") + public void exportReportDefinition() throws Exception { + final ReportService reportService = gd.getReportService(); + reportService.exportReport(reportDefinition, ReportExportFormat.CSV, System.out); + } + +} diff --git a/src/test/java/com/gooddata/model/ModelServiceAT.java b/src/test/java/com/gooddata/model/ModelServiceAT.java new file mode 100644 index 000000000..911fbf708 --- /dev/null +++ b/src/test/java/com/gooddata/model/ModelServiceAT.java @@ -0,0 +1,23 @@ +package com.gooddata.model; + +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +import java.io.InputStreamReader; + +/** + * Project model acceptance test + */ +public class ModelServiceAT extends AbstractGoodDataAT { + + @Test(groups = "model", dependsOnGroups = "project") + public void createModel() throws Exception { + final ModelService modelService = gd.getModelService(); + + final ModelDiff projectModelDiff = modelService.getProjectModelDiff(project, + new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); + modelService.updateProjectModel(project, projectModelDiff).get(); + } + + +} diff --git a/src/test/java/com/gooddata/ProjectIdMatcher.java b/src/test/java/com/gooddata/project/ProjectIdMatcher.java similarity index 87% rename from src/test/java/com/gooddata/ProjectIdMatcher.java rename to src/test/java/com/gooddata/project/ProjectIdMatcher.java index 21d3203c5..9205efc7a 100644 --- a/src/test/java/com/gooddata/ProjectIdMatcher.java +++ b/src/test/java/com/gooddata/project/ProjectIdMatcher.java @@ -1,7 +1,5 @@ -package com.gooddata; +package com.gooddata.project; -import com.gooddata.project.Project; -import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java new file mode 100644 index 000000000..c4b8abe8a --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -0,0 +1,172 @@ +package com.gooddata.project; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.GoodDataRestException; +import com.gooddata.collections.PageRequest; +import com.gooddata.gdc.FeatureFlag; +import org.springframework.http.HttpStatus; +import org.testng.annotations.AfterClass; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import static com.gooddata.project.ProjectEnvironment.TESTING; +import static com.gooddata.project.ProjectIdMatcher.hasSameIdAs; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.testng.AssertJUnit.fail; + +/** + * Project acceptance tests. + */ +public class ProjectServiceAT extends AbstractGoodDataAT { + + private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; + + private final String projectToken; + + public ProjectServiceAT() { + projectToken = getProperty("projectToken"); + } + + @AfterClass + public void tearDown() throws Exception { + if (gd != null && project != null) { + gd.getProjectService().removeProject(project); + } + } + + @Test(groups = "project", dependsOnGroups = "account") + public void createProject() throws Exception { + final Project p = new Project(title, projectToken); + p.setEnvironment(TESTING); + project = gd.getProjectService().createProject(p).get(); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjects() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final Collection projects = projectService.getProjects(); + assertThat(projects, hasItem(hasSameIdAs(project))); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjectUsers() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final List users = new ArrayList<>(); + List page; + while (!(page = projectService.listUsers(project, new PageRequest(users.size(), 100))).isEmpty()) { + users.addAll(page); + } + assertThat(users, not(empty())); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void listProjectRoles() throws Exception { + final ProjectService projectService = gd.getProjectService(); + + final Set roles = projectService.getRoles(project); + assertThat(roles, not(empty())); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void getProjectById() throws Exception { + final Project project = gd.getProjectService().getProjectById(this.project.getId()); + assertThat(project, hasSameIdAs(this.project)); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void getProjectByUri() throws Exception { + final Project project = gd.getProjectService().getProjectByUri(this.project.getUri()); + assertThat(project, hasSameIdAs(this.project)); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void validateProject() throws Exception { + final ProjectValidationResults results = gd.getProjectService().validateProject(project).get(); + assertThat(results, is(notNullValue())); + assertThat(results.getResults(), is(notNullValue())); + } + + @Test(groups = "project", dependsOnMethods = "createProject") + public void createProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); + checkFeatureFlag(featureFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void listProjectFeatureFlags() throws Exception { + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); + + final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(project); + + assertThat(projectFeatureFlags, containsInAnyOrder( + new ProjectFeatureFlag("mostRecentFeatureFlag", true), + new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + + @Test(groups = "project", dependsOnMethods = "listProjectFeatureFlags") + public void listAggregatedFeatureFlags() throws Exception { + final List flags = gd.getProjectService().listAggregatedFeatureFlags(project); + + assertThat(flags, containsInAnyOrder( + new FeatureFlag("mostRecentFeatureFlag", true), + new FeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void getProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); + checkFeatureFlag(featureFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "getProjectFeatureFlag") + public void updateProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); + + // disable (update) feature flag + featureFlag.setEnabled(false); + final ProjectFeatureFlag disabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); + checkFeatureFlag(disabledFlag, false); + + // enable again + featureFlag.setEnabled(true); + final ProjectFeatureFlag enabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); + checkFeatureFlag(enabledFlag, true); + } + + @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") + public void deleteProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("temporaryFeatureFlag")); + + gd.getProjectService().deleteFeatureFlag(featureFlag); + + try { + gd.getProjectService().getFeatureFlag(project, featureFlag.getName()); + fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); + } catch (GoodDataRestException e) { + assertThat(e.getStatusCode(), is(HttpStatus.NOT_FOUND.value())); + } + } + + private void checkFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); + assertThat(featureFlag.getEnabled(), is(expectedValue)); + } + +} diff --git a/src/test/java/com/gooddata/WarehouseIdMatcher.java b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java similarity index 91% rename from src/test/java/com/gooddata/WarehouseIdMatcher.java rename to src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java index bfa35841d..6bf558e41 100644 --- a/src/test/java/com/gooddata/WarehouseIdMatcher.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java @@ -1,6 +1,5 @@ -package com.gooddata; +package com.gooddata.warehouse; -import com.gooddata.warehouse.Warehouse; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java new file mode 100644 index 000000000..3a8c936c3 --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -0,0 +1,54 @@ +package com.gooddata.warehouse; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.project.Environment; +import org.testng.annotations.Test; + +import java.util.Collection; + +import static com.gooddata.warehouse.WarehouseIdMatcher.hasSameIdAs; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.core.IsCollectionContaining.hasItem; + +/** + * Warehouse acceptance tests + */ +public class WarehouseServiceAT extends AbstractGoodDataAT { + + private final String warehouseToken; + private Warehouse warehouse; + + public WarehouseServiceAT() { + warehouseToken = getProperty("warehouseToken"); + } + + @Test(groups = "warehouse", dependsOnGroups = "account") + public void createWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + final Warehouse wh = new Warehouse(title, warehouseToken); + wh.setEnvironment(Environment.TESTING); + warehouse = warehouseService.createWarehouse(wh).get(); + String jdbc = warehouse.getJdbcConnectionString(); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void getWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + final Warehouse warehouse = warehouseService.getWarehouseById(this.warehouse.getId()); + assertThat(warehouse, is(hasSameIdAs(warehouse))); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void listWarehouses() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + final Collection warehouses = warehouseService.listWarehouses(); + assertThat(warehouses, hasItem(hasSameIdAs(warehouse))); + } + + @Test(dependsOnGroups = "warehouse") + public void removeWarehouse() throws Exception { + final WarehouseService warehouseService = gd.getWarehouseService(); + warehouseService.removeWarehouse(warehouse); + } +} From d70213202ba25892505b85963b5ec1a181688be9 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 15 Jul 2015 17:54:48 +0200 Subject: [PATCH 0214/1191] Fix ProjectServiceAT.listAggregatedFeatureFlags --- src/test/java/com/gooddata/project/ProjectServiceAT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index c4b8abe8a..e80614372 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -16,8 +16,8 @@ import static com.gooddata.project.ProjectEnvironment.TESTING; import static com.gooddata.project.ProjectIdMatcher.hasSameIdAs; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; @@ -111,7 +111,7 @@ public void listProjectFeatureFlags() throws Exception { final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(project); - assertThat(projectFeatureFlags, containsInAnyOrder( + assertThat(projectFeatureFlags, hasItems( new ProjectFeatureFlag("mostRecentFeatureFlag", true), new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); } @@ -120,7 +120,7 @@ public void listProjectFeatureFlags() throws Exception { public void listAggregatedFeatureFlags() throws Exception { final List flags = gd.getProjectService().listAggregatedFeatureFlags(project); - assertThat(flags, containsInAnyOrder( + assertThat(flags, hasItems( new FeatureFlag("mostRecentFeatureFlag", true), new FeatureFlag(PROJECT_FEATURE_FLAG, true))); } From 3bba0032cbfebdd032f13e0e3be9ac220d2dd9fd Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 29 Jul 2015 15:34:29 +0200 Subject: [PATCH 0215/1191] fix update model task polling --- .../com/gooddata/dataset/DatasetService.java | 5 ++-- .../gooddata/dataset/DatasetServiceIT.java | 23 ++++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index cf353c547..188fe989c 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -347,12 +347,11 @@ public void handlePollResult(final TaskState pollResult) { @Override public boolean isFinished(final ClientHttpResponse response) throws IOException { - if (!super.isFinished(response)) { - return false; - } final TaskState taskState = extractData(response, TaskState.class); if (taskState.isSuccess()) { return true; + } else if (!taskState.isFinished()) { + return false; } throw new GoodDataException(errorMessage + ": " + taskState.getMessage()); } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 944ab5a30..e3918214d 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -4,14 +4,13 @@ import com.gooddata.GoodDataException; import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.ByteArrayInputStream; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.util.Collection; import static com.gooddata.util.ResourceUtils.readFromResource; @@ -227,7 +226,7 @@ public void shouldUpdateProjectData() throws IOException { .havingMethodEqualTo("GET") .havingPathEqualTo(STATUS_URI) .respond() - .withStatus(202) + .withStatus(200) // REST API returns HTTP 200 when task is in RUNNING state :( .withBody(MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) @@ -237,6 +236,24 @@ public void shouldUpdateProjectData() throws IOException { gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); } + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailUpdateProjectDataServerError() throws IOException { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo("/gdc/md/PROJECT_ID/dml/manage") + .respond() + .withStatus(202) + .withBody("{\"uri\" : \"" + STATUS_URI + "\"}"); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(STATUS_URI) + .respond() + .withStatus(500) + ; + + gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); + } + @Test(expectedExceptions = GoodDataException.class) public void shouldFailUpdateProjectData() throws IOException { onRequest() From 4d176a2e5e9b654939b261eddbd922a4e8e3ce36 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 21 Jul 2015 18:16:21 +0200 Subject: [PATCH 0216/1191] chg: make response error handler public --- src/main/java/com/gooddata/GoodData.java | 1 + .../java/com/gooddata/{ => util}/ResponseErrorHandler.java | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) rename src/main/java/com/gooddata/{ => util}/ResponseErrorHandler.java (88%) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 24d9d75c7..7e2adc89b 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -6,6 +6,7 @@ import com.gooddata.account.AccountService; import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.util.ResponseErrorHandler; import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; diff --git a/src/main/java/com/gooddata/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java similarity index 88% rename from src/main/java/com/gooddata/ResponseErrorHandler.java rename to src/main/java/com/gooddata/util/ResponseErrorHandler.java index d2e189f06..6415b3a5e 100644 --- a/src/main/java/com/gooddata/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -1,8 +1,9 @@ /* * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. */ -package com.gooddata; +package com.gooddata.util; +import com.gooddata.GoodDataRestException; import com.gooddata.gdc.GdcError; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.HttpMessageConverter; @@ -19,11 +20,11 @@ /** * A response error handler able to extract GoodData error response */ -class ResponseErrorHandler extends DefaultResponseErrorHandler { +public class ResponseErrorHandler extends DefaultResponseErrorHandler { private HttpMessageConverterExtractor gdcErrorExtractor; - ResponseErrorHandler(List> messageConverters) { + public ResponseErrorHandler(List> messageConverters) { gdcErrorExtractor = new HttpMessageConverterExtractor<>(GdcError.class, noNullElements(messageConverters, "messageConverters")); } From 4b4a6e6a15d499bd267bffef9c07fdaf4fa4b77c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 29 Jul 2015 16:13:23 +0200 Subject: [PATCH 0217/1191] [maven-release-plugin] prepare release gooddata-java-0.18.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f78c5265d..226b4d0a3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.17.1-SNAPSHOT + 0.18.0 ${project.artifactId} GoodData Java SDK From a200002e4bbf5eceb818fbca63f31f24859d7a12 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 29 Jul 2015 16:13:24 +0200 Subject: [PATCH 0218/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 226b4d0a3..da11b3bb9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.18.0 + 0.18.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 318b262e6e982bd857ca57949cebbdce81865807 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 21 Jul 2015 18:21:17 +0200 Subject: [PATCH 0219/1191] change paging - make offset string - remove count property (it is not usable at all) - add links to pagable list - enable pagable list serialization --- .../com/gooddata/collections/PageRequest.java | 40 ++++++++++-- .../gooddata/collections/PageableList.java | 46 +++++++++++++- .../collections/PageableListDeserializer.java | 23 +++++-- .../collections/PageableListSerializer.java | 61 +++++++++++++++++++ .../java/com/gooddata/collections/Paging.java | 30 +++++---- .../processes/SchedulesDeserializer.java | 3 +- .../gooddata/project/UsersDeserializer.java | 3 +- .../collections/PageableListTest.java | 2 +- .../com/gooddata/collections/PagingTest.java | 25 ++++++-- .../collections/paging_only_next.json | 3 + 10 files changed, 206 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/gooddata/collections/PageableListSerializer.java create mode 100644 src/test/resources/collections/paging_only_next.json diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index 491c32f72..2b4012a46 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -21,8 +21,7 @@ public class PageRequest implements Page { * @param limit maximal number of returned elements (on a page) */ public PageRequest(final int offset, final int limit) { - this.offset = String.valueOf(offset); - this.limit = limit; + this(String.valueOf(offset), limit); } /** @@ -36,11 +35,40 @@ public PageRequest(final String offset, final int limit) { this.limit = limit; } + /** + * Creates new page definition with limit and no offset (usually for the first page) + * @param limit maximal number of returned elements (on a page) + */ + public PageRequest(final int limit) { + this(null, limit); + } + @Override public URI getPageUri(final UriComponentsBuilder uriBuilder) { - return notNull(uriBuilder, "uriBuilder") - .queryParam("offset", offset) - .queryParam("limit", limit) - .build().toUri(); + notNull(uriBuilder, "uriBuilder"); + if (offset != null) { + uriBuilder.queryParam("offset", offset); + } + uriBuilder.queryParam("limit", limit); + return uriBuilder.build().toUri(); + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final PageRequest that = (PageRequest) o; + + if (limit != that.limit) return false; + return !(offset != null ? !offset.equals(that.offset) : that.offset != null); + + } + + @Override + public int hashCode() { + int result = offset != null ? offset.hashCode() : 0; + result = 31 * result + limit; + return result; } } diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java index ad0900ec8..03b19eed6 100644 --- a/src/main/java/com/gooddata/collections/PageableList.java +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -5,6 +5,7 @@ import java.util.Iterator; import java.util.List; import java.util.ListIterator; +import java.util.Map; import static com.gooddata.util.Validate.notNull; @@ -15,8 +16,13 @@ */ public class PageableList implements List { + static final String ITEMS_NODE = "items"; + static final String LINKS_NODE = "links"; + static final String PAGING_NODE = "paging"; + private final List items; private final Paging paging; + private final Map links; /** * Creates empty list with no next page. @@ -29,11 +35,23 @@ public PageableList() { * Creates list wrapping provided items and next page. * * @param items to be wrapped - * @param paging page description + * @param paging page description, might be null */ public PageableList(final List items, final Paging paging) { + this(items, paging, null); + } + + /** + * Creates list wrapping provided items, next page and links. + * + * @param items to be wrapped + * @param paging page description, might be null + * @param links links, might be null + */ + public PageableList(final List items, final Paging paging, final Map links) { this.items = notNull(items, "items"); this.paging = paging; + this.links = links; } /** @@ -45,6 +63,32 @@ public Page getNextPage() { return paging == null ? null : paging.getNext(); } + /** + * Signals whether there are more subsequent pages or the last page has been reached + * @return true if there are more results to come + */ + public boolean hasNextPage() { + return getNextPage() != null; + } + + /** + * Returns map of links. + * + * @return map of links, might be null + */ + public Map getLinks() { + return links; + } + + /** + * Returns description of the current collection page. + * + * @return current collection page, might be null + */ + public Paging getPaging() { + return paging; + } + @Override public int size() { return items.size(); diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index 2bbc2a24b..dba36960e 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -6,21 +6,28 @@ import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.type.TypeReference; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import static com.gooddata.collections.PageableList.ITEMS_NODE; +import static com.gooddata.collections.PageableList.LINKS_NODE; +import static com.gooddata.collections.PageableList.PAGING_NODE; import static com.gooddata.util.Validate.notNull; public abstract class PageableListDeserializer extends JsonDeserializer { + private static final TypeReference> LINKS_TYPE = new TypeReference>() {}; + private final Class elementType; private final String collectionName; protected PageableListDeserializer(final Class elementType) { - this(elementType, "items"); + this(elementType, ITEMS_NODE); } protected PageableListDeserializer(final Class elementType, final String collectionName) { @@ -28,7 +35,7 @@ protected PageableListDeserializer(final Class elementType, final String coll this.collectionName = notNull(collectionName, "collectionName"); } - protected abstract T createList(final List items, final Paging paging); + protected abstract T createList(final List items, final Paging paging, final Map links); @Override public T deserialize(final JsonParser jp, final DeserializationContext context) throws IOException, JsonProcessingException { @@ -41,9 +48,17 @@ public T deserialize(final JsonParser jp, final DeserializationContext context) // we do not want to create custom object mapper with different configuration than the global one has final ObjectMapper objectMapper = (ObjectMapper) jp.getCodec(); - final JsonNode pagingNode = root.get("paging"); + final JsonNode pagingNode = root.get(PAGING_NODE); final Paging paging = pagingNode == null ? null : objectMapper.readValue(pagingNode, Paging.class); + final JsonNode linksNode = root.get(LINKS_NODE); + final Map links; + if (linksNode != null) { + links = objectMapper.readValue(linksNode, LINKS_TYPE); + } else { + links = null; + } + final JsonNode itemsNode = root.get(collectionName); final List items; if (itemsNode == null) { @@ -54,6 +69,6 @@ public T deserialize(final JsonParser jp, final DeserializationContext context) items.add(objectMapper.readValue(item, elementType)); } } - return createList(items, paging); + return createList(items, paging, links); } } diff --git a/src/main/java/com/gooddata/collections/PageableListSerializer.java b/src/main/java/com/gooddata/collections/PageableListSerializer.java new file mode 100644 index 000000000..e459e220f --- /dev/null +++ b/src/main/java/com/gooddata/collections/PageableListSerializer.java @@ -0,0 +1,61 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.collections; + +import org.codehaus.jackson.JsonGenerator; +import org.codehaus.jackson.ObjectCodec; +import org.codehaus.jackson.map.JsonSerializer; +import org.codehaus.jackson.map.SerializerProvider; + +import java.io.IOException; + +import static com.gooddata.collections.PageableList.ITEMS_NODE; +import static com.gooddata.collections.PageableList.LINKS_NODE; +import static com.gooddata.collections.PageableList.PAGING_NODE; +import static com.gooddata.util.Validate.notEmpty; + +/** + * Serializer {@link PageableList} objects into JSON. + */ +public abstract class PageableListSerializer extends JsonSerializer> { + + private final String rootNode; + + public PageableListSerializer(String rootNode) { + this.rootNode = notEmpty(rootNode, "rootNode"); + } + + @Override + public void serialize(final PageableList value, final JsonGenerator jgen, final SerializerProvider provider) throws IOException { + jgen.writeStartObject(); + jgen.writeFieldName(rootNode); + + jgen.writeStartObject(); + jgen.writeFieldName(ITEMS_NODE); + + jgen.writeStartArray(); + final ObjectCodec codec = jgen.getCodec(); + for (Object item: value) { + codec.writeValue(jgen, item); + } + jgen.writeEndArray(); + + writeObjectOrEmpty(jgen, codec, PAGING_NODE, value.getPaging()); + + writeObjectOrEmpty(jgen, codec, LINKS_NODE, value.getLinks()); + + jgen.writeEndObject(); + jgen.writeEndObject(); + } + + private void writeObjectOrEmpty(final JsonGenerator jgen, final ObjectCodec codec, final String name, final Object object) throws IOException { + jgen.writeFieldName(name); + if (object != null) { + codec.writeValue(jgen, object); + } else { + jgen.writeStartObject(); + jgen.writeEndObject(); + } + } +} diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index e63152c1b..782fb21f2 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -11,7 +11,7 @@ import org.codehaus.jackson.map.annotate.JsonSerialize; /** - * Description of the current collection page. Deserialization only. + * Description of the current collection page. */ @JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NONE) @JsonTypeName("paging") @@ -19,28 +19,36 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Paging { - private final int offset; - private final int count; + private final String offset; private final UriPage next; @JsonCreator - public Paging(@JsonProperty("offset") final int offset, - @JsonProperty("count") final int count, - @JsonProperty("next") final String next) { + public Paging(@JsonProperty("offset") final String offset, @JsonProperty("next") final String next) { this.offset = offset; - this.count = count; this.next = next == null ? null : new UriPage(next); } - public int getOffset() { - return offset; + @Deprecated + public Paging(final int offset, final int count, final String next) { + this(Integer.toString(offset), next); + } + + public Paging(final String next) { + this(null, next); } - public int getCount() { - return count; + @JsonIgnore + public String getOffset() { + return offset; } + @JsonIgnore public UriPage getNext() { return next; } + + @JsonProperty("next") + public String getNextUri() { + return next == null ? null : next.getPageUri(null).toString(); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java index d981acd07..b6d9f0e6f 100644 --- a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java +++ b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java @@ -4,6 +4,7 @@ import com.gooddata.collections.Paging; import java.util.List; +import java.util.Map; class SchedulesDeserializer extends PageableListDeserializer { @@ -12,7 +13,7 @@ protected SchedulesDeserializer() { } @Override - protected Schedules createList(final List items, final Paging paging) { + protected Schedules createList(final List items, final Paging paging, final Map links) { return new Schedules(items, paging); } } diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/src/main/java/com/gooddata/project/UsersDeserializer.java index a4efcb3b2..855fe3b57 100644 --- a/src/main/java/com/gooddata/project/UsersDeserializer.java +++ b/src/main/java/com/gooddata/project/UsersDeserializer.java @@ -5,6 +5,7 @@ import com.gooddata.dataload.processes.Schedule; import java.util.List; +import java.util.Map; class UsersDeserializer extends PageableListDeserializer { @@ -13,7 +14,7 @@ protected UsersDeserializer() { } @Override - protected Users createList(final List items, final Paging paging) { + protected Users createList(final List items, final Paging paging, final Map links) { return new Users(items, paging); } } diff --git a/src/test/java/com/gooddata/collections/PageableListTest.java b/src/test/java/com/gooddata/collections/PageableListTest.java index 87b618433..ac9b278a6 100644 --- a/src/test/java/com/gooddata/collections/PageableListTest.java +++ b/src/test/java/com/gooddata/collections/PageableListTest.java @@ -31,7 +31,7 @@ public void testCollection() { @Test public void testCollectionWithPaging() { - final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), new Paging(1, 2, "next")); + final PageableList collection = new PageableList<>(Arrays.asList(1, 2, 3), new Paging("1", "next")); assertThat(collection, notNullValue()); assertThat(collection, hasSize(3)); assertThat(collection.getNextPage(), notNullValue()); diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java index c7dc5dbf5..7c2b09ac1 100644 --- a/src/test/java/com/gooddata/collections/PagingTest.java +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -1,11 +1,11 @@ package com.gooddata.collections; import org.codehaus.jackson.map.ObjectMapper; -import org.hamcrest.CoreMatchers; import org.testng.annotations.Test; import java.io.InputStream; +import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,8 +18,7 @@ public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/collections/paging.json"); final Paging paging = new ObjectMapper().readValue(stream, Paging.class); - assertThat(paging.getOffset(), is(0)); - assertThat(paging.getCount(), is(1)); + assertThat(paging.getOffset(), is("0")); assertThat(paging.getNext(), notNullValue()); assertThat(paging.getNext().getPageUri(null).toString(), is("next")); } @@ -29,8 +28,24 @@ public void testDeserializationNullNext() throws Exception { final InputStream stream = getClass().getResourceAsStream("/collections/paging_no_next.json"); final Paging paging = new ObjectMapper().readValue(stream, Paging.class); - assertThat(paging.getOffset(), is(0)); - assertThat(paging.getCount(), is(1)); + assertThat(paging.getOffset(), is("0")); assertThat(paging.getNext(), nullValue()); } + + @Test + public void testDeserializationWithNextOnly() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/collections/paging_only_next.json"); + final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + + assertThat(paging.getOffset(), is(nullValue())); + assertThat(paging.getNext(), notNullValue()); + assertThat(paging.getNext().getPageUri(null).toString(), is("/nextUri?offset=17")); + } + + @Test + public void testSerialization() throws Exception { + final Paging paging = new Paging("/nextUri?offset=17"); + assertThat(paging, serializesToJson("/collections/paging_only_next.json")); + } + } \ No newline at end of file diff --git a/src/test/resources/collections/paging_only_next.json b/src/test/resources/collections/paging_only_next.json new file mode 100644 index 000000000..c3827718a --- /dev/null +++ b/src/test/resources/collections/paging_only_next.json @@ -0,0 +1,3 @@ +{ + "next": "/nextUri?offset=17" +} \ No newline at end of file From 71fe188f37c27d3363f2b31f1d77a909f0161159 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 21 Jul 2015 18:21:51 +0200 Subject: [PATCH 0220/1191] make warehouse serializable and pagable --- .../com/gooddata/warehouse/Warehouse.java | 6 +- .../gooddata/warehouse/WarehouseService.java | 38 +++++++++--- .../com/gooddata/warehouse/Warehouses.java | 30 +++++---- .../warehouse/WarehousesDeserializer.java | 22 +++++++ .../warehouse/WarehousesSerializer.java | 19 ++++++ .../java/com/gooddata/util/ResourceUtils.java | 4 ++ .../warehouse/WarehouseServiceAT.java | 62 ++++++++++++++++--- .../warehouse/WarehouseServiceIT.java | 5 +- .../com/gooddata/warehouse/WarehouseTest.java | 45 +++++++++++--- .../gooddata/warehouse/WarehousesTest.java | 33 +++++++--- .../resources/warehouse/warehouses-empty.json | 7 +++ src/test/resources/warehouse/warehouses.json | 1 + 12 files changed, 221 insertions(+), 51 deletions(-) create mode 100644 src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehousesSerializer.java create mode 100644 src/test/resources/warehouse/warehouses-empty.json diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index d17151035..66b5edeb9 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -63,7 +63,7 @@ public Warehouse(String title, String authToken, String description) { } @JsonCreator - Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, + public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, @JsonProperty("description") String description, @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, @@ -143,6 +143,10 @@ public void setEnvironment(final Environment environment) { setEnvironment(environment.name()); } + public Map getLinks() { + return links; + } + /** * Get jdbc connection string. Works only on Warehouse loaded from API (using WarehouseService). * @return jdbc connection string diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index bb2850ff9..71d58b8d4 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -3,20 +3,22 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; -import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.PollResult; +import com.gooddata.collections.Page; +import com.gooddata.collections.PageableList; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; -import java.util.Collection; +import java.net.URI; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; -import static java.util.Collections.emptyList; /** * Provide access to warehouse API - create, update, list and delete warehouses. @@ -143,16 +145,32 @@ private static String uriFromId(String id) { /** * Lists Warehouses. Returns empty list in case there are no warehouses. + * Returns only first page if there's more instances than page limit. Use {@link #listWarehouses(Page)} to get other pages. + * + * @return first page of list of warehouse instances or empty list + */ + public PageableList listWarehouses() { + return listWarehouses(URI.create(Warehouses.URI)); + } + + /** + * Lists Warehouses. Returns empty list in case there are no warehouses. + * Returns requested page (by page limit and offset). Use {@link #listWarehouses()} to get first page with default setting. * - * @return collection of instances or empty list + * @return requested page of list of instances or empty list */ - public Collection listWarehouses() { + public PageableList listWarehouses(Page page) { + notNull(page, "page"); + return listWarehouses(page.getPageUri(UriComponentsBuilder.fromUriString(Warehouses.URI))); + } + + private PageableList listWarehouses(final URI uri) { try { - final Warehouses result = restTemplate.getForObject(Warehouses.URI, Warehouses.class); - if (result == null || result.getItems() == null) { - return emptyList(); + final Warehouses result = restTemplate.getForObject(uri, Warehouses.class); + if (result == null) { + return new PageableList<>(); } - return setWarehouseConnection(result.getItems()); + return setWarehouseConnection(result); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to list Warehouses", e); } @@ -183,7 +201,7 @@ private Warehouse setWarehouseConnection(Warehouse warehouse) { return warehouse; } - private Collection setWarehouseConnection(Collection warehouses) { + private PageableList setWarehouseConnection(PageableList warehouses) { notNull(warehouses, "warehouses"); for (Warehouse warehouse : warehouses) { setWarehouseConnection(warehouse); diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index cbf797d73..af7464a5f 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -1,31 +1,37 @@ package com.gooddata.warehouse; -import org.codehaus.jackson.annotate.JsonCreator; +import com.gooddata.collections.PageableList; +import com.gooddata.collections.PageableListSerializer; +import com.gooddata.collections.Paging; import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; import java.util.List; +import java.util.Map; /** - * List of warehouses. Deserialization only. + * List of warehouses. */ +@JsonDeserialize(using = WarehousesDeserializer.class) @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("instances") +@JsonTypeName(Warehouses.ROOT_NODE) @JsonIgnoreProperties(ignoreUnknown = true) -class Warehouses { +@JsonSerialize(using = WarehousesSerializer.class) +public class Warehouses extends PageableList { - static final String URI = "/gdc/datawarehouse/instances"; + public static final String URI = "/gdc/datawarehouse/instances"; - private final List items; + static final String ROOT_NODE = "instances"; - @JsonCreator - private Warehouses(@JsonProperty("items") List items) { - this.items = items; + public Warehouses(final List items, final Paging paging) { + super(items, paging); } - List getItems() { - return items; + public Warehouses(final List items, final Paging paging, final Map links) { + super(items, paging, links); } + } diff --git a/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java new file mode 100644 index 000000000..0ac12c6d1 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.warehouse; + +import com.gooddata.collections.PageableListDeserializer; +import com.gooddata.collections.Paging; + +import java.util.List; +import java.util.Map; + +class WarehousesDeserializer extends PageableListDeserializer { + + protected WarehousesDeserializer() { + super(Warehouse.class); + } + + @Override + protected Warehouses createList(final List items, final Paging paging, final Map links) { + return new Warehouses(items, paging, links); + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java b/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java new file mode 100644 index 000000000..bd8788f5a --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.warehouse; + +import com.gooddata.collections.PageableListSerializer; + +import static com.gooddata.warehouse.Warehouses.ROOT_NODE; + +/** + * Serializer of Warehouses object into JSON. + */ +class WarehousesSerializer extends PageableListSerializer { + + public WarehousesSerializer() { + super(ROOT_NODE); + } + +} diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java index b94ad00b7..63792c9fc 100644 --- a/src/test/java/com/gooddata/util/ResourceUtils.java +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -19,6 +19,10 @@ public class ResourceUtils { public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + public static T readObjectFromResource(String resourcePath, Class objectClass) { + return readObjectFromResource(ResourceUtils.class, resourcePath, objectClass); + } + public static T readObjectFromResource(Class testClass, String resourcePath, Class objectClass) { notNull(objectClass, "objectClass"); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index 3a8c936c3..f9bd67167 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -1,13 +1,18 @@ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataAT; +import com.gooddata.collections.Page; +import com.gooddata.collections.PageRequest; +import com.gooddata.collections.PageableList; import com.gooddata.project.Environment; +import org.testng.annotations.AfterClass; import org.testng.annotations.Test; import java.util.Collection; import static com.gooddata.warehouse.WarehouseIdMatcher.hasSameIdAs; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.core.IsCollectionContaining.hasItem; @@ -17,38 +22,79 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private final String warehouseToken; + private final WarehouseService service; + private Warehouse warehouse; + private Warehouse warehouse2; public WarehouseServiceAT() { warehouseToken = getProperty("warehouseToken"); + service = gd.getWarehouseService(); } @Test(groups = "warehouse", dependsOnGroups = "account") public void createWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); final Warehouse wh = new Warehouse(title, warehouseToken); wh.setEnvironment(Environment.TESTING); - warehouse = warehouseService.createWarehouse(wh).get(); + warehouse = service.createWarehouse(wh).get(); String jdbc = warehouse.getJdbcConnectionString(); } @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void getWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - final Warehouse warehouse = warehouseService.getWarehouseById(this.warehouse.getId()); + final Warehouse warehouse = service.getWarehouseById(this.warehouse.getId()); assertThat(warehouse, is(hasSameIdAs(warehouse))); } @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void listWarehouses() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - final Collection warehouses = warehouseService.listWarehouses(); + final Collection warehouses = service.listWarehouses(); assertThat(warehouses, hasItem(hasSameIdAs(warehouse))); } + @Test(groups = "warehouse", dependsOnMethods = {"createWarehouse", "listWarehouses"}) + public void shouldPageList() throws Exception { + final String title = this.title + " second"; + final Warehouse wh = new Warehouse(title, warehouseToken); + wh.setEnvironment(Environment.TESTING); + warehouse2 = service.createWarehouse(wh).get(); + + final PageableList firstPage = service.listWarehouses(new PageRequest(1)); + assertThat(firstPage, hasSize(1)); + + PageableList page = service.listWarehouses(firstPage.getNextPage()); + assertThat(page, hasSize(1)); + } + + @Test(groups = "warehouse", dependsOnMethods = "shouldPageList") + public void shouldReturnNullOnEndOfPaging() throws Exception { + PageableList page = service.listWarehouses(); + Page nextPage; + while ((nextPage = page.getNextPage()) != null) { + page = service.listWarehouses(nextPage); + } + } + @Test(dependsOnGroups = "warehouse") public void removeWarehouse() throws Exception { - final WarehouseService warehouseService = gd.getWarehouseService(); - warehouseService.removeWarehouse(warehouse); + service.removeWarehouse(warehouse); + warehouse = null; + service.removeWarehouse(warehouse2); + warehouse2 = null; + } + + @AfterClass + public void tearDown() throws Exception { + try { + if (warehouse != null) { + service.removeWarehouse(warehouse); + } + } catch (Exception ignored) {} + try { + if (warehouse2 != null) { + service.removeWarehouse(warehouse2); + } + } catch (Exception ignored) {} + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 7722181d6..1d5eae078 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -2,14 +2,13 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; -import com.gooddata.util.ResourceUtils; +import com.gooddata.collections.PageableList; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import java.util.Collection; import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; @@ -97,7 +96,7 @@ public void shouldListWarehouses() throws Exception { .withBody(readFromResource("/warehouse/warehouses.json")) .withStatus(200); - final Collection list = gd.getWarehouseService().listWarehouses(); + final PageableList list = gd.getWarehouseService().listWarehouses(); assertThat(list, notNullValue()); assertThat(list, hasSize(2)); } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 6552950aa..11b3e9590 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -11,29 +11,54 @@ import org.testng.annotations.Test; import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; public class WarehouseTest { + public static final String TITLE = "Test"; + public static final String TOKEN = "{Token}"; + public static final String DESCRIPTION = "Storage"; + private static final String ENVIRONMENT = "TESTING"; + public static final DateTime CREATED = new DateTime(2014, 5, 5, 8, 27, 33, DateTimeZone.UTC); + public static final DateTime UPDATED = new DateTime(2014, 5, 5, 8, 27, 34, DateTimeZone.UTC); + public static final String CREATED_BY = "/gdc/account/profile/createdBy"; + public static final String UPDATED_BY = "/gdc/account/profile/updatedBy"; + public static final String STATUS = "ENABLED"; + public static final Map LINKS = new LinkedHashMap() {{ + put("self", "/gdc/datawarehouse/instances/instanceId"); + put("parent", "/gdc/datawarehouse/instances"); + put("users", "/gdc/datawarehouse/instances/instanceId/users"); + put("jdbc", "/gdc/datawarehouse/instances/instanceId/jdbc"); + }}; + @Test - public void testSerialization() throws Exception { + public void testSerializationForInstanceCreation() throws Exception { final Warehouse warehouse = new Warehouse("New ADS", "Your-ADS-Token", "ADS Description"); warehouse.setEnvironment(Environment.TESTING); assertThat(warehouse, serializesToJson("/warehouse/warehouse-create.json")); } + @Test + public void testSerialization() throws Exception { + final Warehouse warehouse = new Warehouse(TITLE, TOKEN, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, LINKS); + assertThat(warehouse, serializesToJson("/warehouse/warehouse.json")); + } + @Test public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse.json"); final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); - assertThat(warehouse.getTitle(), is("Test")); - assertThat(warehouse.getDescription(), is("Storage")); - assertThat(warehouse.getAuthorizationToken(), is("{Token}")); - assertThat(warehouse.getEnvironment(), is("TESTING")); - assertThat(warehouse.getCreatedBy(), is("/gdc/account/profile/createdBy")); - assertThat(warehouse.getUpdatedBy(), is("/gdc/account/profile/updatedBy")); - assertThat(warehouse.getCreated(), is(new DateTime(2014, 5, 5, 8, 27, 33, DateTimeZone.UTC))); - assertThat(warehouse.getUpdated(), is(new DateTime(2014, 5, 5, 8, 27, 34, DateTimeZone.UTC))); - assertThat(warehouse.getAuthorizationToken(), is("{Token}")); + assertThat(warehouse.getTitle(), is(TITLE)); + assertThat(warehouse.getDescription(), is(DESCRIPTION)); + assertThat(warehouse.getAuthorizationToken(), is(TOKEN)); + assertThat(warehouse.getEnvironment(), is(ENVIRONMENT)); + assertThat(warehouse.getCreatedBy(), is(CREATED_BY)); + assertThat(warehouse.getUpdatedBy(), is(UPDATED_BY)); + assertThat(warehouse.getCreated(), is(CREATED)); + assertThat(warehouse.getUpdated(), is(UPDATED)); + assertThat(warehouse.getStatus(), is(STATUS)); + assertThat(warehouse.getLinks(), is(LINKS)); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index 7deb80a30..aea53cfb8 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -1,24 +1,43 @@ package com.gooddata.warehouse; +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.*; -import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; +import java.util.Collections; public class WarehousesTest { + private final Warehouses warehouses = readObjectFromResource("/warehouse/warehouses.json", Warehouses.class); + + private final Warehouses empty = new Warehouses(Collections.emptyList(), null); + @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouses.json"); - final Warehouses warehouses = new ObjectMapper().readValue(stream, Warehouses.class); + assertThat(warehouses, notNullValue()); + assertThat(warehouses, hasSize(2)); + assertThat(warehouses.get(0).getTitle(), is("Storage")); + } + + @Test + public void testSerialization() throws Exception { + assertThat(warehouses, serializesToJson("/warehouse/warehouses.json")); + } - assertThat(warehouses.getItems(), notNullValue()); - assertThat(warehouses.getItems(), hasSize(2)); - assertThat(warehouses.getItems().get(0).getTitle(), is("Storage")); + @Test + public void shouldSerializeEmpty() throws Exception { + assertThat(empty, serializesToJson("/warehouse/warehouses-empty.json")); + } + + @Test + public void shouldDeserializeEmpty() throws Exception { + final Warehouses result = readObjectFromResource("/warehouse/warehouses-empty.json", Warehouses.class); + assertThat(result, hasSize(0)); + assertThat(result.getPaging(), is(notNullValue())); } } \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouses-empty.json b/src/test/resources/warehouse/warehouses-empty.json new file mode 100644 index 000000000..0d21b4838 --- /dev/null +++ b/src/test/resources/warehouse/warehouses-empty.json @@ -0,0 +1,7 @@ +{ + "instances" : { + "items" : [], + "paging" : {}, + "links" : {} + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/warehouses.json b/src/test/resources/warehouse/warehouses.json index e616baead..919eca8ef 100644 --- a/src/test/resources/warehouse/warehouses.json +++ b/src/test/resources/warehouse/warehouses.json @@ -35,6 +35,7 @@ } } } ], + "paging" : {}, "links" : { "parent" : "/gdc/datawarehouse", "self" : "/gdc/datawarehouse/instances" From c9d46da1e1d4b08a28d49bdc7262f9adf1a96115 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 22 Jul 2015 16:04:25 +0200 Subject: [PATCH 0221/1191] Add WarehouseUser with paging --- .../gooddata/warehouse/WarehouseService.java | 12 +++ .../com/gooddata/warehouse/WarehouseUser.java | 76 +++++++++++++++++++ .../gooddata/warehouse/WarehouseUsers.java | 38 ++++++++++ .../warehouse/WarehouseUsersDeserializer.java | 25 ++++++ .../warehouse/WarehouseUsersSerializer.java | 19 +++++ .../warehouse/WarehouseServiceAT.java | 10 +++ .../gooddata/warehouse/WarehouseUserTest.java | 53 +++++++++++++ .../warehouse/WarehouseUsersTest.java | 45 +++++++++++ .../warehouse/user-createWithLogin.json | 6 ++ .../warehouse/user-createWithProfile.json | 6 ++ .../warehouse/user-withoutLogin.json | 10 +++ src/test/resources/warehouse/user.json | 11 +++ src/test/resources/warehouse/users-empty.json | 7 ++ src/test/resources/warehouse/users.json | 31 ++++++++ 14 files changed, 349 insertions(+) create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseUser.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseUsers.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseUserTest.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java create mode 100644 src/test/resources/warehouse/user-createWithLogin.json create mode 100644 src/test/resources/warehouse/user-createWithProfile.json create mode 100644 src/test/resources/warehouse/user-withoutLogin.json create mode 100644 src/test/resources/warehouse/user.json create mode 100644 src/test/resources/warehouse/users-empty.json create mode 100644 src/test/resources/warehouse/users.json diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 71d58b8d4..9254eea74 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -176,6 +176,18 @@ private PageableList listWarehouses(final URI uri) { } } + public PageableList listWarehouseUsers(final Warehouse warehouse, final Page page) { + notNull(warehouse, "warehouse"); + notNull(warehouse.getId(), "warehouse.id"); + notNull(page, "page"); + try { + final WarehouseUsers result = restTemplate.getForObject(WarehouseUsers.URI, WarehouseUsers.class, warehouse.getId()); + return result != null ? result : new PageableList(); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list users of warehouse " + warehouse.getId(), e); + } + } + /** * Updates given Warehouse. * diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java new file mode 100644 index 000000000..086df1f09 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -0,0 +1,76 @@ +package com.gooddata.warehouse; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.Map; + +import static com.gooddata.util.Validate.notNull; +import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL; + +/** + * Warehouse user + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("user") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = NON_NULL) +public class WarehouseUser { + + public static final String URI = WarehouseUsers.URI + "/{userId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + + private String role; + private String profile; + private String login; + private Map links; + + public WarehouseUser(final String role, final String profile, final String login) { + this.role = notNull(role, "role"); + if (profile == null) { + notNull(login, "login"); + } + if (login == null) { + notNull(profile, "profile"); + } + this.profile = profile; + this.login = login; + } + + @JsonCreator + public WarehouseUser(@JsonProperty("role") String role, @JsonProperty("profile") String profile, + @JsonProperty("login") String login, @JsonProperty("links") Map links) { + this(role, profile, login); + this.links = links; + } + + public String getRole() { + return role; + } + + public String getProfile() { + return profile; + } + + public String getLogin() { + return login; + } + + public Map getLinks() { + return links; + } + + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK): null; + } + +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java new file mode 100644 index 000000000..419b881da --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java @@ -0,0 +1,38 @@ +package com.gooddata.warehouse; + +import com.gooddata.collections.PageableList; +import com.gooddata.collections.Paging; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.List; +import java.util.Map; + +/** + * List of warehouse users. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName(WarehouseUsers.ROOT_NODE) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonDeserialize(using = WarehouseUsersDeserializer.class) +@JsonSerialize(using = WarehouseUsersSerializer.class) +public class WarehouseUsers extends PageableList { + + public static final String URI = Warehouse.URI + "/users"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + static final String ROOT_NODE = "users"; + + public WarehouseUsers(final List items, final Paging paging) { + super(items, paging); + } + + public WarehouseUsers(final List items, final Paging paging, final Map links) { + super(items, paging, links); + } + +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java new file mode 100644 index 000000000..54526e9f9 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.warehouse; + +import com.gooddata.collections.PageableListDeserializer; +import com.gooddata.collections.Paging; + +import java.util.List; +import java.util.Map; + +/** + * Deserializer of JSON into warehouse users object. + */ +class WarehouseUsersDeserializer extends PageableListDeserializer { + + protected WarehouseUsersDeserializer() { + super(WarehouseUser.class); + } + + @Override + protected WarehouseUsers createList(final List items, final Paging paging, final Map links) { + return new WarehouseUsers(items, paging, links); + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java b/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java new file mode 100644 index 000000000..93968d55a --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.warehouse; + +import com.gooddata.collections.PageableListSerializer; + +import static com.gooddata.warehouse.WarehouseUsers.ROOT_NODE; + +/** + * Serializer of warehouse users object into JSON. + */ +class WarehouseUsersSerializer extends PageableListSerializer { + + public WarehouseUsersSerializer() { + super(ROOT_NODE); + } + +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index f9bd67167..fac69398b 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -14,6 +14,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; /** @@ -75,6 +77,14 @@ public void shouldReturnNullOnEndOfPaging() throws Exception { } } + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void shouldListUsers() throws Exception { + final PageableList users = service.listWarehouseUsers(warehouse, new PageRequest(1)); + assertThat(users, hasSize(1)); + assertThat(users.get(0), is(notNullValue())); + assertThat(users.getNextPage(), is(nullValue())); + } + @Test(dependsOnGroups = "warehouse") public void removeWarehouse() throws Exception { service.removeWarehouse(warehouse); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java new file mode 100644 index 000000000..8002d77bc --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -0,0 +1,53 @@ +package com.gooddata.warehouse; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +public class WarehouseUserTest { + + public static final String ROLE = "admin"; + public static final String PROFILE = "/gdc/account/profile/{profile-id}"; + public static final String LOGIN = "foo@bar.com"; + public static final String SELF_LINK = "/gdc/datawarehouse/instances/{instance-id}/users/{profile-id}"; + public static final Map LINKS = new LinkedHashMap() {{ + put("self", SELF_LINK); + put("parent", "/gdc/datawarehouse/instances/{instance-id}/users"); + }}; + + @Test + public void testSerializationWithProfile() throws Exception { + final WarehouseUser user = new WarehouseUser(ROLE, PROFILE, null); + assertThat(user, serializesToJson("/warehouse/user-createWithProfile.json")); + } + + @Test + public void testSerializationWithLogin() throws Exception { + final WarehouseUser user = new WarehouseUser(ROLE, null, LOGIN); + assertThat(user, serializesToJson("/warehouse/user-createWithLogin.json")); + } + + @Test + public void testCompleteSerialization() throws Exception { + final WarehouseUser user = new WarehouseUser(ROLE, PROFILE, LOGIN, LINKS); + assertThat(user, serializesToJson("/warehouse/user.json")); + } + + @Test + public void testDeserialization() throws Exception { + final WarehouseUser user = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/warehouse/user.json"), WarehouseUser.class); + + assertThat(user.getRole(), is(ROLE)); + assertThat(user.getProfile(), is(PROFILE)); + assertThat(user.getLogin(), is(LOGIN)); + assertThat(user.getUri(), is(SELF_LINK)); + assertThat(user.getLinks(), is(LINKS)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java new file mode 100644 index 000000000..52f3f9f6b --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java @@ -0,0 +1,45 @@ +package com.gooddata.warehouse; + +import org.testng.annotations.Test; + +import java.util.Collections; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.startsWith; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; + +public class WarehouseUsersTest { + + private final WarehouseUsers users = readObjectFromResource("/warehouse/users.json", WarehouseUsers.class); + + private final WarehouseUsers empty = new WarehouseUsers(Collections.emptyList(), null); + + @Test + public void testDeserialization() throws Exception { + assertThat(users, notNullValue()); + assertThat(users, hasSize(2)); + assertThat(users.get(0).getProfile(), startsWith("/gdc/account/profile/{profile-id")); + } + + @Test + public void shouldDeserializeEmpty() throws Exception { + final WarehouseUsers result = readObjectFromResource("/warehouse/users-empty.json", WarehouseUsers.class); + assertThat(result, hasSize(0)); + assertThat(result.getPaging(), is(notNullValue())); + } + + @Test + public void testSerialization() throws Exception { + assertThat(users, serializesToJson("/warehouse/users.json")); + } + + @Test + public void shouldSerializeEmpty() throws Exception { + assertThat(empty, serializesToJson("/warehouse/users-empty.json")); + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/user-createWithLogin.json b/src/test/resources/warehouse/user-createWithLogin.json new file mode 100644 index 000000000..57f1b96c0 --- /dev/null +++ b/src/test/resources/warehouse/user-createWithLogin.json @@ -0,0 +1,6 @@ +{ + "user" : { + "role" : "admin", + "login" : "foo@bar.com" + } +} diff --git a/src/test/resources/warehouse/user-createWithProfile.json b/src/test/resources/warehouse/user-createWithProfile.json new file mode 100644 index 000000000..666f8cdfc --- /dev/null +++ b/src/test/resources/warehouse/user-createWithProfile.json @@ -0,0 +1,6 @@ +{ + "user" : { + "role" : "admin", + "profile" : "/gdc/account/profile/{profile-id}" + } +} diff --git a/src/test/resources/warehouse/user-withoutLogin.json b/src/test/resources/warehouse/user-withoutLogin.json new file mode 100644 index 000000000..2ef6cba04 --- /dev/null +++ b/src/test/resources/warehouse/user-withoutLogin.json @@ -0,0 +1,10 @@ +{ + "user" : { + "role" : "admin", + "profile" : "/gdc/account/profile/{profile-id}", + "links" : { + "self" : "/gdc/datawarehouse/instances/{instance-id}/users/{profile-id}", + "parent" : "/gdc/datawarehouse/instances/{instance-id}/users" + } + } +} diff --git a/src/test/resources/warehouse/user.json b/src/test/resources/warehouse/user.json new file mode 100644 index 000000000..4d2320c7b --- /dev/null +++ b/src/test/resources/warehouse/user.json @@ -0,0 +1,11 @@ +{ + "user" : { + "role" : "admin", + "profile" : "/gdc/account/profile/{profile-id}", + "login" : "foo@bar.com", + "links" : { + "self" : "/gdc/datawarehouse/instances/{instance-id}/users/{profile-id}", + "parent" : "/gdc/datawarehouse/instances/{instance-id}/users" + } + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/users-empty.json b/src/test/resources/warehouse/users-empty.json new file mode 100644 index 000000000..5974e5512 --- /dev/null +++ b/src/test/resources/warehouse/users-empty.json @@ -0,0 +1,7 @@ +{ + "users": { + "items": [], + "paging": {}, + "links": {} + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/users.json b/src/test/resources/warehouse/users.json new file mode 100644 index 000000000..57c48a2f9 --- /dev/null +++ b/src/test/resources/warehouse/users.json @@ -0,0 +1,31 @@ +{ + "users": { + "items": [ + { + "user": { + "role": "admin", + "profile": "/gdc/account/profile/{profile-id}", + "links": { + "self": "/gdc/datawarehouse/instances/{instance-id}/users/{profile-id}", + "parent": "/gdc/datawarehouse/instances/{instance-id}/users" + } + } + }, + { + "user": { + "role": "dataAdmin", + "profile": "/gdc/account/profile/{profile-id-2}", + "links": { + "self": "/gdc/datawarehouse/instances/{instance-id}/users/{profile-id-2}", + "parent": "/gdc/datawarehouse/instances/{instance-id}/users" + } + } + } + ], + "paging": {}, + "links": { + "parent": "/gdc/datawarehouse/{instance-id}", + "self": "/gdc/datawarehouse/instances/{instance-id}/users" + } + } +} \ No newline at end of file From 17a2dd2076d2f6a4acff0851ae801a932ecd637b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Jul 2015 15:01:47 +0200 Subject: [PATCH 0222/1191] [maven-release-plugin] prepare release gooddata-java-0.19.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index da11b3bb9..0c28af6cf 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.18.1-SNAPSHOT + 0.19.0 ${project.artifactId} GoodData Java SDK From 1fe801547b6459cef204c231d4fe360865250889 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 30 Jul 2015 15:01:47 +0200 Subject: [PATCH 0223/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0c28af6cf..a2c7d6a93 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.19.0 + 0.19.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From c1e4f0c584fa0d69f07214a1c30b5512b5897bcd Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 31 Jul 2015 08:55:01 +0200 Subject: [PATCH 0224/1191] fix: make acceptance tests working using static fields in tests ancestor --- .../java/com/gooddata/AbstractGoodDataAT.java | 31 +++++++++---------- .../gooddata/project/ProjectServiceAT.java | 7 ----- 2 files changed, 15 insertions(+), 23 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 952869606..b881e2c07 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -14,23 +14,20 @@ */ public abstract class AbstractGoodDataAT { - protected final String title; - protected final GoodData gd; + protected static final String title = + "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); - protected Project project; + protected static final GoodData gd = + new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); - protected String fact; - protected Attribute attr; - protected Metric metric; - protected Report report; - protected ReportDefinition reportDefinition; - protected ScheduledMail scheduledMail; + protected static Project project; - - public AbstractGoodDataAT() { - title = "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); - gd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); - } + protected static String fact; + protected static Attribute attr; + protected static Metric metric; + protected static Report report; + protected static ReportDefinition reportDefinition; + protected static ScheduledMail scheduledMail; public static String getProperty(String name) { final String value = System.getenv(name); @@ -42,10 +39,12 @@ public static String getProperty(String name) { } @AfterSuite - public void logout() throws Exception { + public static void removeProjectAndLogout() { if (gd != null) { + if (project != null) { + gd.getProjectService().removeProject(project); + } gd.logout(); } - System.out.println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"); } } diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index e80614372..43a180a18 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -37,13 +37,6 @@ public ProjectServiceAT() { projectToken = getProperty("projectToken"); } - @AfterClass - public void tearDown() throws Exception { - if (gd != null && project != null) { - gd.getProjectService().removeProject(project); - } - } - @Test(groups = "project", dependsOnGroups = "account") public void createProject() throws Exception { final Project p = new Project(title, projectToken); From b384cb6033d2cd1856f368ed60e4f4c5be36db7d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Aug 2015 15:42:58 +0200 Subject: [PATCH 0225/1191] fix: warehouse users paging close: #209 --- .../com/gooddata/warehouse/WarehouseService.java | 4 +++- .../gooddata/warehouse/WarehouseServiceIT.java | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 9254eea74..4f44a9477 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -181,7 +181,9 @@ public PageableList listWarehouseUsers(final Warehouse warehouse, notNull(warehouse.getId(), "warehouse.id"); notNull(page, "page"); try { - final WarehouseUsers result = restTemplate.getForObject(WarehouseUsers.URI, WarehouseUsers.class, warehouse.getId()); + final UriComponentsBuilder builder = UriComponentsBuilder.fromUri(WarehouseUsers.TEMPLATE.expand(warehouse.getId())); + final URI uri = page.getPageUri(builder); + final WarehouseUsers result = restTemplate.getForObject(uri, WarehouseUsers.class); return result != null ? result : new PageableList(); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to list users of warehouse " + warehouse.getId(), e); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 1d5eae078..d8ae10a9e 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -2,9 +2,11 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; +import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -172,4 +174,17 @@ public void describeTo(Description description) { }) .receivedOnce(); } + + @Test + public void shouldPageUsersList() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/datawarehouse/instances/instanceId/users") + .havingParameterEqualTo("limit", "2") + .respond() + .withBody(readFromResource("/warehouse/users.json")); + + final PageableList users = gd.getWarehouseService().listWarehouseUsers(warehouse, new PageRequest(2)); + assertThat(users, Matchers.hasSize(2)); + } } From 89e17bcd4498da3b546b5c11160c56032d608029 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Aug 2015 16:12:55 +0200 Subject: [PATCH 0226/1191] [maven-release-plugin] prepare release gooddata-java-0.19.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a2c7d6a93..8586aaf9b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.19.1-SNAPSHOT + 0.19.1 ${project.artifactId} GoodData Java SDK From 2aa9b73b86dea361999556c72bfdd40234078bf0 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Aug 2015 16:12:56 +0200 Subject: [PATCH 0227/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8586aaf9b..9eb5bf00b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.19.1 + 0.19.2-SNAPSHOT ${project.artifactId} GoodData Java SDK From eeb4db113f8f127bbca8bd776d50ecfbab7b2677 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 10 Aug 2015 16:24:24 +0200 Subject: [PATCH 0228/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 29b492baf..51d2c144d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.17.0 + 0.19.1 ``` From 804d397246fd4cc605a00811f7809cc84057a58c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 13 Aug 2015 13:36:41 +0200 Subject: [PATCH 0229/1191] introduce attribute elements support --- .../com/gooddata/md/AttributeDisplayForm.java | 9 +-- .../com/gooddata/md/AttributeElement.java | 57 +++++++++++++++++ .../com/gooddata/md/AttributeElements.java | 62 +++++++++++++++++++ .../java/com/gooddata/md/DisplayForm.java | 29 +++++++-- .../java/com/gooddata/md/MetadataService.java | 36 +++++++++++ .../gooddata/md/AttributeDisplayFormTest.java | 4 +- .../com/gooddata/md/AttributeElementTest.java | 31 ++++++++++ .../gooddata/md/AttributeElementsTest.java | 33 ++++++++++ .../java/com/gooddata/md/DisplayFormTest.java | 4 +- .../com/gooddata/md/MetadataServiceAT.java | 32 ++++++---- .../com/gooddata/md/MetadataServiceIT.java | 20 ++++++ .../com/gooddata/md/MetadataServiceTest.java | 32 ++++++++++ .../md/attributeDisplayForm-input.json | 11 ++-- src/test/resources/md/attributeElement.json | 4 ++ src/test/resources/md/attributeElements.json | 25 ++++++++ src/test/resources/md/displayForm-input.json | 11 ++-- 16 files changed, 371 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/gooddata/md/AttributeElement.java create mode 100644 src/main/java/com/gooddata/md/AttributeElements.java create mode 100644 src/test/java/com/gooddata/md/AttributeElementTest.java create mode 100644 src/test/java/com/gooddata/md/AttributeElementsTest.java create mode 100644 src/test/resources/md/attributeElement.json create mode 100644 src/test/resources/md/attributeElements.json diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index cfdafe54c..a7ba48776 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -24,14 +24,15 @@ public class AttributeDisplayForm extends DisplayForm implements Updatable { protected final Content content; @JsonCreator - private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { - super(meta, content); + private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content, + @JsonProperty("links") Links links) { + super(meta, content, links); this.content = content; } /* Just for serialization test */ - AttributeDisplayForm(String title, String formOf, String expression, boolean isDefault, String ldmExpression, String type) { - this(new Meta(title), new Content(formOf, expression, isDefault, ldmExpression, type)); + 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)); } @JsonIgnore diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/src/main/java/com/gooddata/md/AttributeElement.java new file mode 100644 index 000000000..85476ae61 --- /dev/null +++ b/src/main/java/com/gooddata/md/AttributeElement.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +/** + * Represent one element of attribute values + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class AttributeElement { + + private final String uri; + private final String title; + + @JsonCreator + private AttributeElement(@JsonProperty("uri") String uri, @JsonProperty("title") String title) { + this.uri = uri; + this.title = title; + } + + public String getUri() { + return uri; + } + + public String getTitle() { + return title; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof AttributeElement)) + return false; + + AttributeElement that = (AttributeElement) o; + + if (uri != null ? !uri.equals(that.uri) : that.uri != null) + return false; + return !(title != null ? !title.equals(that.title) : that.title != null); + + } + + @Override + public int hashCode() { + int result = uri != null ? uri.hashCode() : 0; + result = 31 * result + (title != null ? title.hashCode() : 0); + return result; + } +} diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java new file mode 100644 index 000000000..de89ed1ed --- /dev/null +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.apache.commons.lang.Validate.notNull; + +import org.apache.commons.lang.Validate; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.springframework.web.util.UriTemplate; + +import java.util.List; +import java.util.Set; + +/** + * Represents elements of attribute + */ +@JsonTypeName("attributeElements") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +class AttributeElements { + + static final String URI = Obj.OBJ_URI + "/elements"; + static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final List elements; + + @JsonCreator + AttributeElements(@JsonProperty("elements") List elements) { + notNull(elements, "elements"); + this.elements = elements; + } + + public List getElements() { + return elements; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + AttributeElements that = (AttributeElements) o; + + return !(elements != null ? !elements.equals(that.elements) : that.elements != null); + + } + + @Override + public int hashCode() { + return elements != null ? elements.hashCode() : 0; + } +} diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index df55bf909..52be9573f 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -3,13 +3,10 @@ */ package com.gooddata.md; -import com.gooddata.util.BooleanIntegerDeserializer; -import com.gooddata.util.BooleanIntegerSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; /** @@ -22,10 +19,15 @@ public class DisplayForm extends AbstractObj { @JsonProperty("content") protected final Content content; + @JsonProperty("links") + private final Links links; + @JsonCreator - protected DisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + protected DisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content, + @JsonProperty("links") Links links) { super(meta); this.content = content; + this.links = links; } @JsonIgnore @@ -48,6 +50,11 @@ public String getType() { return content.getType(); } + @JsonIgnore + public String getElementsLink() { + return links.getElements(); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) protected static class Content { @@ -84,4 +91,18 @@ public String getType() { } } + @JsonIgnoreProperties(ignoreUnknown = true) + protected static class Links { + private final String elements; + + @JsonCreator + protected Links(@JsonProperty("elements") String elements) { + this.elements = elements; + } + + public String getElements() { + return elements; + } + } + } diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 2325c5ce8..abb8495e6 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -10,6 +10,7 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; import org.springframework.http.HttpStatus; +import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -19,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; @@ -407,6 +409,40 @@ public Map identifiersToUris(Project project, Collection return Collections.unmodifiableMap(identifiersToUris); } + /** + * Fetches attribute elements for given attribute using default display form. + * + * @param attribute attribute to fetch elements for + * @return attribute elements or empty set if there is no link for elements in default display form + */ + public List getAttributeElements(Attribute attribute) { + notNull(attribute, "attribute"); + + return getAttributeElements(attribute.getDefaultDisplayForm()); + } + + /** + * Fetches attribute elements by given display form. + * + * @param displayForm display form to fetch attributes for + * @return attribute elements or empty set if there is no link for elements + */ + public List getAttributeElements(DisplayForm displayForm) { + notNull(displayForm, "displayForm"); + + final String elementsLink = displayForm.getElementsLink(); + if (StringUtils.isEmpty(elementsLink)) { + return Collections.emptyList(); + } + + try { + final AttributeElements attributeElements = restTemplate.getForObject(elementsLink, AttributeElements.class); + return attributeElements.getElements(); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to get attribute elements from " + elementsLink + ".", e); + } + } + private IdentifiersAndUris getUrisForIdentifiers(final Project project, final Collection identifiers) { final IdentifiersAndUris response; try { diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index e481d97f4..e18f407c6 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -18,6 +18,7 @@ public class AttributeDisplayFormTest { public static final boolean DEFAULT_TRUE = true; public 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"; @Test public void shouldDeserialize() throws Exception { @@ -30,12 +31,13 @@ public void shouldDeserialize() throws Exception { assertThat(attrDF.isDefault(), is(DEFAULT_TRUE)); assertThat(attrDF.getLdmExpression(), is(LDM_EXPRESSION)); assertThat(attrDF.getType(), is(TYPE)); + assertThat(attrDF.getElementsLink(), is(ELEMENTS_LINK)); } @Test public void testSerialization() throws Exception { final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, - LDM_EXPRESSION, TYPE); + LDM_EXPRESSION, TYPE, ELEMENTS_LINK); assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-input.json")); } diff --git a/src/test/java/com/gooddata/md/AttributeElementTest.java b/src/test/java/com/gooddata/md/AttributeElementTest.java new file mode 100644 index 000000000..d744e7360 --- /dev/null +++ b/src/test/java/com/gooddata/md/AttributeElementTest.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class AttributeElementTest { + + private static final String URI = "/gdc/md/PROJECT_ID/obj/1333/elements?id=6959"; + private static final String TITLE = "1165"; + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attributeElement.json"); + final AttributeElement element = new ObjectMapper().readValue(stream, AttributeElement.class); + assertThat(element, is(notNullValue())); + + assertThat(element.getUri(), is(URI)); + assertThat(element.getTitle(), is(TITLE)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/AttributeElementsTest.java b/src/test/java/com/gooddata/md/AttributeElementsTest.java new file mode 100644 index 000000000..bc5ea5d54 --- /dev/null +++ b/src/test/java/com/gooddata/md/AttributeElementsTest.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.List; +import java.util.Set; + + +public class AttributeElementsTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attributeElements.json"); + final AttributeElements elements = new ObjectMapper().readValue(stream, AttributeElements.class); + assertThat(elements, is(notNullValue())); + + final List elementsList = elements.getElements(); + assertThat(elementsList, is(notNullValue())); + assertThat(elementsList, hasSize(3)); + } + +} \ 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 0a5de5473..6448a64a0 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -19,6 +19,7 @@ public class DisplayFormTest { 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 String LDM_EXPRESSION = ""; + private static final String ELEMENTS_LINK = "/gdc/md/PROJECT_ID/obj/DF_ID/elements"; @Test public void shouldDeserialize() throws Exception { @@ -30,12 +31,13 @@ public void shouldDeserialize() throws Exception { assertThat(displayForm.getExpression(), is(EXPRESSION)); assertThat(displayForm.getLdmExpression(), is(LDM_EXPRESSION)); assertThat(displayForm.getType(), is(nullValue())); + assertThat(displayForm.getElementsLink(), is(ELEMENTS_LINK)); } @Test public void testSerialization() throws Exception { final DisplayForm displayForm = new DisplayForm(new Meta("Person Name"), - new DisplayForm.Content(FORM_OF, EXPRESSION, LDM_EXPRESSION, null)); + new DisplayForm.Content(FORM_OF, EXPRESSION, LDM_EXPRESSION, null), new DisplayForm.Links(ELEMENTS_LINK)); assertThat(displayForm, serializesToJson("/md/displayForm-input.json")); } diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 96207b92a..9c5ca8f6c 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -1,5 +1,13 @@ package com.gooddata.md; +import static com.gooddata.md.Restriction.identifier; +import static com.gooddata.report.ReportExportFormat.PDF; +import static com.gooddata.report.ReportExportFormat.XLS; +import static java.util.Arrays.asList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.testng.AssertJUnit.assertTrue; + import com.gooddata.AbstractGoodDataAT; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.Filter; @@ -11,19 +19,11 @@ import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; - -import static com.gooddata.md.Restriction.identifier; -import static com.gooddata.report.ReportExportFormat.PDF; -import static com.gooddata.report.ReportExportFormat.XLS; -import static java.util.Arrays.asList; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.testng.AssertJUnit.assertTrue; +import java.util.Set; /** * Metadata acceptance tests. @@ -160,4 +160,14 @@ public void removeDefinition() throws Exception { metadataService.removeObj(reportDefinition); } + @Test(groups = "mdAfterLoad", dependsOnGroups = {"model", "dataset"}, dependsOnMethods = "getObjs") + public void getAttributeElements() throws Exception { + final List elements = gd.getMetadataService().getAttributeElements(attr); + assertThat("there should be 2 elements", elements, hasSize(2)); + final Set titles = new HashSet<>(elements.size()); + for (AttributeElement element : elements) { + titles.add(element.getTitle()); + } + assertThat(titles, hasItems("DevOps", "HR")); + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index b3717362c..56ac2aa5d 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -7,6 +7,7 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; +import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -19,6 +20,7 @@ import java.util.Map; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.instanceOf; @@ -340,4 +342,22 @@ public void shouldFindUrisByRestrictions() throws Exception { assertThat(result, hasSize(2)); assertThat(result, contains("/gdc/md/PROJ_ID/obj/127", "/gdc/md/PROJ_ID/obj/118")); } + + @Test + public void shouldGetAttributeElements() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/obj/DF_ID/elements") + .respond() + .withStatus(200) + .withBody(readFromResource("/md/attributeElements.json")); + + final List attributeElements = + gd.getMetadataService().getAttributeElements( + readObjectFromResource("/md/attribute.json", Attribute.class)); + + assertThat(attributeElements, is(Matchers.notNullValue())); + assertThat(attributeElements, hasSize(3)); + assertThat(attributeElements.get(0).getTitle(), is("1167")); + } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 4be30045f..f93e8ff76 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -17,6 +17,8 @@ import org.testng.annotations.Test; import java.util.Collection; +import java.util.Collections; +import java.util.List; import static java.lang.String.format; import static java.util.Arrays.asList; @@ -25,6 +27,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -337,4 +340,33 @@ public void testFindUrisBySummary() throws Exception { assertThat(results, allOf(hasItem(uri1), hasItem(uri2))); } + @Test + public void testGetAttributeElementsEmpty() throws Exception { + final DisplayForm attrDisplayForm = mock(AttributeDisplayForm.class); + when(attrDisplayForm.getElementsLink()).thenReturn("elementsLink"); + final Attribute attr = mock(Attribute.class); + when(attr.getDefaultDisplayForm()).thenReturn(attrDisplayForm); + + when(restTemplate.getForObject("elementsLink", AttributeElements.class)) + .thenReturn(new AttributeElements(Collections.emptyList())); + final List elements = service.getAttributeElements(attr); + assertThat(elements, hasSize(0)); + } + + @Test + public void testGetAttributeElements() throws Exception { + final DisplayForm attrDisplayForm = mock(AttributeDisplayForm.class); + when(attrDisplayForm.getElementsLink()).thenReturn("elementsLink"); + final Attribute attr = mock(Attribute.class); + when(attr.getDefaultDisplayForm()).thenReturn(attrDisplayForm); + + final AttributeElement result1 = mock(AttributeElement.class); + final AttributeElement result2 = mock(AttributeElement.class); + + when(restTemplate.getForObject("elementsLink", AttributeElements.class)) + .thenReturn(new AttributeElements(asList(result1, result2))); + final List elements = service.getAttributeElements(attr); + assertThat(elements, allOf(hasItem(result1), hasItem(result2))); + } + } diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json index bb44d6b12..1851cf8e6 100644 --- a/src/test/resources/md/attributeDisplayForm-input.json +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -7,11 +7,14 @@ "type" : "TYPE", "ldmexpression" : "" }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, "meta" : { - "title" : "Person Name", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } } \ No newline at end of file diff --git a/src/test/resources/md/attributeElement.json b/src/test/resources/md/attributeElement.json new file mode 100644 index 000000000..3300428b0 --- /dev/null +++ b/src/test/resources/md/attributeElement.json @@ -0,0 +1,4 @@ +{ + "uri" : "/gdc/md/PROJECT_ID/obj/1333/elements?id=6959", + "title" : "1165" +} \ No newline at end of file diff --git a/src/test/resources/md/attributeElements.json b/src/test/resources/md/attributeElements.json new file mode 100644 index 000000000..958cdf13f --- /dev/null +++ b/src/test/resources/md/attributeElements.json @@ -0,0 +1,25 @@ +{ + "attributeElements" : { + "elements" : [ { + "uri" : "/gdc/md/PROJECT_ID/obj/1333/elements?id=6963", + "title" : "1167" + }, { + "uri" : "/gdc/md/PROJECT_ID/obj/1333/elements?id=6965", + "title" : "1168" + }, { + "uri" : "/gdc/md/PROJECT_ID/obj/1333/elements?id=13716", + "title" : "1169" + } ], + "elementsMeta" : { + "attribute" : "/gdc/md/PROJECT_ID/obj/1333", + "attributeDisplayForm" : "/gdc/md/PROJECT_ID/obj/1364", + "count" : 3, + "order" : "unsorted", + "filter" : "", + "mode" : "includeuris", + "prompt" : "", + "records" : "3", + "offset" : "0" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/displayForm-input.json b/src/test/resources/md/displayForm-input.json index f6bcfcebf..dee83bd0d 100644 --- a/src/test/resources/md/displayForm-input.json +++ b/src/test/resources/md/displayForm-input.json @@ -4,10 +4,13 @@ "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", "ldmexpression" : "" }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, "meta" : { - "title" : "Person Name", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person Name", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 } } \ No newline at end of file From efab13e4a8541d64174d01cd825fc3e7c9442a92 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 25 Aug 2015 10:17:46 +0200 Subject: [PATCH 0230/1191] [maven-release-plugin] prepare release gooddata-java-0.20.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9eb5bf00b..ac28e5523 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.19.2-SNAPSHOT + 0.20.0 ${project.artifactId} GoodData Java SDK From 2903ecf3d7078fde8ebd45a5db9dfc7ad345cdfc Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 25 Aug 2015 10:17:47 +0200 Subject: [PATCH 0231/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ac28e5523..7ed37bc60 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.20.0 + 0.20.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 609abd92107c239abf85149a45cad27ca049f62e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 25 Aug 2015 10:27:55 +0200 Subject: [PATCH 0232/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 51d2c144d..1433d3f47 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.19.1 + 0.20.0 ``` From 4d6aecec46ddec641623f4b4ea61c62e8447a112 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 26 Aug 2015 23:20:11 +0200 Subject: [PATCH 0233/1191] Add Maven badge to README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1433d3f47..d617c90d7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) +# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/cz.geek/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/cz.geek/gooddata-java) The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 From 6d86d9aa3643aa6fd7a672a572da71262b215ee0 Mon Sep 17 00:00:00 2001 From: Jakub Denk Date: Thu, 3 Sep 2015 15:18:16 +0200 Subject: [PATCH 0234/1191] Rename ZipUtils to ZipHelper to avoid clash with internal GD class --- .../gooddata/dataload/processes/ProcessService.java | 4 ++-- .../gooddata/util/{ZipUtils.java => ZipHelper.java} | 2 +- .../util/{ZipUtilsTest.java => ZipHelperTest.java} | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) rename src/main/java/com/gooddata/util/{ZipUtils.java => ZipHelper.java} (98%) rename src/test/java/com/gooddata/util/{ZipUtilsTest.java => ZipHelperTest.java} (92%) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 90703375f..208c72118 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -11,7 +11,7 @@ import com.gooddata.collections.PageableList; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; -import com.gooddata.util.ZipUtils; +import com.gooddata.util.ZipHelper; import org.springframework.core.io.FileSystemResource; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -439,7 +439,7 @@ private DataloadProcess postProcess(DataloadProcess process, File processData, U File tempFile = createTempFile("process", ".zip"); try (FileOutputStream output = new FileOutputStream(tempFile)) { - ZipUtils.zip(processData, output); + ZipHelper.zip(processData, output); } catch (IOException e) { throw new GoodDataException("Unable to zip process data", e); } diff --git a/src/main/java/com/gooddata/util/ZipUtils.java b/src/main/java/com/gooddata/util/ZipHelper.java similarity index 98% rename from src/main/java/com/gooddata/util/ZipUtils.java rename to src/main/java/com/gooddata/util/ZipHelper.java index 2eb99dd51..1fa7fcbe2 100644 --- a/src/main/java/com/gooddata/util/ZipUtils.java +++ b/src/main/java/com/gooddata/util/ZipHelper.java @@ -16,7 +16,7 @@ /** * Utility class for manipulating zip archives. */ -public abstract class ZipUtils { +public abstract class ZipHelper { /** * This method compresses the input file to zip format. If the given file is a directory, it recursively diff --git a/src/test/java/com/gooddata/util/ZipUtilsTest.java b/src/test/java/com/gooddata/util/ZipHelperTest.java similarity index 92% rename from src/test/java/com/gooddata/util/ZipUtilsTest.java rename to src/test/java/com/gooddata/util/ZipHelperTest.java index 9bffabac0..255f347f7 100644 --- a/src/test/java/com/gooddata/util/ZipUtilsTest.java +++ b/src/test/java/com/gooddata/util/ZipHelperTest.java @@ -18,7 +18,7 @@ import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -public class ZipUtilsTest { +public class ZipHelperTest { private static final String SOME_FILE = "someFile.txt"; private static final String SOME_FILE_PATH = Paths.get("a", "b", SOME_FILE).toString(); @@ -40,7 +40,7 @@ public void shouldZipSingleFile() throws Exception { final File file = temporaryFolder.resolve(SOME_FILE).toFile(); file.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(file, output); + ZipHelper.zip(file, output); output.close(); verifyZipContent(output, SOME_FILE); } @@ -54,7 +54,7 @@ public void shouldZipDir() throws Exception { toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(toZipDir.toFile(), output, true); + ZipHelper.zip(toZipDir.toFile(), output, true); output.close(); verifyZipContent(output, Paths.get("toZip", "a", "b", SOME_FILE).toString()); } @@ -68,7 +68,7 @@ public void shouldZipDirWithoutRoot() throws Exception { toZipFile.getParentFile().mkdirs(); toZipFile.createNewFile(); try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(toZipDir.toFile(), output); + ZipHelper.zip(toZipDir.toFile(), output); output.close(); verifyZipContent(output, Paths.get("a", "b", SOME_FILE).toString()); } @@ -81,13 +81,13 @@ public void shouldNotZipAlreadyZipped() throws Exception { file.createNewFile(); final File zipped = temporaryFolder.resolve("zipped.zip").toFile(); try (FileOutputStream zipStream = new FileOutputStream(zipped)) { - ZipUtils.zip(file, zipStream); + ZipHelper.zip(file, zipStream); zipStream.close(); } // actual test try (ByteArrayOutputStream output = new ByteArrayOutputStream()) { - ZipUtils.zip(zipped, output); + ZipHelper.zip(zipped, output); output.close(); verifyZipContent(output, SOME_FILE); } From 3228e6aa09f40879847ddf832bfe88a8e1e8d062 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 14 Sep 2015 10:58:35 +0200 Subject: [PATCH 0235/1191] introduce metadata dataset --- src/main/java/com/gooddata/md/Dataset.java | 142 ++++++++++++++++++ .../java/com/gooddata/md/DatasetTest.java | 58 +++++++ src/test/resources/md/dataset-input.json | 17 +++ src/test/resources/md/dataset.json | 36 +++++ 4 files changed, 253 insertions(+) create mode 100644 src/main/java/com/gooddata/md/Dataset.java create mode 100644 src/test/java/com/gooddata/md/DatasetTest.java create mode 100644 src/test/resources/md/dataset-input.json create mode 100644 src/test/resources/md/dataset.json diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java new file mode 100644 index 000000000..edba2af59 --- /dev/null +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanStringSerializer; +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; +import org.codehaus.jackson.map.annotate.JsonDeserialize; +import org.codehaus.jackson.map.annotate.JsonSerialize; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * Represents metadata dataset + */ +@JsonTypeName("dataSet") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +public class Dataset extends AbstractObj implements Queryable, Updatable { + + private static final String DATA_UPLOADS_LINK = "dataUploads"; + private static final String UPLOAD_CONFIGURATION_LINK = "uploadConfiguration"; + + @JsonProperty("content") + private final Content content; + + @JsonProperty("links") + private final Map links; + + @JsonCreator + private Dataset(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content, + @JsonProperty("links") Map links) { + super(meta); + this.content = content; + this.links = links; + } + + /* Just for serialization test */ + Dataset(String title) { + this(new Meta(title), new Content(Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), false), null); + } + + @JsonIgnore + public List getTies() { + return content.getTies(); + } + + @JsonIgnore + public String getMode() { + return content.getMode(); + } + + @JsonIgnore + public List getFacts() { + return content.getFacts(); + } + + @JsonIgnore + public List getDataLoadingColumns() { + return content.getDataLoadingColumns(); + } + + @JsonIgnore + public List getAttributes() { + return content.getAttributes(); + } + + @JsonIgnore + public boolean hasUploadConfiguration() { + return content.hasUploadConfiguration(); + } + + @JsonIgnore + public String getDataUploadsLink() { + return links != null ? links.get(DATA_UPLOADS_LINK) : null; + } + + @JsonIgnore + public String getUploadConfigurationLink() { + return links != null ? links.get(UPLOAD_CONFIGURATION_LINK) : null; + } + + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + private static class Content { + private final List ties; + private final String mode; + private final List facts; + private final List dataLoadingColumns; + private final List attributes; + private final boolean hasUploadConfiguration; + + @JsonCreator + private Content(@JsonProperty("ties") List ties, + @JsonProperty("mode") String mode, + @JsonProperty("facts") List facts, + @JsonProperty("dataLoadingColumns") List dataLoadingColumns, + @JsonProperty("attributes") List attributes, + @JsonProperty("hasUploadConfiguration") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean hasUploadConfiguration) { + this.ties = ties; + this.mode = mode; + this.facts = facts; + this.dataLoadingColumns = dataLoadingColumns; + this.attributes = attributes; + this.hasUploadConfiguration = hasUploadConfiguration; + } + + public List getTies() { + return ties; + } + + public String getMode() { + return mode; + } + + public List getFacts() { + return facts; + } + + public List getDataLoadingColumns() { + return dataLoadingColumns; + } + + public List getAttributes() { + return attributes; + } + + @JsonProperty("hasUploadConfiguration") + @JsonSerialize(using = BooleanStringSerializer.class) + public boolean hasUploadConfiguration() { + return hasUploadConfiguration; + } + } +} diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java new file mode 100644 index 000000000..b111f15ee --- /dev/null +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static com.gooddata.JsonMatchers.serializesToJson; +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.collection.IsCollectionWithSize.hasSize; + +import org.codehaus.jackson.map.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.List; + +public class DatasetTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/dataset.json"); + final Dataset dataset = new ObjectMapper().readValue(stream, Dataset.class); + + assertThat(dataset, is(notNullValue())); + + final List ties = dataset.getTies(); + assertThat(ties, is(notNullValue())); + assertThat(ties, hasSize(1)); + + assertThat(dataset.getMode(), is("")); + + final List facts = dataset.getFacts(); + assertThat(facts, is(notNullValue())); + assertThat(facts, hasSize(2)); + + final List dataLoadingColumns = dataset.getDataLoadingColumns(); + assertThat(dataLoadingColumns, is(notNullValue())); + assertThat(dataLoadingColumns, hasSize(0)); + + final List attributes = dataset.getAttributes(); + assertThat(attributes, is(notNullValue())); + assertThat(attributes, hasSize(3)); + + assertThat(dataset.getDataUploadsLink(), is("/gdc/md/PROJECT_ID/data/uploads/688536")); + assertThat(dataset.hasUploadConfiguration(), is(false)); + assertThat(dataset.getUploadConfigurationLink(), is(nullValue())); + } + + @Test + public void shouldSerialize() throws Exception { + final Dataset dataset = new Dataset("Dataset"); + assertThat(dataset, serializesToJson("/md/dataset-input.json")); + } + +} \ No newline at end of file diff --git a/src/test/resources/md/dataset-input.json b/src/test/resources/md/dataset-input.json new file mode 100644 index 000000000..f4ef07faf --- /dev/null +++ b/src/test/resources/md/dataset-input.json @@ -0,0 +1,17 @@ +{ + "dataSet" : { + "content" : { + "ties": [], + "facts": [], + "dataLoadingColumns": [], + "attributes": [], + "hasUploadConfiguration": "0" + }, + "meta" : { + "title" : "Dataset", + "deprecated" : "0", + "locked": 0, + "unlisted": 0 + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/dataset.json b/src/test/resources/md/dataset.json new file mode 100644 index 000000000..ffd3b83cb --- /dev/null +++ b/src/test/resources/md/dataset.json @@ -0,0 +1,36 @@ +{ + "dataSet": { + "content": { + "ties": [ + "/gdc/md/PROJECT_ID/obj/688400" + ], + "mode": "", + "facts": [ + "/gdc/md/PROJECT_ID/obj/688401", + "/gdc/md/PROJECT_ID/obj/688402" + ], + "dataLoadingColumns": [], + "attributes": [ + "/gdc/md/PROJECT_ID/obj/688399", + "/gdc/md/PROJECT_ID/obj/688411", + "/gdc/md/PROJECT_ID/obj/688425" + ] + }, + "links": { + "dataUploads": "/gdc/md/PROJECT_ID/data/uploads/688536" + }, + "meta": { + "author": "/gdc/account/profile/PROFILE_ID", + "uri": "/gdc/md/PROJECT_ID/obj/688536", + "tags": "", + "created": "2015-01-28 17:35:47", + "identifier": "DATASET_ID.dataset.dt", + "deprecated": "0", + "summary": "DataSet Date", + "title": "Date (Org minDate-first deal)", + "category": "dataSet", + "updated": "2015-01-28 17:35:47", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file From 684f0f07b11e61ad7a218ff87b47e44cc123f6af Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 15 Sep 2015 12:46:51 +0200 Subject: [PATCH 0236/1191] fix: display form "default" property is of type int --- .../com/gooddata/md/AttributeDisplayForm.java | 11 +++---- .../gooddata/md/AttributeDisplayFormTest.java | 7 +++++ .../md/attributeDisplayForm-input.json | 2 +- .../md/attributeDisplayForm-inputOrig.json | 29 +++++++++++++++++++ .../resources/md/attributeDisplayForm.json | 2 +- 5 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 src/test/resources/md/attributeDisplayForm-inputOrig.json diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index a7ba48776..5ee597dc1 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,10 +1,9 @@ package com.gooddata.md; -import com.gooddata.util.BooleanStringDeserializer; -import com.gooddata.util.BooleanStringSerializer; +import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanIntegerSerializer; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -16,7 +15,6 @@ */ @JsonTypeName("attributeDisplayForm") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class AttributeDisplayForm extends DisplayForm implements Updatable { @@ -40,14 +38,13 @@ public boolean isDefault() { return content.isDefault(); } - @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content extends DisplayForm.Content { private final boolean isDefault; private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean isDefault, + @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean isDefault, @JsonProperty("ldmexpression") String ldmExpression, @JsonProperty("type") String type) { super(formOf, expression, ldmExpression, type); @@ -55,7 +52,7 @@ private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression } @JsonProperty("default") - @JsonSerialize(using = BooleanStringSerializer.class) + @JsonSerialize(using = BooleanIntegerSerializer.class) public boolean isDefault() { return isDefault; } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index e18f407c6..594ab6e0c 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -42,4 +42,11 @@ public void testSerialization() throws Exception { assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-input.json")); } + @Test + public void shouldSerializeSameAsDeserializationInput() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attributeDisplayForm.json"); + final AttributeDisplayForm attrDF = new ObjectMapper().readValue(stream, AttributeDisplayForm.class); + assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-inputOrig.json")); + } + } diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json index 1851cf8e6..550b75f9c 100644 --- a/src/test/resources/md/attributeDisplayForm-input.json +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -3,7 +3,7 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : "0", + "default" : 0, "type" : "TYPE", "ldmexpression" : "" }, diff --git a/src/test/resources/md/attributeDisplayForm-inputOrig.json b/src/test/resources/md/attributeDisplayForm-inputOrig.json new file mode 100644 index 000000000..845a7907f --- /dev/null +++ b/src/test/resources/md/attributeDisplayForm-inputOrig.json @@ -0,0 +1,29 @@ +{ + "attributeDisplayForm" : { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "default" : 1, + "type": "TYPE", + "ldmexpression" : "" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id.name", + "deprecated" : "0", + "summary" : "", + "title" : "Person Name", + "category" : "attributeDisplayForm", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID", + "locked": 0, + "unlisted": 0 + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm.json b/src/test/resources/md/attributeDisplayForm.json index b42ecc225..5c6daf671 100644 --- a/src/test/resources/md/attributeDisplayForm.json +++ b/src/test/resources/md/attributeDisplayForm.json @@ -3,7 +3,7 @@ "content" : { "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", - "default" : "1", + "default" : 1, "type": "TYPE", "ldmexpression" : "" }, From 155ddd9ad78d03bcb18a8115340b441e122add8f Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 15 Sep 2015 12:47:41 +0200 Subject: [PATCH 0237/1191] make custom boolean deserializers defensive --- .../com/gooddata/util/BooleanIntegerDeserializer.java | 10 +++++++++- .../com/gooddata/util/BooleanStringDeserializer.java | 10 +++++++++- .../gooddata/util/BooleanIntegerDeserializerTest.java | 6 ++++++ .../gooddata/util/BooleanStringDeserializerTest.java | 6 ++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java index 27eb820f1..5e5ace167 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java @@ -1,9 +1,12 @@ package com.gooddata.util; +import static com.gooddata.util.Validate.notNull; + import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.JsonMappingException; import java.io.IOException; @@ -17,7 +20,12 @@ public class BooleanIntegerDeserializer extends JsonDeserializer { @Override public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { final JsonNode root = jp.readValueAsTree(); - return root != null && ONE.equals(root.getNumberValue()); + notNull(root, "jsonNode"); + if (root.isInt()) { + return ONE.equals(root.getNumberValue()); + } else { + throw new JsonMappingException("Expected int value: " + root.asText(), jp.getCurrentLocation()); + } } } \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java index f28fc8b53..c460c4926 100644 --- a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java @@ -1,9 +1,12 @@ package com.gooddata.util; +import static com.gooddata.util.Validate.notNull; + import org.codehaus.jackson.JsonNode; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.map.DeserializationContext; import org.codehaus.jackson.map.JsonDeserializer; +import org.codehaus.jackson.map.JsonMappingException; import java.io.IOException; @@ -15,7 +18,12 @@ public class BooleanStringDeserializer extends JsonDeserializer { @Override public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { final JsonNode root = jp.readValueAsTree(); - return root != null && "1".equals(root.getTextValue()); + notNull(root, "jsonNode"); + if (root.isTextual()) { + return "1".equals(root.getTextValue()); + } else { + throw new JsonMappingException("Expected textual value: " + root.asText(), jp.getCurrentLocation()); + } } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java index 72ad2c8c7..8f6d915c7 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java @@ -1,6 +1,7 @@ package com.gooddata.util; import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; @@ -32,4 +33,9 @@ public void shouldDeserializeFalse() throws Exception { final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); assertThat(moo.isFoo(), is(false)); } + + @Test(expectedExceptions = JsonMappingException.class) + public void shouldThrowOnDeserializingString() throws Exception { + MAPPER.readValue("{\"foo\":\"1\"}", BooleanIntegerClass.class); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java index c9da683d8..33c7bda05 100644 --- a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java @@ -1,6 +1,7 @@ package com.gooddata.util; import org.codehaus.jackson.JsonNode; +import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; import org.testng.annotations.Test; @@ -32,4 +33,9 @@ public void shouldDeserializeFalse() throws Exception { final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); assertThat(moo.isFoo(), is(false)); } + + @Test(expectedExceptions = JsonMappingException.class) + public void shouldThrowOnDeserializingInt() throws Exception { + MAPPER.readValue("{\"foo\":0}", BooleanStringClass.class); + } } \ No newline at end of file From d0b60aa7eeea8dfa3dba7761075d818c29ad44b0 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 15 Sep 2015 13:20:02 +0200 Subject: [PATCH 0238/1191] fix: add all attribute fields and make de/serialization defensive --- src/main/java/com/gooddata/md/Attribute.java | 5 +- .../java/com/gooddata/md/NestedAttribute.java | 123 +++++++++++++++++- .../java/com/gooddata/md/AttributeTest.java | 17 +++ .../resources/md/attribute-inputOrig.json | 71 ++++++++++ src/test/resources/md/attribute.json | 10 ++ 5 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 src/test/resources/md/attribute-inputOrig.json diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index de8795569..a04cf860f 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -6,7 +6,6 @@ import static java.util.Arrays.asList; import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -19,7 +18,6 @@ */ @JsonTypeName("attribute") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Attribute extends NestedAttribute implements Queryable, Updatable { @@ -30,6 +28,7 @@ private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Nest /* Just for serialization test */ Attribute(String title, Key primaryKey, Key foreignKey) { - this(new Meta(title), new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null)); + this(new Meta(title), new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null, null, null, null, null, + null, null, null, null, null, null)); } } diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index dad33f767..068a890be 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -63,21 +63,95 @@ public boolean hasDimension() { return getDimensionLink() != null; } - @JsonIgnoreProperties(ignoreUnknown = true) + @JsonIgnore + public Collection getRelations() { + return content.getRelations(); + } + + @JsonIgnore + public String getDirection() { + return content.getDirection(); + } + + @JsonIgnore + public String getSort() { + return content.getSort(); + } + + @JsonIgnore + public String getType() { + return content.getType(); + } + + @JsonIgnore + public Collection getCompositeAttribute() { + return content.getCompositeAttribute(); + } + + @JsonIgnore + public Collection getCompositeAttributePk() { + return content.getCompositeAttributePk(); + } + + @JsonIgnore + public String getDrillDownStepDisplayFormLink() { + return content.getDrillDownStepDisplayFormLink(); + } + + @JsonIgnore + public String getLinkedDisplayFormLink() { + return content.getLinkedDisplayFormLink(); + } + + @JsonIgnore + public Collection getFolders() { + return content.getFolders(); + } + + @JsonIgnore + public Collection getGrain() { + return content.getGrain(); + } + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) protected static class Content { private final Collection pk; private final Collection fk; private final Collection displayForms; private final String dimension; + private final String direction; + private final String sort; + private final String type; + private final Collection rel; + private final Collection compositeAttribute; + private final Collection compositeAttributePk; + private final String drillDownStepAttributeDF; + private final String linkAttributeDF; + private final Collection folders; + private final Collection grain; @JsonCreator - public Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, - @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension) { + protected Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, + @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension, + @JsonProperty("direction") String direction, @JsonProperty("sort") String sort, @JsonProperty("type") String type, + @JsonProperty("rel") Collection rel, @JsonProperty("compositeAttribute") Collection compositeAttribute, + @JsonProperty("compositeAttributePk") Collection compositeAttributePk, + @JsonProperty("drillDownStepAttributeDF") String drillDownStepAttributeDF, @JsonProperty("linkAttributeDF") String linkAttributeDF, + @JsonProperty("folders") Collection folders, @JsonProperty("grain") Collection grain) { this.pk = pk; this.fk = fk; this.displayForms = displayForms; this.dimension = dimension; + this.direction = direction; + this.sort = sort; + this.type = type; + this.rel = rel; + this.compositeAttribute = compositeAttribute; + this.compositeAttributePk = compositeAttributePk; + this.drillDownStepAttributeDF = drillDownStepAttributeDF; + this.linkAttributeDF = linkAttributeDF; + this.folders = folders; + this.grain = grain; } public Collection getPk() { @@ -96,6 +170,49 @@ public Collection getDisplayForms() { public String getDimensionLink() { return dimension; } + + public String getDirection() { + return direction; + } + + public String getSort() { + return sort; + } + + public String getType() { + return type; + } + + @JsonProperty("rel") + public Collection getRelations() { + return rel; + } + + public Collection getCompositeAttribute() { + return compositeAttribute; + } + + public Collection getCompositeAttributePk() { + return compositeAttributePk; + } + + @JsonProperty("drillDownStepAttributeDF") + public String getDrillDownStepDisplayFormLink() { + return drillDownStepAttributeDF; + } + + @JsonProperty("linkAttributeDF") + public String getLinkedDisplayFormLink() { + return linkAttributeDF; + } + + public Collection getFolders() { + return folders; + } + + public Collection getGrain() { + return grain; + } } } diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 46f5df818..052b2f6c2 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -56,6 +56,16 @@ public void shouldDeserialize() throws Exception { assertThat(attribute.hasDimension(), is(true)); assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); + + assertThat(attribute.getDirection(), is("asc")); + assertThat(attribute.getSort(), is("pk")); + assertThat(attribute.getType(), is("GDC.time.date")); + assertThat(attribute.getLinkedDisplayFormLink(), is("/gdc/md/PROJECT_ID/obj/DF_LINK")); + assertThat(attribute.getCompositeAttribute(), hasSize(0)); + assertThat(attribute.getCompositeAttributePk(), hasSize(0)); + assertThat(attribute.getFolders(), hasSize(0)); + assertThat(attribute.getGrain(), hasSize(0)); + assertThat(attribute.getRelations(), hasSize(0)); } @Test @@ -66,4 +76,11 @@ public void testSerialization() throws Exception { assertThat(attribute, serializesToJson("/md/attribute-input.json")); } + @Test + public void shouldSerializeSameAsDeserializationInput() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attribute.json"); + final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + assertThat(attribute, serializesToJson("/md/attribute-inputOrig.json")); + } + } diff --git a/src/test/resources/md/attribute-inputOrig.json b/src/test/resources/md/attribute-inputOrig.json new file mode 100644 index 000000000..dd878e9e7 --- /dev/null +++ b/src/test/resources/md/attribute-inputOrig.json @@ -0,0 +1,71 @@ +{ + "attribute": { + "content": { + "pk": [ + { + "data": "/gdc/md/PROJECT_ID/obj/PK_ID", + "type": "col" + } + ], + "direction" : "asc", + "sort" : "pk", + "type" : "GDC.time.date", + "rel" : [], + "compositeAttribute" : [], + "compositeAttributePk" : [], + "drillDownStepAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_DRILL_DOWN", + "linkAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_LINK", + "folders" : [], + "grain" : [], + "displayForms": [ + { + "content": { + "formOf": "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression": "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "ldmexpression": "[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]" + }, + "links": { + "elements": "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, + "meta": { + "author": "/gdc/account/profile/USER_ID", + "uri": "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags": "", + "created": "2014-04-11 13:45:56", + "identifier": "attr.person.id.name", + "deprecated": "0", + "summary": "", + "title": "Person Name", + "category": "attributeDisplayForm", + "updated": "2014-04-11 13:45:56", + "contributor": "/gdc/account/profile/USER_ID", + "locked": 0, + "unlisted": 0 + } + } + ], + "fk": [ + { + "data": "/gdc/md/PROJECT_ID/obj/FK_ID", + "type": "col" + } + ], + "dimension": "/gdc/md/PROJECT_ID/obj/DIM_ID" + }, + "meta": { + "author": "/gdc/account/profile/USER_ID", + "uri": "/gdc/md/PROJECT_ID/obj/28", + "tags": "", + "created": "2014-04-11 13:45:56", + "identifier": "attr.person.id", + "deprecated": "0", + "summary": "", + "title": "Person ID", + "category": "attribute", + "updated": "2014-04-11 13:45:56", + "contributor": "/gdc/account/profile/USER_ID", + "locked": 0, + "unlisted": 0 + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/attribute.json b/src/test/resources/md/attribute.json index d1be57d6e..92792e841 100644 --- a/src/test/resources/md/attribute.json +++ b/src/test/resources/md/attribute.json @@ -7,6 +7,16 @@ "type" : "col" } ], + "direction" : "asc", + "sort" : "pk", + "type" : "GDC.time.date", + "rel" : [], + "compositeAttribute" : [], + "compositeAttributePk" : [], + "drillDownStepAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_DRILL_DOWN", + "linkAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_LINK", + "folders" : [], + "grain" : [], "displayForms" : [ { "content" : { From 7778c098d85f56eeff29db2144784d637a53c685 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 15 Sep 2015 13:25:45 +0200 Subject: [PATCH 0239/1191] fix: make de/serialization defensive for all updatable md objects --- src/main/java/com/gooddata/md/Dimension.java | 3 --- src/main/java/com/gooddata/md/Fact.java | 3 --- src/main/java/com/gooddata/md/Metric.java | 2 -- src/main/java/com/gooddata/md/ScheduledMail.java | 4 ---- .../com/gooddata/md/report/GridReportDefinitionContent.java | 2 -- .../gooddata/md/report/OneNumberReportDefinitionContent.java | 4 ---- src/main/java/com/gooddata/md/report/Report.java | 2 -- src/main/java/com/gooddata/md/report/ReportDefinition.java | 2 -- .../java/com/gooddata/md/report/ReportDefinitionContent.java | 2 -- 9 files changed, 24 deletions(-) diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index 7b7fb4d2f..8aface3df 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -5,7 +5,6 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -19,7 +18,6 @@ */ @JsonTypeName("dimension") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Dimension extends AbstractObj implements Queryable, Updatable { @@ -42,7 +40,6 @@ public Collection getAttributes() { return content.getAttributes(); } - @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @JsonProperty("attributes") diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 46aa0be13..b6055155f 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -5,7 +5,6 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -20,7 +19,6 @@ */ @JsonTypeName("fact") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Fact extends AbstractObj implements Queryable, Updatable { @@ -44,7 +42,6 @@ public Collection getExpressions() { return content.getExpression(); } - @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @JsonProperty("expr") diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index dbd38ae23..ed0d27dcc 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -16,7 +16,6 @@ */ @JsonTypeName("metric") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Metric extends AbstractObj implements Queryable, Updatable { @@ -43,7 +42,6 @@ public String getFormat() { return content.getFormat(); } - @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { private final String expression; private final String format; diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 1925635ff..f10382b03 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -3,12 +3,10 @@ */ package com.gooddata.md; -import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.report.ReportExportFormat; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -25,7 +23,6 @@ */ @JsonTypeName("scheduledMail") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ScheduledMail extends AbstractObj implements Queryable, Updatable { @@ -82,7 +79,6 @@ public ScheduledMail(String title, String summary, String recurrency, LocalDate /** * Mail schedule MD object payload. */ - @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @JsonProperty("when") diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index 44fe92080..d35955728 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -5,7 +5,6 @@ import com.gooddata.md.Meta; import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -16,7 +15,6 @@ /** * Grid report definition */ -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class GridReportDefinitionContent extends ReportDefinitionContent { diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index e53cef183..bf74df86a 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -5,7 +5,6 @@ import com.gooddata.md.Meta; import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -16,7 +15,6 @@ /** * One number report definition */ -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class OneNumberReportDefinitionContent extends ReportDefinitionContent { @@ -46,7 +44,6 @@ public OneNumberVisualization getOneNumber() { return oneNumber; } - @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class OneNumberVisualization { @@ -62,7 +59,6 @@ public OneNumberLabels getLabels() { } } - @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class OneNumberLabels { diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index cb52b114f..a5eedeaea 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -24,7 +24,6 @@ */ @JsonTypeName("report") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Report extends AbstractObj implements Queryable, Updatable { @@ -57,7 +56,6 @@ public Collection getDomains() { return content.getDomains(); } - @JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content { private final Collection definitions; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 6a0195d3c..98fbb2a94 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -9,7 +9,6 @@ import com.gooddata.md.Updatable; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -20,7 +19,6 @@ */ @JsonTypeName("reportDefinition") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ReportDefinition extends AbstractObj implements Queryable, Updatable { diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index 063ed8d88..8edc42a15 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -4,7 +4,6 @@ package com.gooddata.md.report; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonSubTypes; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.map.annotate.JsonSerialize; @@ -21,7 +20,6 @@ value = OneNumberReportDefinitionContent.class) //TODO chart }) -@JsonIgnoreProperties(ignoreUnknown = true) @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public abstract class ReportDefinitionContent { From d5fe57dd4e59629ff80cb672ddc0b3ac33150281 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 15 Sep 2015 13:42:27 +0200 Subject: [PATCH 0240/1191] add missing fields to report definition --- .../OneNumberReportDefinitionContent.java | 2 +- .../gooddata/md/report/ReportDefinition.java | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index bf74df86a..0fb8709ce 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -50,7 +50,7 @@ private static class OneNumberVisualization { private final OneNumberLabels labels; @JsonCreator - private OneNumberVisualization(final OneNumberLabels labels) { + private OneNumberVisualization(@JsonProperty("labels") final OneNumberLabels labels) { this.labels = labels; } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 98fbb2a94..ed5ca5f8b 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -14,6 +14,8 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonSerialize; +import java.util.Map; + /** * Report definition */ @@ -22,19 +24,29 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ReportDefinition extends AbstractObj implements Queryable, Updatable { + private static final String EXPLAIN_LINK = "explain2"; @JsonProperty("content") private final ReportDefinitionContent content; + @JsonProperty("links") + private final Map links; + @JsonCreator - ReportDefinition(@JsonProperty("meta") Meta meta, @JsonProperty("content") ReportDefinitionContent content) { + ReportDefinition(@JsonProperty("meta") Meta meta, @JsonProperty("content") ReportDefinitionContent content, @JsonProperty("links") Map links) { super(meta); this.content = content; + this.links = links; + } + + ReportDefinition(Meta meta, ReportDefinitionContent content) { + this(meta, content, null); } /* Just for serialization test */ ReportDefinition(String title, ReportDefinitionContent content) { super(new Meta(title)); this.content = content; + this.links = null; } @JsonIgnore @@ -47,4 +59,9 @@ public Grid getGrid() { return content.getGrid(); } + @JsonIgnore + public String getExplainLink() { + return links != null ? links.get(EXPLAIN_LINK) : null; + } + } From 443c3d3263752fbbca49cdd6d3168da721dab19a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 17 Sep 2015 15:04:30 +0200 Subject: [PATCH 0241/1191] md objects summary and title are cut off to max length --- src/main/java/com/gooddata/md/Meta.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 7eb16d469..d4c746591 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -3,6 +3,8 @@ */ package com.gooddata.md; +import static org.apache.commons.lang.StringUtils.substring; + import com.gooddata.util.*; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -21,6 +23,9 @@ @JsonSerialize(include = Inclusion.NON_NULL) public class Meta implements Serializable { + private static final int SUMMARY_MAX_LENGTH = 2048; + private static final int TITLE_MAX_LENGTH = 255; + private String author; private String contributor; private DateTime created; @@ -54,8 +59,8 @@ protected Meta(@JsonProperty("author") String author, this.uri = uri; this.tags = tags; this.created = created; - this.summary = summary; - this.title = title; + this.summary = substring(summary, 0, SUMMARY_MAX_LENGTH); + this.title = substring(title, 0, TITLE_MAX_LENGTH); this.updated = updated; this.category = category; this.deprecated = deprecated; From 51f980a29bbb3ebf94889aa53efcf725e0930686 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 23 Sep 2015 11:55:27 +0200 Subject: [PATCH 0242/1191] [maven-release-plugin] prepare release gooddata-java-0.21.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7ed37bc60..51b717c03 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.20.1-SNAPSHOT + 0.21.0 ${project.artifactId} GoodData Java SDK From b5b15715a51cc8c3b8d0a747aa8f690093a65228 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 23 Sep 2015 11:55:27 +0200 Subject: [PATCH 0243/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 51b717c03..223bdb173 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.21.0 + 0.21.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From f1b4682828fa28232b936351cc59fa7b8981e4ff Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 23 Sep 2015 12:00:31 +0200 Subject: [PATCH 0244/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d617c90d7..5f70c986a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.20.0 + 0.21.0 ``` From 19068d2c8335316fb5288f31a312714b607f71b5 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Tue, 6 Oct 2015 15:25:33 +0200 Subject: [PATCH 0245/1191] Allow null warehouse token --- .../com/gooddata/warehouse/Warehouse.java | 2 +- .../com/gooddata/warehouse/WarehouseTest.java | 26 ++++++++++++++++++- .../warehouse/warehouse-null-token.json | 18 +++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/warehouse/warehouse-null-token.json diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 66b5edeb9..e0649597d 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -58,7 +58,7 @@ public Warehouse(String title, String authToken) { public Warehouse(String title, String authToken, String description) { this.title = notNull(title, "title"); - this.authorizationToken = notNull(authToken, "authToken"); + this.authorizationToken = authToken; this.description = description; } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 11b3e9590..2d92784fd 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -1,6 +1,7 @@ package com.gooddata.warehouse; import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -45,6 +46,12 @@ public void testSerialization() throws Exception { assertThat(warehouse, serializesToJson("/warehouse/warehouse.json")); } + @Test + public void testSerializationWithNullToken() throws Exception { + final Warehouse warehouse = new Warehouse(TITLE, null, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, LINKS); + assertThat(warehouse, serializesToJson("/warehouse/warehouse-null-token.json")); + } + @Test public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse.json"); @@ -61,4 +68,21 @@ public void testDeserialization() throws Exception { assertThat(warehouse.getStatus(), is(STATUS)); assertThat(warehouse.getLinks(), is(LINKS)); } -} \ No newline at end of file + + @Test + public void testDeserializationWithNullToken() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse-null-token.json"); + final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + + assertThat(warehouse.getTitle(), is(TITLE)); + assertThat(warehouse.getDescription(), is(DESCRIPTION)); + assertThat(warehouse.getAuthorizationToken(), is(nullValue())); + assertThat(warehouse.getEnvironment(), is(ENVIRONMENT)); + assertThat(warehouse.getCreatedBy(), is(CREATED_BY)); + assertThat(warehouse.getUpdatedBy(), is(UPDATED_BY)); + assertThat(warehouse.getCreated(), is(CREATED)); + assertThat(warehouse.getUpdated(), is(UPDATED)); + assertThat(warehouse.getStatus(), is(STATUS)); + assertThat(warehouse.getLinks(), is(LINKS)); + } +} diff --git a/src/test/resources/warehouse/warehouse-null-token.json b/src/test/resources/warehouse/warehouse-null-token.json new file mode 100644 index 000000000..708b11db6 --- /dev/null +++ b/src/test/resources/warehouse/warehouse-null-token.json @@ -0,0 +1,18 @@ +{ + "instance" : { + "title" : "Test", + "description" : "Storage", + "status" : "ENABLED", + "created" : "2014-05-05T08:27:33.000Z", + "updated" : "2014-05-05T08:27:34.000Z", + "createdBy" : "/gdc/account/profile/createdBy", + "updatedBy" : "/gdc/account/profile/updatedBy", + "environment" : "TESTING", + "links" : { + "self" : "/gdc/datawarehouse/instances/instanceId", + "parent" : "/gdc/datawarehouse/instances", + "users" : "/gdc/datawarehouse/instances/instanceId/users", + "jdbc" : "/gdc/datawarehouse/instances/instanceId/jdbc" + } + } +} From 9586d444a616752c644aa47b3c15ca813261bd07 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 6 Oct 2015 10:06:11 +0200 Subject: [PATCH 0246/1191] Add addUserToWarehouse feature --- .../gooddata/warehouse/WarehouseService.java | 49 ++++++++++++++++++ .../com/gooddata/warehouse/WarehouseTask.java | 5 ++ .../warehouse/WarehouseServiceIT.java | 51 +++++++++++++++++++ .../warehouse/warehouseTask-finished.json | 4 +- 4 files changed, 107 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 4f44a9477..e1f38be03 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -190,6 +190,55 @@ public PageableList listWarehouseUsers(final Warehouse warehouse, } } + /** + * Add given user to given warehouse. + * + * @param warehouse warehouse the user should be added to + * @param user user to be added + * @return added user in warehouse + */ + public FutureResult addUserToWarehouse(final Warehouse warehouse, final WarehouseUser user) { + notNull(user, "user"); + notNull(warehouse, "warehouse"); + notNull(warehouse.getId(), "warehouse.id"); + + final WarehouseTask task; + try { + task = restTemplate.postForObject(WarehouseUsers.URI, user, WarehouseTask.class, warehouse.getId()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable add user to warehouse " + warehouse.getId(), e); + } + if (task == null) { + throw new GoodDataException("Empty response when user POSTed to API"); + } + + return new PollResult<>(this, + new AbstractPollHandler + (task.getPollLink(), WarehouseTask.class, WarehouseUser.class) { + + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + return HttpStatus.CREATED.equals(response.getStatusCode()); + } + + @Override + public void handlePollResult(WarehouseTask pollResult) { + try { + final WarehouseUser newUser = restTemplate.getForObject(pollResult.getWarehouseUserLink(), WarehouseUser.class); + setResult(newUser); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("User added to warehouse, but can't get it back, uri: " + + pollResult.getWarehouseUserLink(), e); + } + } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Unable to add user to warehouse", e); + } + }); + } + /** * Updates given Warehouse. * diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index c8b6f39d3..2fcd6aa15 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -18,6 +18,7 @@ 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 final Map links; @@ -33,4 +34,8 @@ String getPollLink() { String getWarehouseLink() { return links.get(WAREHOUSE_LINK); } + + String getWarehouseUserLink() { + return links.get(WAREHOUSE_USER_LINK); + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index d8ae10a9e..f3d42e372 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -29,8 +29,10 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { private static final String TASK_DONE = "/warehouse/warehouseTask-finished.json"; private static final String WAREHOUSE_ID = "instanceId"; private static final String WAREHOUSE = "/warehouse/warehouse.json"; + private static final String WAREHOUSE_USER = "/warehouse/user.json"; 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 WarehouseTask pollingTask; private WarehouseTask finishedTask; @@ -187,4 +189,53 @@ public void shouldPageUsersList() throws Exception { final PageableList users = gd.getWarehouseService().listWarehouseUsers(warehouse, new PageRequest(2)); assertThat(users, Matchers.hasSize(2)); } + + @Test + public void shouldAddUserToWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(WAREHOUSE_USER_URI) + .respond() + .withBody(readFromResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(202) + .thenRespond() + .withBody(readFromResource(TASK_DONE)) + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(finishedTask.getWarehouseUserLink()) + .respond() + .withBody(readFromResource(WAREHOUSE_USER)) + .withStatus(200); + + final WarehouseUser created = gd.getWarehouseService().addUserToWarehouse( + warehouse, new WarehouseUser("role", "profile", null)).get(); + assertThat(created, notNullValue()); + assertThat(created.getRole(), is("admin")); + assertThat(created.getLogin(), is("foo@bar.com")); + assertThat(created.getProfile(), is("/gdc/account/profile/{profile-id}")); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailToAddUserToWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(WAREHOUSE_USER_URI) + .respond() + .withBody(readFromResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(409); + + gd.getWarehouseService().addUserToWarehouse(warehouse, new WarehouseUser("role", "profile", null)).get(); + } + } diff --git a/src/test/resources/warehouse/warehouseTask-finished.json b/src/test/resources/warehouse/warehouseTask-finished.json index a43b37299..e1f4ff0a8 100644 --- a/src/test/resources/warehouse/warehouseTask-finished.json +++ b/src/test/resources/warehouse/warehouseTask-finished.json @@ -2,8 +2,8 @@ "asyncTask": { "links": { "instance": "/gdc/datawarehouse/instances/instanceId", - "user": "user URI", - "users": "URI of users in Instance" + "user": "/gdc/datawarehouse/instances/instanceId/users/userId", + "users": "/gdc/datawarehouse/instances/instanceId/users" } } } \ No newline at end of file From abe9c1da55a45f6a5f35dade248dbea8df3e9f39 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 7 Oct 2015 16:40:01 +0200 Subject: [PATCH 0247/1191] [maven-release-plugin] prepare release gooddata-java-0.22.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 223bdb173..d7b04a1e2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.21.1-SNAPSHOT + 0.22.0 ${project.artifactId} GoodData Java SDK From 91afe2d2ded0f39fd284561430de37d3d215bfb6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 7 Oct 2015 16:40:02 +0200 Subject: [PATCH 0248/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d7b04a1e2..8261e7bc2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.22.0 + 0.22.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From ec28ec157a55085c994262ccf8408560cc8e7989 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 7 Oct 2015 17:50:59 +0200 Subject: [PATCH 0249/1191] Add role name constants to WarehouseUser --- src/main/java/com/gooddata/warehouse/WarehouseUser.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index 086df1f09..adfda6eb3 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -25,6 +25,8 @@ public class WarehouseUser { public static final String URI = WarehouseUsers.URI + "/{userId}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); + public static final String ADMIN_ROLE = "admin"; + public static final String DATA_ADMIN_ROLE = "dataAdmin"; private static final String SELF_LINK = "self"; From 759aef01cb2c34d3cb38c868888864c00ae15cd8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 7 Oct 2015 21:01:45 +0200 Subject: [PATCH 0250/1191] [maven-release-plugin] prepare release gooddata-java-0.22.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8261e7bc2..244e18995 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.22.1-SNAPSHOT + 0.22.1 ${project.artifactId} GoodData Java SDK From 7511c0138cb2eaca939f1e4f29a1b50f5e0bd2b1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 7 Oct 2015 21:01:45 +0200 Subject: [PATCH 0251/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 244e18995..6a03c61d3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.22.1 + 0.22.2-SNAPSHOT ${project.artifactId} GoodData Java SDK From b4b96bfaaae6a525f3493caf929c3e61b81834d6 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Fri, 16 Oct 2015 16:36:58 +0200 Subject: [PATCH 0252/1191] Correctly evaluate polling timeout --- .../java/com/gooddata/AbstractService.java | 2 +- .../com/gooddata/AbstractServiceTest.java | 52 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 src/test/java/com/gooddata/AbstractServiceTest.java diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index a67f1d891..41c043b1c 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -67,7 +67,7 @@ final R poll(final PollHandler handler, long timeout, final TimeUnit un if (pollOnce(handler)) { return handler.getResult(); } - if (unit != null && start + unit.toMillis(timeout) > System.currentTimeMillis()) { + if (unit != null && start + unit.toMillis(timeout) < System.currentTimeMillis()) { throw new GoodDataException("timeout"); } diff --git a/src/test/java/com/gooddata/AbstractServiceTest.java b/src/test/java/com/gooddata/AbstractServiceTest.java new file mode 100644 index 000000000..78a96bc39 --- /dev/null +++ b/src/test/java/com/gooddata/AbstractServiceTest.java @@ -0,0 +1,52 @@ +package com.gooddata; + +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RequestCallback; +import org.springframework.web.client.ResponseExtractor; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.concurrent.TimeUnit; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class AbstractServiceTest { + + private AbstractService service; + + @Mock + private RestTemplate restTemplate; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new AbstractService(restTemplate) {}; + final ClientHttpResponse response = mock(ClientHttpResponse.class); + when(response.getStatusCode()).thenReturn(HttpStatus.OK); + when(restTemplate.execute(anyString(), any(HttpMethod.class), any(RequestCallback.class), any(ResponseExtractor.class))) + .thenReturn(response); + } + + @Test + public void pollShouldSucceedWhenUnderTimeout() throws Exception { + PollHandler handler = mock(PollHandler.class); + when(handler.isFinished(any(ClientHttpResponse.class))).thenReturn(false); + when(handler.isDone()).thenReturn(false, true); + + service.poll(handler, 5, TimeUnit.SECONDS); + } + + @Test(expectedExceptions = GoodDataException.class, expectedExceptionsMessageRegExp = ".*timeout.*") + public void pollShouldThrowExceptionWhenOverTimeout() throws Exception { + PollHandler handler = mock(PollHandler.class); + service.poll(handler, 5, TimeUnit.SECONDS); + } +} From 737d77d00427886cbe93500cd0625f836ac409c8 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sat, 10 Oct 2015 13:28:28 +0200 Subject: [PATCH 0253/1191] Add How-to run acceptance tests to CONTRIBUTING.md --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c34ff211..dd421bf91 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,3 +58,16 @@ is specific enough. * When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. + +## How-tos +### Run acceptance tests +These tests have to be run against GoodData API, so one has to first set endpoint and credentials. It's being set by +environment variables: `host`, `login`, `pass`, `projectToken`, `warehouseToken`. Tests can be then run by: +`mvn verify -Pat`. + +One can also use one-liner like this: +`host=... login=... pass=... projectToken=... warehouseToken=... mvn verify -Pat` + +One can also run only subset by specifying tests or groups to be run: +`mvn -Dgroups=featureFlag,project,account verify -Pat` or +`mvn -Dit.test=FeatureFlagServiceAT,ProjectServiceAT,AccountServiceAT verify -Pat`. From 89dc5ca46166661a60d758cea940eb01c98dddea Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 29 Oct 2015 14:49:21 +0100 Subject: [PATCH 0254/1191] Introduce MaqlAst --- src/main/java/com/gooddata/md/MaqlAst.java | 77 +++++++++++++++++++ src/main/java/com/gooddata/md/Metric.java | 35 ++++++++- src/test/java/com/gooddata/md/MetricTest.java | 19 ++++- src/test/resources/md/metric-new.json | 19 ++--- src/test/resources/md/metric-out.json | 58 ++++++++++++++ 5 files changed, 190 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/gooddata/md/MaqlAst.java create mode 100644 src/test/resources/md/metric-out.json diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java new file mode 100644 index 000000000..0a40bdd51 --- /dev/null +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.md; + +import org.codehaus.jackson.annotate.JsonCreator; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonProperty; + +/** + * MAQL AST representation + */ +public class MaqlAst { + + private final String type; + private final MaqlAstPosition position; + + @JsonProperty("content") + private MaqlAst[] content; + + /** + * STRING | DATE | INT | FLOAT + */ + @JsonProperty("value") + private String value; + + @JsonCreator + public MaqlAst(@JsonProperty("type") final String type, @JsonProperty("position") final MaqlAstPosition position) { + this.type = type; + this.position = position; + } + + public String getType() { + return type; + } + + public MaqlAstPosition getPosition() { + return position; + } + + public MaqlAst[] getContent() { + return content; + } + + public void setContent(final MaqlAst[] content) { + this.content = content; + } + + public String getValue() { + return value; + } + + public void setValue(final String value) { + this.value = value; + } + + public static class MaqlAstPosition { + + private final int line; + private final int column; + + @JsonCreator + public MaqlAstPosition(@JsonProperty("column") final int column, @JsonProperty("line") final int line) { + this.column = column; + this.line = line; + } + + public int getColumn() { + return column; + } + + public int getLine() { + return line; + } + } +} + diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index ed0d27dcc..3e8909936 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -5,7 +5,6 @@ import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; @@ -42,12 +41,29 @@ public String getFormat() { return content.getFormat(); } + @JsonIgnore + public MaqlAst getMaqlAst() { + return content.getMaqlAst(); + } + + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content { + private final String expression; - private final String format; + + @JsonProperty("format") + private String format; + + @JsonProperty("tree") + private MaqlAst maqlAst; + @JsonCreator - public Content(@JsonProperty("expression") String expression, @JsonProperty("format") String format) { + public Content(@JsonProperty("expression") String expression) { + this.expression = expression; + } + + public Content(final String expression, final String format) { this.expression = expression; this.format = format; } @@ -56,8 +72,21 @@ public String getExpression() { return expression; } + public void setFormat(final String format) { + this.format = format; + } + public String getFormat() { return format; } + + public void setMaqlAst(final MaqlAst maqlAst) { + this.maqlAst = maqlAst; + } + + public MaqlAst getMaqlAst() { + return maqlAst; + } + } } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index d1c98a2ce..ca63d0c79 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -15,16 +15,27 @@ public class MetricTest { @Test public void testDeserialization() throws Exception { - final Metric metric = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/metric.json"), Metric.class); + final Metric metric = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); assertThat(metric, is(notNullValue())); - assertThat(metric.getExpression(), is("[/gdc/md/PROJECT_ID/obj/EXPR_ID]")); - assertThat(metric.getFormat(), is("FORMAT")); + assertThat(metric.getExpression(), is("SELECT AVG([/gdc/md/PROJECT_ID/obj/EXPR_ID])")); + assertThat(metric.getFormat(), is("#,##0")); + assertThat(metric.getMaqlAst().getPosition().getLine(), is(2)); + assertThat(metric.getMaqlAst().getPosition().getColumn(), is(1)); + assertThat(metric.getMaqlAst().getType(), is("metric")); + assertThat(metric.getMaqlAst().getContent().length, is(1)); } @Test public void testSerialization() throws Exception { final Metric metric = new Metric("Person Name", "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", "FORMAT"); - assertThat(metric, serializesToJson("/md/metric-new.json")); } + + @Test + public void fullJsonShouldStayTheSameAfterDeserializationAndSerializationBack() throws Exception { + final Metric metric = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + assertThat(metric, serializesToJson("/md/metric-out.json")); + } } \ No newline at end of file diff --git a/src/test/resources/md/metric-new.json b/src/test/resources/md/metric-new.json index a68ede3b3..97dd15fb9 100644 --- a/src/test/resources/md/metric-new.json +++ b/src/test/resources/md/metric-new.json @@ -1,14 +1,11 @@ { - "metric" : { - "content" : { - "expression" : "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", - "format" : "FORMAT" - }, - "meta" : { - "title" : "Person Name", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "metric": { + "content": { + "expression": "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", + "format": "FORMAT" + }, + "meta": { + "title": "Person Name" + } } - } } diff --git a/src/test/resources/md/metric-out.json b/src/test/resources/md/metric-out.json new file mode 100644 index 000000000..d05fe487b --- /dev/null +++ b/src/test/resources/md/metric-out.json @@ -0,0 +1,58 @@ +{ + "metric": { + "content": { + "format": "#,##0", + "tree": { + "content": [ + { + "content": [ + { + "value": "AVG", + "content": [ + { + "value": "/gdc/md/PROJECT_ID/obj/EXPR_ID", + "position": { + "column": 12, + "line": 2 + }, + "type": "fact object" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "function" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "expression" + } + ], + "position": { + "column": 1, + "line": 2 + }, + "type": "metric" + }, + "expression": "SELECT AVG([/gdc/md/PROJECT_ID/obj/EXPR_ID])" + }, + "meta": { + "author": "/gdc/account/profile/PROFILE_ID", + "uri": "/gdc/md/PROJECT_ID/obj/47", + "tags": "", + "created": "2015-10-10 12:56:13", + "identifier": "MY_ID", + "deprecated": "0", + "summary": "", + "isProduction": 1, + "title": "Avg shoe size", + "category": "metric", + "updated": "2015-10-10 12:56:13", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file From 241e900f1e993a24542db4cb574434e706f5829d Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 2 Nov 2015 15:01:43 +0100 Subject: [PATCH 0255/1191] add missing boolean meta fields and allow them to be null --- .../java/com/gooddata/md/AbstractObj.java | 30 ++++- src/main/java/com/gooddata/md/Meta.java | 106 ++++++++++++++---- .../java/com/gooddata/md/ScheduledMail.java | 4 +- .../java/com/gooddata/project/Project.java | 27 +++-- src/test/java/com/gooddata/md/MetaTest.java | 8 +- src/test/java/com/gooddata/md/ObjTest.java | 4 +- .../com/gooddata/project/ProjectTest.java | 10 +- src/test/resources/md/attribute-input.json | 5 +- .../resources/md/attribute-inputOrig.json | 8 +- .../md/attributeDisplayForm-input.json | 5 +- .../md/attributeDisplayForm-inputOrig.json | 4 +- src/test/resources/md/dataset-input.json | 5 +- src/test/resources/md/dimension-input.json | 5 +- src/test/resources/md/displayForm-input.json | 5 +- src/test/resources/md/fact-input.json | 5 +- src/test/resources/md/meta.json | 4 +- .../oneNumberReportDefinition-input.json | 5 +- .../resources/md/report/report-input.json | 5 +- 18 files changed, 159 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index 01bc4a12a..5564e9366 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -84,10 +84,10 @@ public String getUri() { @JsonIgnore public boolean isDeprecated() { - return meta.isDeprecated(); + return Boolean.TRUE.equals(meta.isDeprecated()); } - public void setDeprecated(boolean deprecated) { + public void setDeprecated(Boolean deprecated) { meta.setDeprecated(deprecated); } @@ -102,22 +102,40 @@ public void setIdentifier(String identifier) { @JsonIgnore public boolean isLocked() { - return meta.isLocked(); + return Boolean.TRUE.equals(meta.isLocked()); } - public void setLocked(boolean locked) { + public void setLocked(Boolean locked) { meta.setLocked(locked); } @JsonIgnore public boolean isUnlisted() { - return meta.isUnlisted(); + return Boolean.TRUE.equals(meta.isUnlisted()); } - public void setUnlisted(boolean unlisted) { + public void setUnlisted(Boolean unlisted) { meta.setUnlisted(unlisted); } + @JsonIgnore + public boolean isProduction() { + return Boolean.TRUE.equals(meta.isProduction()); + } + + public void setProduction(Boolean production) { + meta.setProduction(production); + } + + @JsonIgnore + public boolean isSharedWithSomeone() { + return Boolean.TRUE.equals(meta.isSharedWithSomeone()); + } + + public void setSharedWithSomeone(Boolean sharedWithSomeone) { + meta.setSharedWithSomeone(sharedWithSomeone); + } + /** * Get list of URIs of the given {@link Obj}s * @param objs metadata objects diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index d4c746591..714803261 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -3,8 +3,6 @@ */ package com.gooddata.md; -import static org.apache.commons.lang.StringUtils.substring; - import com.gooddata.util.*; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.annotate.JsonIgnoreProperties; @@ -16,6 +14,8 @@ import java.io.Serializable; +import static org.apache.commons.lang.StringUtils.substring; + /** * Metadata meta information (meant just for internal SDK usage) */ @@ -31,14 +31,16 @@ public class Meta implements Serializable { private DateTime created; private DateTime updated; private String summary; + private String title; private String category; private String tags; //TODO collection private String uri; - private boolean deprecated; - private String title; private String identifier; - private boolean locked; - private boolean unlisted; + private Boolean deprecated; + private Boolean production; + private Boolean locked; + private Boolean unlisted; + private Boolean sharedWithSomeone; @JsonCreator protected Meta(@JsonProperty("author") String author, @@ -50,10 +52,7 @@ protected Meta(@JsonProperty("author") String author, @JsonProperty("category") String category, @JsonProperty("tags") String tags, @JsonProperty("uri") String uri, - @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, - @JsonProperty("identifier") String identifier, - @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, - @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { + @JsonProperty("identifier") String identifier) { super(); this.author = author; this.uri = uri; @@ -63,15 +62,32 @@ protected Meta(@JsonProperty("author") String author, this.title = substring(title, 0, TITLE_MAX_LENGTH); this.updated = updated; this.category = category; - this.deprecated = deprecated; this.identifier = identifier; this.contributor = contributor; + } + + public Meta(String author, String contributor, DateTime created, DateTime updated, String summary, + String title, String category, String tags, String uri, String identifier, + Boolean deprecated, Boolean production, Boolean locked, Boolean unlisted, Boolean sharedWithSomeone) { + this.author = author; + this.contributor = contributor; + this.created = created; + this.updated = updated; + this.summary = summary; + this.title = title; + this.category = category; + this.tags = tags; + this.uri = uri; + this.identifier = identifier; + this.deprecated = deprecated; + this.production = production; this.locked = locked; this.unlisted = unlisted; + this.sharedWithSomeone = sharedWithSomeone; } public Meta(String title) { - this.title = title; + this(title, null); } public Meta(String title, String summary) { @@ -133,12 +149,18 @@ public String getUri() { return uri; } - @JsonSerialize(using = BooleanStringSerializer.class) - public boolean isDeprecated() { + /** + * Default is false/not-deprecated. + */ + @JsonProperty("deprecated") + @JsonSerialize(using = BooleanStringSerializer.class, include = Inclusion.NON_NULL) + public Boolean isDeprecated() { return deprecated; } - public void setDeprecated(boolean deprecated) { + @JsonProperty("deprecated") + @JsonDeserialize(using = BooleanStringDeserializer.class) + public void setDeprecated(Boolean deprecated) { this.deprecated = deprecated; } @@ -150,21 +172,63 @@ public void setIdentifier(String identifier) { this.identifier = identifier; } - @JsonSerialize(using = BooleanIntegerSerializer.class) - public boolean isLocked() { + /** + * Is the object production or not? Defaults to true. + */ + @JsonProperty("isProduction") + @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + public Boolean isProduction() { + return production; + } + + @JsonProperty("isProduction") + @JsonDeserialize(using = BooleanIntegerDeserializer.class) + public void setProduction(final Boolean production) { + this.production = production; + } + + /** + * Flag that MD object is locked; default is false/unlocked. + */ + @JsonProperty("locked") + @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + public Boolean isLocked() { return locked; } - public void setLocked(boolean locked) { + @JsonProperty("locked") + @JsonDeserialize(using = BooleanIntegerDeserializer.class) + public void setLocked(Boolean locked) { this.locked = locked; } - @JsonSerialize(using = BooleanIntegerSerializer.class) - public boolean isUnlisted() { + /** + * Default is false/listed. + */ + @JsonProperty("unlisted") + @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + public Boolean isUnlisted() { return unlisted; } - public void setUnlisted(boolean unlisted) { + @JsonProperty("unlisted") + @JsonDeserialize(using = BooleanIntegerDeserializer.class) + public void setUnlisted(Boolean unlisted) { this.unlisted = unlisted; } + + /** + * Is the linked object shared with someone via ACLs? + */ + @JsonProperty("sharedWithSomeone") + @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + public Boolean isSharedWithSomeone() { + return sharedWithSomeone; + } + + @JsonProperty("sharedWithSomeone") + @JsonDeserialize(using = BooleanIntegerDeserializer.class) + public void setSharedWithSomeone(final Boolean sharedWithSomeone) { + this.sharedWithSomeone = sharedWithSomeone; + } } diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index f10382b03..153f25c57 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -37,7 +37,7 @@ public class ScheduledMail extends AbstractObj implements Queryable, Updatable { private ScheduledMail(String title, String summary, String tags, boolean deprecated, String recurrency, 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, deprecated, null, false, false)); + super(new Meta(null, null, null, null, summary, title, null, tags, null, null, deprecated, null, false, false, null)); notNull(toAddresses, "toAddresses"); notNull(subject, "subject"); notNull(body, "body"); @@ -52,7 +52,7 @@ private ScheduledMail(String title, String summary, String tags, boolean depreca * @param summary the summary of the MD object */ public ScheduledMail(String title, String summary) { - super(new Meta(null, null, null, null, summary, title, null, "", null, false, null, false, false)); + super(new Meta(null, null, null, null, summary, title, null, "", null, null, false, null, false, false, 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 0c8262625..6b5d57f2b 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -15,6 +15,7 @@ import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; +import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; @@ -31,7 +32,7 @@ @JsonTypeName("project") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonSerialize(include = Inclusion.NON_NULL) public class Project { public static final String PROJECTS_URI = "/gdc/account/profile/{id}/projects"; @@ -261,7 +262,7 @@ public void setEnvironment(final Environment environment) { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonSerialize(include = Inclusion.NON_NULL) private static class ProjectContent { @JsonProperty("authorizationToken") @@ -476,18 +477,24 @@ private static class ProjectMeta extends Meta { private String projectTemplate; @JsonCreator - private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("contributor") String contributor, + private ProjectMeta(@JsonProperty("author") String author, + @JsonProperty("contributor") String contributor, @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, - @JsonProperty("summary") String summary, @JsonProperty("title") String title, - @JsonProperty("category") String category, @JsonProperty("tags") String tags, + @JsonProperty("summary") String summary, + @JsonProperty("title") String title, + @JsonProperty("category") String category, + @JsonProperty("tags") String tags, @JsonProperty("uri") String uri, - @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, - @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { - super(author, contributor, created, updated, summary, title, category, tags, uri, deprecated, identifier, - locked, unlisted); + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean deprecated, + @JsonProperty("isProduction") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean production, + @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean unlisted, + @JsonProperty("sharedWithSomeone") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean sharedWithSomeone) { + super(author, contributor, created, updated, summary, title, category, tags, uri, identifier, + deprecated, production, locked, unlisted, sharedWithSomeone); + } private ProjectMeta(String title) { diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index fba867d00..7e1612ba0 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -28,6 +28,8 @@ public class MetaTest { public static final String IDENTIFIER = "attr.person.id.name"; public static final boolean LOCKED = false; public static final boolean UNLISTED = true; + public static final boolean PRODUCTION = true; + public static final boolean SHARED_WITH_SOMEONE = false; @Test public void testDeserialization() throws Exception { @@ -46,12 +48,14 @@ public void testDeserialization() throws Exception { assertThat(meta.getIdentifier(), is(IDENTIFIER)); assertThat(meta.isLocked(), is(LOCKED)); assertThat(meta.isUnlisted(), is(UNLISTED)); + assertThat(meta.isProduction(), is(PRODUCTION)); + assertThat(meta.isSharedWithSomeone(), is(SHARED_WITH_SOMEONE)); } @Test public void testSerialization() throws Exception { - final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, - DEPRECATED, IDENTIFIER, LOCKED, UNLISTED); + final Meta meta = new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, + DEPRECATED, PRODUCTION, LOCKED, UNLISTED, SHARED_WITH_SOMEONE); assertThat(meta, serializesToJson("/md/meta.json")); } diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 478e526eb..cb933e531 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -56,8 +56,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final ConcreteObj obj = new ConcreteObj( - new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, DEPRECATED, - IDENTIFIER, LOCKED, UNLISTED) + new Meta(AUTHOR, CONTRIBUTOR, CREATED, UPDATED, SUMMARY, TITLE, CATEGORY, TAGS, URI, IDENTIFIER, + DEPRECATED, null, LOCKED, UNLISTED, null) ); assertThat(obj, serializesToJson("/md/objCommon.json")); diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 7b523e8e1..608b119a8 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,6 +1,11 @@ package com.gooddata.project; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; +import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonTypeInfo; +import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.ObjectMapper; +import org.codehaus.jackson.map.annotate.JsonSerialize; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -12,6 +17,9 @@ import static org.hamcrest.core.StringStartsWith.startsWith; import static org.hamcrest.MatcherAssert.assertThat; +import com.gooddata.md.AbstractObj; +import com.gooddata.md.Meta; + public class ProjectTest { @Test @@ -80,11 +88,11 @@ public void testSerialize() throws Exception { assertThat(serializedProject, not(containsString("\"contributor\""))); assertThat(serializedProject, not(containsString("\"created\""))); assertThat(serializedProject, not(containsString("\"updated\""))); + assertThat(serializedProject, not(containsString("\"deprecated\""))); assertThat(serializedProject, not(containsString("\"links\""))); } - @Test public void testDeserializeVerticaProject() throws Exception { final Project project = new ObjectMapper() diff --git a/src/test/resources/md/attribute-input.json b/src/test/resources/md/attribute-input.json index 7ea88e071..bbafb463d 100644 --- a/src/test/resources/md/attribute-input.json +++ b/src/test/resources/md/attribute-input.json @@ -16,10 +16,7 @@ ] }, "meta" : { - "title" : "Person ID", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person ID" } } } \ No newline at end of file diff --git a/src/test/resources/md/attribute-inputOrig.json b/src/test/resources/md/attribute-inputOrig.json index dd878e9e7..0c472f62f 100644 --- a/src/test/resources/md/attribute-inputOrig.json +++ b/src/test/resources/md/attribute-inputOrig.json @@ -38,9 +38,7 @@ "title": "Person Name", "category": "attributeDisplayForm", "updated": "2014-04-11 13:45:56", - "contributor": "/gdc/account/profile/USER_ID", - "locked": 0, - "unlisted": 0 + "contributor": "/gdc/account/profile/USER_ID" } } ], @@ -63,9 +61,7 @@ "title": "Person ID", "category": "attribute", "updated": "2014-04-11 13:45:56", - "contributor": "/gdc/account/profile/USER_ID", - "locked": 0, - "unlisted": 0 + "contributor": "/gdc/account/profile/USER_ID" } } } \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm-input.json b/src/test/resources/md/attributeDisplayForm-input.json index 550b75f9c..21a799eb6 100644 --- a/src/test/resources/md/attributeDisplayForm-input.json +++ b/src/test/resources/md/attributeDisplayForm-input.json @@ -11,10 +11,7 @@ "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" }, "meta" : { - "title" : "Person Name", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person Name" } } } \ No newline at end of file diff --git a/src/test/resources/md/attributeDisplayForm-inputOrig.json b/src/test/resources/md/attributeDisplayForm-inputOrig.json index 845a7907f..5c6daf671 100644 --- a/src/test/resources/md/attributeDisplayForm-inputOrig.json +++ b/src/test/resources/md/attributeDisplayForm-inputOrig.json @@ -21,9 +21,7 @@ "title" : "Person Name", "category" : "attributeDisplayForm", "updated" : "2014-04-11 13:45:56", - "contributor" : "/gdc/account/profile/USER_ID", - "locked": 0, - "unlisted": 0 + "contributor" : "/gdc/account/profile/USER_ID" } } } \ No newline at end of file diff --git a/src/test/resources/md/dataset-input.json b/src/test/resources/md/dataset-input.json index f4ef07faf..ea89d6c04 100644 --- a/src/test/resources/md/dataset-input.json +++ b/src/test/resources/md/dataset-input.json @@ -8,10 +8,7 @@ "hasUploadConfiguration": "0" }, "meta" : { - "title" : "Dataset", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Dataset" } } } \ No newline at end of file diff --git a/src/test/resources/md/dimension-input.json b/src/test/resources/md/dimension-input.json index 991562641..b4ebc2a5e 100644 --- a/src/test/resources/md/dimension-input.json +++ b/src/test/resources/md/dimension-input.json @@ -4,10 +4,7 @@ "attributes" : [] }, "meta" : { - "title" : "Dimension", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Dimension" } } } \ No newline at end of file diff --git a/src/test/resources/md/displayForm-input.json b/src/test/resources/md/displayForm-input.json index dee83bd0d..8ddb15aad 100644 --- a/src/test/resources/md/displayForm-input.json +++ b/src/test/resources/md/displayForm-input.json @@ -8,9 +8,6 @@ "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" }, "meta" : { - "title" : "Person Name", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person Name" } } \ No newline at end of file diff --git a/src/test/resources/md/fact-input.json b/src/test/resources/md/fact-input.json index 736bd2e3b..022d842e4 100644 --- a/src/test/resources/md/fact-input.json +++ b/src/test/resources/md/fact-input.json @@ -9,10 +9,7 @@ ] }, "meta" : { - "title" : "Person Shoe Size", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Person Shoe Size" } } } diff --git a/src/test/resources/md/meta.json b/src/test/resources/md/meta.json index 38753329f..f0c288d75 100644 --- a/src/test/resources/md/meta.json +++ b/src/test/resources/md/meta.json @@ -11,5 +11,7 @@ "updated": "2014-04-11 13:45:57", "contributor": "/gdc/account/profile/CONTRIBUTOR_USER_ID", "locked": 0, - "unlisted": 1 + "unlisted": 1, + "isProduction": 1, + "sharedWithSomeone": 0 } diff --git a/src/test/resources/md/report/oneNumberReportDefinition-input.json b/src/test/resources/md/report/oneNumberReportDefinition-input.json index 4cb562329..6ed6028f7 100644 --- a/src/test/resources/md/report/oneNumberReportDefinition-input.json +++ b/src/test/resources/md/report/oneNumberReportDefinition-input.json @@ -20,10 +20,7 @@ "filters" : [ { "expression" : "(SELECT [/gdc/md/projectId/obj/123]) >= 2" } ] }, "meta" : { - "title" : "Untitled", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Untitled" } } } diff --git a/src/test/resources/md/report/report-input.json b/src/test/resources/md/report/report-input.json index f71daab1a..51963d408 100644 --- a/src/test/resources/md/report/report-input.json +++ b/src/test/resources/md/report/report-input.json @@ -9,10 +9,7 @@ ] }, "meta" : { - "title" : "Beers Consumed This Week", - "deprecated" : "0", - "locked": 0, - "unlisted": 0 + "title" : "Beers Consumed This Week" } } } From 205fae44af46de115542f91746a59969ca2fcf4d Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 3 Nov 2015 14:43:06 +0100 Subject: [PATCH 0256/1191] Migrate Travis builds to container-based ones See http://docs.travis-ci.com/user/migrating-from-legacy/ for more info --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 63868983a..7ddadf158 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,4 @@ jdk: branches: only: - master +sudo: false From 044c3cd7b3e8c00f14ae284f578654a82ce5a814 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 3 Nov 2015 16:34:56 +0100 Subject: [PATCH 0257/1191] trivial: fix javadoc formatting and warnings --- src/main/java/com/gooddata/GoodData.java | 1 + .../java/com/gooddata/GoodDataSettings.java | 30 +++++++++---------- src/main/java/com/gooddata/md/Meta.java | 5 ++++ .../java/com/gooddata/md/MetadataService.java | 2 ++ .../com/gooddata/project/ProjectService.java | 1 + .../gooddata/warehouse/WarehouseService.java | 1 + 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 7e2adc89b..91ce4b44e 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -165,6 +165,7 @@ public GoodData(String hostname, String login, String password, int port, GoodDa * @param password GoodData user's password * @param port GoodData Platform's API port (e.g. 443) * @param protocol GoodData Platform's API protocol (e.g. https) + * @param settings additional settings */ protected GoodData(String hostname, String login, String password, int port, String protocol, GoodDataSettings settings) { notEmpty(hostname, "hostname"); diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index a679f5c86..8e919bb11 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -7,7 +7,7 @@ /** * Gather various additional settings of {@link GoodData}. Can be passed to the {@link GoodData} constructor to tune up * it's behaviour. - *

+ *

* Settings are applied only once at the beginning. Changing this bean after it's passed to {@link GoodData} has * no effect. */ @@ -22,7 +22,7 @@ public class GoodDataSettings { /** * Set maximum number of connections used. This applies same for connections per host as for total connections. * (As we assume GoodData connects to single host). - *

+ *

* The default value is 20. * * @param maxConnections maximum number of connections used. @@ -43,9 +43,9 @@ public int getMaxConnections() { /** * Set timeout milliseconds until connection established. - *

+ *

* The default value is 10 seconds (10000 ms). - *

+ *

* Set to 0 for infinite. * * @param connectionTimeout connection timeout milliseconds @@ -57,9 +57,9 @@ public void setConnectionTimeout(int connectionTimeout) { /** * Set timeout seconds until connection established. - *

+ *

* The default value is 10 seconds. - *

+ *

* Set to 0 for infinite. * * @param connectionTimeout connection timeout seconds @@ -79,9 +79,9 @@ public int getConnectionTimeout() { /** * Set timeout in milliseconds used when requesting a connection from the connection manager. - *

+ *

* The default value is 10 seconds (10000 ms). - *

+ *

* Set to 0 for infinite. * * @param connectionRequestTimeout connection request timeout milliseconds @@ -93,11 +93,11 @@ public void setConnectionRequestTimeout(final int connectionRequestTimeout) { /** * Set timeout in seconds used when requesting a connection from the connection manager. - *

+ *

* The default value is 10 seconds. - *

+ *

* Set to 0 for infinite. - *

+ *

* * @param connectionRequestTimeout connection request timeout seconds */ @@ -116,9 +116,9 @@ public int getConnectionRequestTimeout() { /** * Set socket timeout (maximum period inactivity between two consecutive data packets) milliseconds. - *

+ *

* The default value is 60 seconds (60000 ms). - *

+ *

* Set to 0 for infinite. * * @param socketTimeout socket timeout milliseconds @@ -130,9 +130,9 @@ public void setSocketTimeout(int socketTimeout) { /** * Set socket timeout (maximum period inactivity between two consecutive data packets) seconds. - *

+ *

* The default value is 60 seconds. - *

+ *

* Set to 0 for infinite. * * @param socketTimeout socket timeout seconds diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 714803261..3d37181f4 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -151,6 +151,7 @@ public String getUri() { /** * Default is false/not-deprecated. + * @return true when the linked object is deprecated, null if not set */ @JsonProperty("deprecated") @JsonSerialize(using = BooleanStringSerializer.class, include = Inclusion.NON_NULL) @@ -174,6 +175,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") @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) @@ -189,6 +191,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") @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) @@ -204,6 +207,7 @@ public void setLocked(Boolean locked) { /** * Default is false/listed. + * @return true when the linked object is unlisted, null if not set */ @JsonProperty("unlisted") @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) @@ -219,6 +223,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") @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index abb8495e6..221cd6594 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -300,6 +300,7 @@ public Collection findUris(Project project, /** * Find all objects which use the given object. + * @param project project * @param obj object to find using objects for * @param nearest find nearest objects only * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', @@ -313,6 +314,7 @@ public Collection usedBy(Project project, Obj obj, boolean nearest, Class /** * Find all objects which use the given object. + * @param project project * @param uri URI of object to find using objects for * @param nearest find nearest objects only * @param types what types (categories) to search for (for example 'reportDefinition', 'report', 'tableDataLoad', diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index fdd952c8b..0b76fb5cb 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -403,6 +403,7 @@ public List listFeatureFlags(Project project) { * * @param project project for which the feature flag should be created, cannot be null * @param featureFlag feature flag to be created, cannot be null + * @return created feature flag */ public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { notNull(project, "project"); diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index e1f38be03..5f978d8a2 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -157,6 +157,7 @@ public PageableList listWarehouses() { * Lists Warehouses. Returns empty list in case there are no warehouses. * Returns requested page (by page limit and offset). Use {@link #listWarehouses()} to get first page with default setting. * + * @param page page to be listed * @return requested page of list of instances or empty list */ public PageableList listWarehouses(Page page) { From 837c1954ddceebb74521e7339248b2ff42196367 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Fri, 13 Nov 2015 10:38:38 +0100 Subject: [PATCH 0258/1191] Support universal connector processes polling --- .../gooddata/connector/ConnectorService.java | 68 +++++++++++++------ .../connector/IntegrationProcessStatus.java | 22 +++++- .../com/gooddata/connector/ProcessStatus.java | 8 ++- .../connector/ConnectorServiceIT.java | 44 +++++++++++- .../IntegrationProcessStatusTest.java | 24 ++++--- .../gooddata/connector/ProcessStatusTest.java | 2 + .../integration-scheduled-process.json | 48 +++++++++++++ 7 files changed, 178 insertions(+), 38 deletions(-) create mode 100644 src/test/resources/connector/integration-scheduled-process.json diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index c79dea10f..23f4f9b90 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -20,8 +20,10 @@ import java.io.IOException; import java.util.Collection; +import java.util.Map; import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; /** * Service for connector integration creation, update of its settings or execution of its process. @@ -197,31 +199,55 @@ public FutureResult executeProcess(final Project project, final P try { final UriResponse response = restTemplate .postForObject(ProcessStatus.URL, execution, UriResponse.class, project.getId(), connectorType); - return new PollResult<>(this, new SimplePollHandler(response.getUri(), ProcessStatus.class) { - @Override - public boolean isFinished(final ClientHttpResponse response) throws IOException { - final ProcessStatus process = extractData(response, ProcessStatus.class); - return process.isFinished(); - } - - @Override - public void handlePollResult(final ProcessStatus pollResult) { - super.handlePollResult(pollResult); - if (pollResult.isFailed()) { - throw new ConnectorException(connectorType + " process failed: " + - pollResult.getStatus().getDescription()); - } - } - - @Override - public void handlePollException(final GoodDataRestException e) { - throw new ConnectorException(connectorType + " process failed: " + e.getText(), e); - } - }); + return createProcessPollResult(response.getUri()); } catch (GoodDataRestException | RestClientException e) { throw new ConnectorException("Unable to execute " + connectorType + " process", e); } } + /** + * Gets status of provided connector process. + *

+ * You can use process retrieved by getXXXProcess methods on {@link Integration} as well as a result of + * {@link ConnectorService#executeProcess(Project, ProcessExecution)}. + * + * @param process process to be executed + * @return executed process + * @throws ConnectorException if process execution fails + */ + public FutureResult getProcessStatus(final IntegrationProcessStatus process) { + notNull(process, "process"); + notNull(process.getUri(), "process.getUri"); + return createProcessPollResult(process.getUri()); + } + + private FutureResult createProcessPollResult(final String uri) { + final Map match = IntegrationProcessStatus.TEMPLATE.match(uri); + final String connectorType = match.get("connector"); + final String processId = match.get("process"); + return new PollResult<>(this, new SimplePollHandler(uri, ProcessStatus.class) { + @Override + public boolean isFinished(final ClientHttpResponse response) throws IOException { + final ProcessStatus process = extractData(response, ProcessStatus.class); + return process.isFinished(); + } + + @Override + public void handlePollResult(final ProcessStatus pollResult) { + super.handlePollResult(pollResult); + if (pollResult.isFailed()) { + throw new ConnectorException(format("%s process %s failed: %s", connectorType, processId, + pollResult.getStatus().getDescription())); + } + } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ConnectorException(format("%s process %s failed: %s", connectorType, processId, + e.getText()), e); + } + }); + } + } diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index 722ff1169..4826a467e 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -12,6 +12,9 @@ import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.joda.time.DateTime; +import org.springframework.web.util.UriTemplate; + +import java.util.Map; /** * Connector process (i.e. single ETL run) status used in integration object. Deserialization only. @@ -20,17 +23,24 @@ @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class IntegrationProcessStatus { + public static final String URI = "/gdc/projects/{project}/connectors/{connector}/integration/processes/{process}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + private static final String SELF_LINK = "self"; + private final Status status; private final DateTime started; private final DateTime finished; + private Map links; @JsonCreator protected IntegrationProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime started, - @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished) { + @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished, + @JsonProperty("links") Map links) { this.status = status; this.started = started; this.finished = finished; + this.links = links; } public Status getStatus() { @@ -68,4 +78,14 @@ public boolean isFinished() { public boolean isFailed() { return status != null && status.isFailed(); } + + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK): null; + } + + @JsonIgnore + public String getId() { + return TEMPLATE.match(getUri()).get("process"); + } } diff --git a/src/main/java/com/gooddata/connector/ProcessStatus.java b/src/main/java/com/gooddata/connector/ProcessStatus.java index 14e11c8de..c8f8885b7 100644 --- a/src/main/java/com/gooddata/connector/ProcessStatus.java +++ b/src/main/java/com/gooddata/connector/ProcessStatus.java @@ -10,9 +10,10 @@ import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeName; import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; import org.joda.time.DateTime; +import java.util.Map; + /** * Connector process (i.e. single ETL run) status (standalone, not embedded in integration as its parent) . * Deserialization only. @@ -27,8 +28,9 @@ public class ProcessStatus extends IntegrationProcessStatus { @JsonCreator ProcessStatus(@JsonProperty("status") Status status, @JsonProperty("started") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime started, - @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished) { - super(status, started, finished); + @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished, + @JsonProperty("links") Map links) { + super(status, started, finished, links); } } diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 8390198f5..28471e76f 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -2,10 +2,8 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; -import com.gooddata.JsonMatchers; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -13,6 +11,7 @@ import static com.gooddata.connector.Status.Code.ERROR; import static com.gooddata.connector.Status.Code.SYNCHRONIZED; import static com.gooddata.util.ResourceUtils.*; +import static java.util.Collections.singletonMap; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -118,7 +117,7 @@ public void shouldExecuteProcess() throws Exception { assertThat(process.getStatus().getCode(), is(SYNCHRONIZED.name())); } - @Test(expectedExceptions = ConnectorException.class, expectedExceptionsMessageRegExp = ".*process failed.*") + @Test(expectedExceptions = ConnectorException.class, expectedExceptionsMessageRegExp = ".*zendesk4 process PROCESS failed.*") public void shouldFailExecuteProcessPolling() throws Exception { onRequest() .havingMethodEqualTo("POST") @@ -149,6 +148,45 @@ public void shouldFailExecuteProcess() throws Exception { assertThat(process.getStatus().getCode(), is(ERROR.name())); } + @Test + public void shouldGetProcessStatus() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID") + .respond() + .withBody(readFromResource("/connector/process-status-scheduled.json")) + .thenRespond() + .withBody(readFromResource("/connector/process-status-finished.json")); + + final IntegrationProcessStatus runningProcess = new IntegrationProcessStatus(null, null, null, + singletonMap("self", "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID")); + final ProcessStatus process = connectors.getProcessStatus(runningProcess).get(); + assertThat(process.getStatus().getCode(), is(SYNCHRONIZED.name())); + } + + @Test(expectedExceptions = ConnectorException.class, expectedExceptionsMessageRegExp = ".*zendesk4 process PROCESS_ID failed.*") + public void shouldFailGetProcessStatusPolling() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID") + .respond() + .withStatus(400); + final IntegrationProcessStatus runningProcess = new IntegrationProcessStatus(null, null, null, + singletonMap("self", "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID")); + connectors.getProcessStatus(runningProcess).get(); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailGetProcessStatus() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID") + .respond() + .withBody(readFromResource("/connector/process-status-error.json")); + + final IntegrationProcessStatus runningProcess = new IntegrationProcessStatus(null, null, null, + singletonMap("self", "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID")); + final ProcessStatus process = connectors.getProcessStatus(runningProcess).get(); + assertThat(process.getStatus().getCode(), is(ERROR.name())); + } + @Test public void shouldGetSettings() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index 455c295e3..2824ced83 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -8,6 +8,8 @@ import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import java.util.Collections; + import static com.gooddata.connector.Status.Code.ERROR; import static com.gooddata.connector.Status.Code.SYNCHRONIZED; import static com.gooddata.connector.Status.Code.UPLOADING; @@ -32,65 +34,67 @@ public void testShouldDeserialize() throws Exception { assertThat(process.getStatus().getCode(), is(ERROR.name())); assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); assertThat(process.getStatus().getDescription(), is(nullValue())); + assertThat(process.getUri(), is("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/FINISHED_PROCESS_ID")); + assertThat(process.getId(), is("FINISHED_PROCESS_ID")); } @Test public void testIsFinishedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnUploading() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFailedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnUserError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } diff --git a/src/test/java/com/gooddata/connector/ProcessStatusTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java index 51e7c7ed0..c2738cf29 100644 --- a/src/test/java/com/gooddata/connector/ProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -22,6 +22,8 @@ public void shouldDeserialize() throws Exception { assertThat(process.getStatus().getCode(), is(ERROR.name())); assertThat(process.getStatus().getDetail(), is("GDC-INTERNAL-ERROR")); assertThat(process.getStatus().getDescription(), is("Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com")); + assertThat(process.getUri(), is("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID")); + assertThat(process.getId(), is("PROCESS_ID")); } } diff --git a/src/test/resources/connector/integration-scheduled-process.json b/src/test/resources/connector/integration-scheduled-process.json new file mode 100644 index 000000000..9303c1c7e --- /dev/null +++ b/src/test/resources/connector/integration-scheduled-process.json @@ -0,0 +1,48 @@ +{ + "integration" : { + "projectTemplate" : "/projectTemplates/template", + "active" : true, + "lastFinishedProcess" : { + "status" : { + "code" : "ERROR", + "detail" : "GDC-INTERNAL-ERROR", + "description" : "Data load unsuccessful. Please check your settings and try again or contact us at support@gooddata.com" + }, + "started" : "2014-05-30T07:50:15.000Z", + "finished" : "2014-05-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/FINISHED_PROCESS_ID" + } + }, + "lastSuccessfulProcess" : { + "status" : { + "code" : "SYNCHRONIZED", + "detail" : null, + "description" : null + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : "2014-04-30T07:50:50.000Z", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/SUCCESSFUL_PROCESS_ID" + } + }, + "runningProcess" : { + "status" : { + "code" : "SCHEDULED", + "detail" : "", + "description" : "" + }, + "started" : "2014-04-30T07:50:15.000Z", + "finished" : null, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS_ID" + } + }, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration", + "processes" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes", + "configuration" : "/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/settings" + }, + "ui" : { } + } +} From a4e56d2cd841761f337f6a4c270fc6d795e1135b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Nov 2015 10:36:47 +0100 Subject: [PATCH 0259/1191] [maven-release-plugin] prepare release gooddata-java-0.23.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a03c61d3..a55cfaf06 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.22.2-SNAPSHOT + 0.23.0 ${project.artifactId} GoodData Java SDK From e1a11d374cab9cdf768d65bbefc71e1b155d34af Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Nov 2015 10:36:49 +0100 Subject: [PATCH 0260/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a55cfaf06..4bf7c73df 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ cz.geek gooddata-java - 0.23.0 + 0.23.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 11f850dae1906cc373b2893cff853d7258207ea8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Nov 2015 10:46:10 +0100 Subject: [PATCH 0261/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5f70c986a..ae36e559d 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from cz.geek gooddata-java - 0.21.0 + 0.23.0 ``` From f98c6e0ae3f5e5303829df0625e35dc04cb6e164 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 18 Nov 2015 16:48:34 +0100 Subject: [PATCH 0262/1191] upgrade gooddata http client to fix thread and logout issues --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4bf7c73df..a775c05ca 100644 --- a/pom.xml +++ b/pom.xml @@ -237,7 +237,7 @@ com.gooddata gooddata-http-client - 0.8.3 + 0.9.2 commons-lang From 4c162f838a0953d0ac2d868b9c1874d5161b55ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 12 Nov 2015 12:26:29 +0100 Subject: [PATCH 0263/1191] migrate to Jackson 2.5.4 --- README.md | 2 +- pom.xml | 19 ++++++------ .../java/com/gooddata/AbstractService.java | 2 +- src/main/java/com/gooddata/GoodData.java | 29 +------------------ .../java/com/gooddata/account/Account.java | 14 ++++----- .../collections/PageableListDeserializer.java | 22 +++++++------- .../collections/PageableListSerializer.java | 15 +++++++--- .../java/com/gooddata/collections/Paging.java | 18 ++++++------ .../com/gooddata/connector/Integration.java | 14 ++++----- .../connector/IntegrationProcessStatus.java | 12 ++++---- .../gooddata/connector/ProcessExecution.java | 10 +++---- .../com/gooddata/connector/ProcessStatus.java | 12 ++++---- .../java/com/gooddata/connector/Settings.java | 10 +++---- .../java/com/gooddata/connector/Status.java | 8 ++--- .../gooddata/connector/Zendesk4Settings.java | 4 +-- .../dataload/processes/DataloadProcess.java | 14 ++++----- .../dataload/processes/DataloadProcesses.java | 10 +++---- .../dataload/processes/ProcessExecution.java | 8 ++--- .../processes/ProcessExecutionDetail.java | 16 +++++----- .../processes/ProcessExecutionTask.java | 10 +++---- .../gooddata/dataload/processes/Schedule.java | 18 +++++++----- .../dataload/processes/Schedules.java | 8 ++--- .../java/com/gooddata/dataset/Dataset.java | 6 ++-- .../com/gooddata/dataset/DatasetManifest.java | 16 +++++----- .../gooddata/dataset/DatasetManifests.java | 4 +-- .../java/com/gooddata/dataset/Datasets.java | 12 ++++---- .../java/com/gooddata/dataset/EtlMode.java | 12 ++++---- .../com/gooddata/dataset/EtlModeType.java | 2 +- .../java/com/gooddata/dataset/FailPart.java | 4 +-- .../java/com/gooddata/dataset/FailStatus.java | 12 ++++---- .../java/com/gooddata/dataset/LookupMode.java | 2 +- src/main/java/com/gooddata/dataset/Pull.java | 4 +-- .../java/com/gooddata/dataset/PullTask.java | 10 +++---- .../com/gooddata/dataset/PullTaskStatus.java | 6 ++-- .../java/com/gooddata/dataset/TaskState.java | 12 ++++---- .../java/com/gooddata/gdc/AbstractMaql.java | 10 +++---- src/main/java/com/gooddata/gdc/AsyncTask.java | 14 ++++----- .../java/com/gooddata/gdc/ErrorStructure.java | 8 ++--- .../java/com/gooddata/gdc/FeatureFlags.java | 8 ++--- src/main/java/com/gooddata/gdc/Gdc.java | 14 ++++----- src/main/java/com/gooddata/gdc/GdcError.java | 12 ++++---- .../java/com/gooddata/gdc/LinkEntries.java | 6 ++-- .../java/com/gooddata/gdc/TaskStatus.java | 12 ++++---- .../java/com/gooddata/gdc/UriResponse.java | 8 ++--- .../java/com/gooddata/md/AbstractObj.java | 4 +-- src/main/java/com/gooddata/md/Attachment.java | 12 ++++---- src/main/java/com/gooddata/md/Attribute.java | 10 +++---- .../com/gooddata/md/AttributeDisplayForm.java | 14 ++++----- .../com/gooddata/md/AttributeElement.java | 8 ++--- .../com/gooddata/md/AttributeElements.java | 12 ++++---- .../com/gooddata/md/DashboardAttachment.java | 4 +-- src/main/java/com/gooddata/md/Dataset.java | 14 ++++----- src/main/java/com/gooddata/md/Dimension.java | 12 ++++---- .../java/com/gooddata/md/DisplayForm.java | 10 +++---- src/main/java/com/gooddata/md/Entry.java | 10 +++---- src/main/java/com/gooddata/md/Expression.java | 8 ++--- src/main/java/com/gooddata/md/Fact.java | 12 ++++---- .../com/gooddata/md/IdentifierAndUri.java | 4 +-- .../java/com/gooddata/md/IdentifierToUri.java | 4 +-- .../com/gooddata/md/IdentifiersAndUris.java | 4 +-- src/main/java/com/gooddata/md/InUseMany.java | 14 ++++----- src/main/java/com/gooddata/md/Key.java | 8 ++--- src/main/java/com/gooddata/md/MaqlAst.java | 6 ++-- src/main/java/com/gooddata/md/Meta.java | 12 ++++---- src/main/java/com/gooddata/md/Metric.java | 12 ++++---- .../java/com/gooddata/md/NestedAttribute.java | 14 ++++----- src/main/java/com/gooddata/md/Query.java | 12 ++++---- .../com/gooddata/md/ReportAttachment.java | 4 +-- .../java/com/gooddata/md/ScheduledMail.java | 12 ++++---- .../com/gooddata/md/ScheduledMailWhen.java | 8 ++--- src/main/java/com/gooddata/md/UseMany.java | 8 ++--- .../java/com/gooddata/md/UseManyEntries.java | 8 ++--- .../gooddata/md/report/AttributeInGrid.java | 12 ++++---- .../java/com/gooddata/md/report/Filter.java | 8 ++--- .../java/com/gooddata/md/report/Grid.java | 8 ++--- .../com/gooddata/md/report/GridElement.java | 8 ++--- .../report/GridReportDefinitionContent.java | 6 ++-- .../OneNumberReportDefinitionContent.java | 6 ++-- .../java/com/gooddata/md/report/Report.java | 14 ++++----- .../gooddata/md/report/ReportDefinition.java | 12 ++++---- .../md/report/ReportDefinitionContent.java | 8 ++--- .../java/com/gooddata/model/DiffRequest.java | 12 ++++---- .../java/com/gooddata/model/MaqlDdlLinks.java | 8 ++--- .../java/com/gooddata/model/ModelDiff.java | 10 +++---- .../java/com/gooddata/project/Project.java | 18 ++++++------ .../gooddata/project/ProjectFeatureFlag.java | 14 ++++----- .../gooddata/project/ProjectFeatureFlags.java | 10 +++---- .../com/gooddata/project/ProjectTemplate.java | 8 ++--- .../gooddata/project/ProjectTemplates.java | 8 ++--- .../project/ProjectValidationResult.java | 6 ++-- ...ProjectValidationResultGdcTimeElParam.java | 8 ++--- .../project/ProjectValidationResultItem.java | 6 ++-- .../ProjectValidationResultObjectParam.java | 8 ++--- .../project/ProjectValidationResultParam.java | 6 ++-- .../ProjectValidationResultSliElParam.java | 8 ++--- .../ProjectValidationResultStringParam.java | 6 ++-- .../project/ProjectValidationResults.java | 12 ++++---- .../project/ProjectValidationType.java | 4 +-- .../gooddata/project/ProjectValidations.java | 8 ++--- .../java/com/gooddata/project/Projects.java | 8 ++--- src/main/java/com/gooddata/project/Role.java | 16 +++++----- src/main/java/com/gooddata/project/Roles.java | 10 +++---- src/main/java/com/gooddata/project/User.java | 14 ++++----- src/main/java/com/gooddata/project/Users.java | 10 +++---- .../gooddata/report/ExecuteDefinition.java | 2 +- .../com/gooddata/report/ExecuteReport.java | 2 +- .../com/gooddata/report/ReportRequest.java | 8 ++--- .../com/gooddata/report/ReportService.java | 4 +-- .../util/BooleanIntegerDeserializer.java | 12 ++++---- .../util/BooleanIntegerSerializer.java | 6 ++-- .../util/BooleanStringDeserializer.java | 12 ++++---- .../util/BooleanStringSerializer.java | 6 ++-- .../com/gooddata/util/GDDateDeserializer.java | 10 +++---- .../com/gooddata/util/GDDateSerializer.java | 6 ++-- .../gooddata/util/GDDateTimeDeserializer.java | 10 +++---- .../gooddata/util/GDDateTimeSerializer.java | 6 ++-- .../util/ISODateTimeDeserializer.java | 10 +++---- .../gooddata/util/ISODateTimeSerializer.java | 6 ++-- .../com/gooddata/warehouse/Warehouse.java | 19 ++++++------ .../com/gooddata/warehouse/WarehouseTask.java | 10 +++---- .../com/gooddata/warehouse/WarehouseUser.java | 16 +++++----- .../gooddata/warehouse/WarehouseUsers.java | 10 +++---- .../com/gooddata/warehouse/Warehouses.java | 10 +++---- .../java/com/gooddata/AbstractGoodDataIT.java | 2 +- .../gooddata/GoodDataRestExceptionTest.java | 2 +- src/test/java/com/gooddata/JsonMatchers.java | 2 +- .../com/gooddata/account/AccountTest.java | 2 +- .../com/gooddata/collections/PagingTest.java | 2 +- .../IntegrationProcessStatusTest.java | 2 +- .../gooddata/connector/IntegrationTest.java | 2 +- .../gooddata/connector/ProcessStatusTest.java | 2 +- .../connector/Zendesk4SettingsTest.java | 2 +- .../processes/DataloadProcessTest.java | 2 +- .../processes/DataloadProcessesTest.java | 2 +- .../processes/ProcessExecutionDetailTest.java | 2 +- .../processes/ProcessExecutionTaskTest.java | 2 +- .../processes/ProcessExecutionTest.java | 2 +- .../dataload/processes/ProcessServiceIT.java | 2 +- .../dataload/processes/ScheduleTest.java | 2 +- .../dataload/processes/SchedulesTest.java | 2 +- .../gooddata/dataset/DatasetManifestTest.java | 2 +- .../com/gooddata/dataset/DatasetsTest.java | 2 +- .../com/gooddata/dataset/FailStatusTest.java | 2 +- .../com/gooddata/dataset/MaqlDmlTest.java | 2 +- .../gooddata/dataset/PullTaskStatusTest.java | 2 +- .../com/gooddata/dataset/PullTaskTest.java | 2 +- .../com/gooddata/dataset/TaskStateTest.java | 2 +- .../java/com/gooddata/gdc/AsyncTaskTest.java | 2 +- .../com/gooddata/gdc/ErrorStructureTest.java | 2 +- .../java/com/gooddata/gdc/GdcErrorTest.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 2 +- .../com/gooddata/gdc/LinkEntriesTest.java | 2 +- .../java/com/gooddata/gdc/TaskStatusTest.java | 2 +- .../com/gooddata/gdc/UriResponseTest.java | 2 +- .../gooddata/md/AttributeDisplayFormTest.java | 2 +- .../com/gooddata/md/AttributeElementTest.java | 2 +- .../gooddata/md/AttributeElementsTest.java | 2 +- .../java/com/gooddata/md/AttributeTest.java | 2 +- .../java/com/gooddata/md/DatasetTest.java | 2 +- .../java/com/gooddata/md/DimensionTest.java | 2 +- .../java/com/gooddata/md/DisplayFormTest.java | 2 +- src/test/java/com/gooddata/md/EntryTest.java | 2 +- .../java/com/gooddata/md/ExpressionTest.java | 2 +- src/test/java/com/gooddata/md/FactTest.java | 2 +- src/test/java/com/gooddata/md/KeyTest.java | 2 +- src/test/java/com/gooddata/md/MetaTest.java | 2 +- src/test/java/com/gooddata/md/MetricTest.java | 2 +- .../com/gooddata/md/NestedAttributeTest.java | 2 +- src/test/java/com/gooddata/md/ObjTest.java | 4 +-- src/test/java/com/gooddata/md/QueryTest.java | 2 +- .../com/gooddata/md/ScheduledMailTest.java | 2 +- .../md/report/AttributeInGridTest.java | 2 +- .../gooddata/md/report/GridElementTest.java | 2 +- .../GridReportDefinitionContentTest.java | 2 +- .../java/com/gooddata/md/report/GridTest.java | 2 +- .../OneNumberReportDefinitionContentTest.java | 2 +- .../report/ReportDefinitionContentTest.java | 2 +- .../md/report/ReportDefinitionTest.java | 2 +- .../com/gooddata/md/report/ReportTest.java | 2 +- .../com/gooddata/model/DiffRequestTest.java | 2 +- .../com/gooddata/model/MaqlDdlLinksTest.java | 2 +- .../java/com/gooddata/model/MaqlDdlTest.java | 2 +- .../com/gooddata/model/ModelDiffTest.java | 2 +- .../gooddata/project/ProjectServiceIT.java | 2 +- .../gooddata/project/ProjectTemplateTest.java | 2 +- .../project/ProjectTemplatesTest.java | 2 +- .../com/gooddata/project/ProjectTest.java | 12 ++++---- .../ProjectValidationResultItemTest.java | 2 +- .../ProjectValidationResultParamTest.java | 4 +-- .../project/ProjectValidationResultTest.java | 2 +- .../project/ProjectValidationResultsTest.java | 2 +- .../project/ProjectValidationTypeTest.java | 2 +- .../project/ProjectValidationsTest.java | 2 +- .../java/com/gooddata/project/RoleTest.java | 2 +- .../java/com/gooddata/project/RolesTest.java | 2 +- .../java/com/gooddata/project/UserTest.java | 2 +- .../java/com/gooddata/project/UsersTest.java | 2 +- .../gooddata/util/BooleanIntegerClass.java | 8 ++--- .../util/BooleanIntegerDeserializerTest.java | 10 +++---- .../util/BooleanIntegerSerializerTest.java | 8 ++--- .../com/gooddata/util/BooleanStringClass.java | 8 ++--- .../util/BooleanStringDeserializerTest.java | 10 +++---- .../util/BooleanStringSerializerTest.java | 8 ++--- .../java/com/gooddata/util/GDDateClass.java | 8 ++--- .../gooddata/util/GDDateDeserializerTest.java | 6 ++-- .../gooddata/util/GDDateSerializerTest.java | 6 ++-- .../com/gooddata/util/GDDateTimeClass.java | 8 ++--- .../util/GDDateTimeDeserializerTest.java | 6 ++-- .../util/GDDateTimeSerializerTest.java | 6 ++-- .../java/com/gooddata/util/ISODateClass.java | 8 ++--- .../util/ISODateTimeDeserializerTest.java | 6 ++-- .../util/ISODateTimeSerializerTest.java | 6 ++-- .../java/com/gooddata/util/ResourceUtils.java | 2 +- .../gooddata/warehouse/WarehouseTaskTest.java | 2 +- .../com/gooddata/warehouse/WarehouseTest.java | 2 +- .../gooddata/warehouse/WarehouseUserTest.java | 2 +- 216 files changed, 730 insertions(+), 746 deletions(-) diff --git a/README.md b/README.md index ae36e559d..121341c36 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ The *GoodData Java SDK* uses: * the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.8.2 or later * the *Apache HTTP Client* version 4.3 or later (for white-labeled domains at least version 4.3.2 is required) * the *Spring Framework* version 3.x -* the *Jackson JSON Processor* version 1.9 +* the *Jackson JSON Processor* version 2.5.4 (*GoodData Java SDK* version 0.x requires version 1.9) * the *Java Development Kit (JDK)* version 7 or later ## License diff --git a/pom.xml b/pom.xml index 4bf7c73df..f8b590ad5 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ UTF-8 UTF-8 4.3.3 - 1.9.12 + 2.5.4 3.2.13.RELEASE 1.1.1 1.5.3 @@ -279,20 +279,19 @@ - org.codehaus.jackson - jackson-core-asl - ${jackson-asl.version} + com.fasterxml.jackson.core + jackson-core + ${jackson.version} - org.codehaus.jackson - jackson-mapper-asl - ${jackson-asl.version} + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} com.fasterxml.jackson.core - jackson-databind - 2.5.2 - test + jackson-annotations + ${jackson.version} com.github.lookfirst diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 41c043b1c..a949989ea 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -7,7 +7,7 @@ import static java.lang.String.format; import static org.springframework.http.HttpMethod.GET; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpRequest; diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 91ce4b44e..b135b13ed 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -27,17 +27,9 @@ import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.http.converter.ByteArrayHttpMessageConverter; -import org.springframework.http.converter.FormHttpMessageConverter; -import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.http.converter.ResourceHttpMessageConverter; -import org.springframework.http.converter.StringHttpMessageConverter; -import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import static com.gooddata.util.Validate.notEmpty; import static java.util.Collections.singletonMap; @@ -199,26 +191,7 @@ private RestTemplate createRestTemplate(String login, String password, String ho restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); - // avoid jackson2 auto-detection and ensure jackson1 converter is present - final List> partConverters = new ArrayList<>(); - partConverters.add(new ByteArrayHttpMessageConverter()); - final StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter(); - stringHttpMessageConverter.setWriteAcceptCharset(false); - partConverters.add(stringHttpMessageConverter); - partConverters.add(new ResourceHttpMessageConverter()); - partConverters.add(new MappingJacksonHttpMessageConverter()); - final FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter(); - formHttpMessageConverter.setPartConverters(partConverters); - - final List> messageConverters = new ArrayList<>(); - messageConverters.add(new ByteArrayHttpMessageConverter()); - messageConverters.add(new StringHttpMessageConverter()); - messageConverters.add(new ResourceHttpMessageConverter()); - messageConverters.add(formHttpMessageConverter); - messageConverters.add(new MappingJacksonHttpMessageConverter()); - restTemplate.setMessageConverters(messageConverters); - - restTemplate.setErrorHandler(new ResponseErrorHandler(messageConverters)); + restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); return restTemplate; } diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 3f3a82916..50d311dbe 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -3,13 +3,13 @@ */ package com.gooddata.account; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; /** diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index dba36960e..cbb611a3c 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -1,12 +1,13 @@ package com.gooddata.collections; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.JsonProcessingException; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import java.io.IOException; import java.util.ArrayList; @@ -49,12 +50,12 @@ public T deserialize(final JsonParser jp, final DeserializationContext context) final ObjectMapper objectMapper = (ObjectMapper) jp.getCodec(); final JsonNode pagingNode = root.get(PAGING_NODE); - final Paging paging = pagingNode == null ? null : objectMapper.readValue(pagingNode, Paging.class); + final Paging paging = pagingNode == null ? null : objectMapper.convertValue(pagingNode, Paging.class); final JsonNode linksNode = root.get(LINKS_NODE); final Map links; if (linksNode != null) { - links = objectMapper.readValue(linksNode, LINKS_TYPE); + links = objectMapper.convertValue(linksNode, LINKS_TYPE); } else { links = null; } @@ -66,9 +67,10 @@ public T deserialize(final JsonParser jp, final DeserializationContext context) } else { items = new ArrayList<>(itemsNode.size()); for (JsonNode item : itemsNode) { - items.add(objectMapper.readValue(item, elementType)); + items.add(objectMapper.convertValue(item, elementType)); } } return createList(items, paging, links); } + } diff --git a/src/main/java/com/gooddata/collections/PageableListSerializer.java b/src/main/java/com/gooddata/collections/PageableListSerializer.java index e459e220f..e9dffd73b 100644 --- a/src/main/java/com/gooddata/collections/PageableListSerializer.java +++ b/src/main/java/com/gooddata/collections/PageableListSerializer.java @@ -3,10 +3,11 @@ */ package com.gooddata.collections; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.ObjectCodec; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.ObjectCodec; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.jsontype.TypeSerializer; import java.io.IOException; @@ -49,6 +50,12 @@ public void serialize(final PageableList value, final JsonGenerator jgen, fin jgen.writeEndObject(); } + @Override + public void serializeWithType(final PageableList value, final JsonGenerator gen, final SerializerProvider provider, + final TypeSerializer typeSer) throws IOException { + serialize(value, gen, provider); + } + private void writeObjectOrEmpty(final JsonGenerator jgen, final ObjectCodec codec, final String name, final Object object) throws IOException { jgen.writeFieldName(name); if (object != null) { diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index 782fb21f2..1105be3da 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -1,14 +1,14 @@ package com.gooddata.collections; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeInfo.As; -import org.codehaus.jackson.annotate.JsonTypeInfo.Id; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.As; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Description of the current collection page. diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index f965b97eb..b7e85d3d0 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -3,13 +3,13 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index 4826a467e..c5d914d9d 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -5,12 +5,12 @@ import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/connector/ProcessExecution.java b/src/main/java/com/gooddata/connector/ProcessExecution.java index df17e4557..89e044223 100644 --- a/src/main/java/com/gooddata/connector/ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/ProcessExecution.java @@ -3,11 +3,11 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Connector process execution (i.e. definition for single ETL run). Serialization only. diff --git a/src/main/java/com/gooddata/connector/ProcessStatus.java b/src/main/java/com/gooddata/connector/ProcessStatus.java index c8f8885b7..7f2ece5a4 100644 --- a/src/main/java/com/gooddata/connector/ProcessStatus.java +++ b/src/main/java/com/gooddata/connector/ProcessStatus.java @@ -4,12 +4,12 @@ package com.gooddata.connector; import com.gooddata.util.ISODateTimeDeserializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.joda.time.DateTime; import java.util.Map; diff --git a/src/main/java/com/gooddata/connector/Settings.java b/src/main/java/com/gooddata/connector/Settings.java index 932086637..45c3e2ca1 100644 --- a/src/main/java/com/gooddata/connector/Settings.java +++ b/src/main/java/com/gooddata/connector/Settings.java @@ -3,11 +3,11 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Connector integration settings. diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java index 4586ac9f6..f6d6f5aaf 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/src/main/java/com/gooddata/connector/Status.java @@ -1,9 +1,9 @@ package com.gooddata.connector; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import static com.gooddata.connector.Status.Code.ERROR; import static com.gooddata.connector.Status.Code.SYNCHRONIZED; diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java index 02336dae5..cd3b33a40 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -3,8 +3,8 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.connector.ConnectorType.ZENDESK4; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 314e60237..8954a3eaf 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -3,13 +3,13 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.util.CollectionUtils; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java index c44790be8..13dca611c 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java @@ -4,11 +4,11 @@ package com.gooddata.dataload.processes; import com.gooddata.account.Account; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 org.springframework.web.util.UriTemplate; import java.util.Collection; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 852aec405..16111e034 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -3,10 +3,10 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index b199e8c8c..3ad500aba 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -6,14 +6,14 @@ import com.gooddata.gdc.ErrorStructure; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import java.net.URI; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java index 150347bdb..d51d3e758 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -1,10 +1,10 @@ package com.gooddata.dataload.processes; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 java.util.Map; diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index aeaf2ccb4..b50ae59f0 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -1,14 +1,14 @@ package com.gooddata.dataload.processes; import com.gooddata.util.ISODateTimeDeserializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.springframework.web.util.UriTemplate; @@ -93,6 +93,7 @@ public void setState(final String state) { this.state = notEmpty(state, "state"); } + @JsonIgnore public void setState(final ScheduleState state) { this.state = notNull(state, "state").name(); } @@ -154,6 +155,7 @@ public void setTimezone(final String timezone) { this.timezone = timezone; } + @JsonIgnore public void setTimezone(final DateTimeZone timezone) { this.timezone = notNull(timezone, "timezone").getID(); } diff --git a/src/main/java/com/gooddata/dataload/processes/Schedules.java b/src/main/java/com/gooddata/dataload/processes/Schedules.java index 25e283cbd..ade4d3af9 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedules.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedules.java @@ -5,10 +5,10 @@ import com.gooddata.collections.PageableList; import com.gooddata.collections.Paging; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; +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 org.springframework.web.util.UriTemplate; import java.util.List; diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java index 939239d6c..daab0dd44 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -1,8 +1,8 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Dataset diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index e8cca9d2a..bd550678b 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -5,14 +5,14 @@ import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanIntegerSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.io.InputStream; import java.util.List; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifests.java b/src/main/java/com/gooddata/dataset/DatasetManifests.java index eec6baf53..267cfc816 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifests.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifests.java @@ -4,8 +4,8 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java index ead3116be..33bd79151 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -3,12 +3,12 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.List; diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java index c8ac53c6c..0796c6b31 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -1,11 +1,11 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonTypeName("etlMode") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) diff --git a/src/main/java/com/gooddata/dataset/EtlModeType.java b/src/main/java/com/gooddata/dataset/EtlModeType.java index f4803bd6f..f6f27d9d0 100644 --- a/src/main/java/com/gooddata/dataset/EtlModeType.java +++ b/src/main/java/com/gooddata/dataset/EtlModeType.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonValue; +import com.fasterxml.jackson.annotation.JsonValue; /** * Enum containing ETL mode types. diff --git a/src/main/java/com/gooddata/dataset/FailPart.java b/src/main/java/com/gooddata/dataset/FailPart.java index cb629f2db..b5fb688b5 100644 --- a/src/main/java/com/gooddata/dataset/FailPart.java +++ b/src/main/java/com/gooddata/dataset/FailPart.java @@ -1,8 +1,8 @@ package com.gooddata.dataset; import com.gooddata.gdc.ErrorStructure; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Describe status of uploaded parts diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java index 04ce34f93..9f503f768 100644 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ b/src/main/java/com/gooddata/dataset/FailStatus.java @@ -3,12 +3,12 @@ import com.gooddata.gdc.ErrorStructure; import com.gooddata.util.GDDateTimeDeserializer; import com.gooddata.util.GDDateTimeSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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; import org.joda.time.DateTime; import java.util.ArrayList; diff --git a/src/main/java/com/gooddata/dataset/LookupMode.java b/src/main/java/com/gooddata/dataset/LookupMode.java index f5b88a8aa..b3753f2e8 100644 --- a/src/main/java/com/gooddata/dataset/LookupMode.java +++ b/src/main/java/com/gooddata/dataset/LookupMode.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonValue; +import com.fasterxml.jackson.annotation.JsonValue; /** * Enum containing ETL lookup modes. diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index 7e7a8206c..50449a96e 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -3,8 +3,8 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * ETL Pull DTO (for internal use). diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index 54ffb0806..f11bb11c3 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -3,11 +3,11 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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; /** * ETL Pull task (for internal use). diff --git a/src/main/java/com/gooddata/dataset/PullTaskStatus.java b/src/main/java/com/gooddata/dataset/PullTaskStatus.java index f973dc3a3..bafcd69b4 100644 --- a/src/main/java/com/gooddata/dataset/PullTaskStatus.java +++ b/src/main/java/com/gooddata/dataset/PullTaskStatus.java @@ -3,9 +3,9 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; /** * ETL Pull task status (for internal use). diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java index 77721b942..12b8e5a99 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -4,12 +4,12 @@ package com.gooddata.dataset; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * ETL Pull task status (for internal use). diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/src/main/java/com/gooddata/gdc/AbstractMaql.java index 80ff3e8da..9da7746a8 100644 --- a/src/main/java/com/gooddata/gdc/AbstractMaql.java +++ b/src/main/java/com/gooddata/gdc/AbstractMaql.java @@ -3,11 +3,11 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Abstract MAQL statement. diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java index 137ddcdba..f5718edbd 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -3,13 +3,13 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Asynchronous task containing link for polling. diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 4049a37bb..1d573b883 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -1,9 +1,9 @@ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.copyOf; diff --git a/src/main/java/com/gooddata/gdc/FeatureFlags.java b/src/main/java/com/gooddata/gdc/FeatureFlags.java index 112aaac0a..088a1d1dd 100644 --- a/src/main/java/com/gooddata/gdc/FeatureFlags.java +++ b/src/main/java/com/gooddata/gdc/FeatureFlags.java @@ -3,10 +3,10 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonAnySetter; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; import org.springframework.web.util.UriTemplate; import java.util.ArrayList; diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 9489a0ff5..6b0ba4811 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -3,13 +3,13 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.List; diff --git a/src/main/java/com/gooddata/gdc/GdcError.java b/src/main/java/com/gooddata/gdc/GdcError.java index 5f17b9391..0bcba98c9 100644 --- a/src/main/java/com/gooddata/gdc/GdcError.java +++ b/src/main/java/com/gooddata/gdc/GdcError.java @@ -3,12 +3,12 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * GoodData REST API error structure. diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/src/main/java/com/gooddata/gdc/LinkEntries.java index 38dd4ab52..1e6d96b96 100644 --- a/src/main/java/com/gooddata/gdc/LinkEntries.java +++ b/src/main/java/com/gooddata/gdc/LinkEntries.java @@ -3,9 +3,9 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index 3b0fb8942..8f5d08d11 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -1,11 +1,11 @@ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index a7d17f8f7..439ed40f2 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -3,10 +3,10 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Response containing URI diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index 5564e9366..b0847d8dd 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -3,8 +3,8 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import org.joda.time.DateTime; import static com.gooddata.util.Validate.noNullElements; diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java index 71338bf92..5e4f9e67b 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -3,12 +3,12 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonSubTypes; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Common ancestor to {@link ScheduledMail} attachments. diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index a04cf860f..f4a24dfe5 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -5,11 +5,11 @@ import static java.util.Arrays.asList; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 5ee597dc1..64b477111 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -2,13 +2,13 @@ import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanIntegerSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Display form of attribute diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/src/main/java/com/gooddata/md/AttributeElement.java index 85476ae61..6268fcafc 100644 --- a/src/main/java/com/gooddata/md/AttributeElement.java +++ b/src/main/java/com/gooddata/md/AttributeElement.java @@ -4,10 +4,10 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Represent one element of attribute values diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index de89ed1ed..02f464ca1 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -7,12 +7,12 @@ import static org.apache.commons.lang.Validate.notNull; import org.apache.commons.lang.Validate; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.List; diff --git a/src/main/java/com/gooddata/md/DashboardAttachment.java b/src/main/java/com/gooddata/md/DashboardAttachment.java index 000edfd99..ecf13b113 100644 --- a/src/main/java/com/gooddata/md/DashboardAttachment.java +++ b/src/main/java/com/gooddata/md/DashboardAttachment.java @@ -3,8 +3,8 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Arrays; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index edba2af59..d3cbca018 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -6,13 +6,13 @@ import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index 8aface3df..991ec0417 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -3,12 +3,12 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 52be9573f..334c214c6 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -3,11 +3,11 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Display form diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 293da0afe..0c84b193f 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,11 +1,11 @@ package com.gooddata.md; import com.gooddata.util.*; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +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; import org.joda.time.DateTime; /** diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java index 917b7fe42..e1cbc4bbc 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/src/main/java/com/gooddata/md/Expression.java @@ -3,10 +3,10 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Expression of fact diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index b6055155f..df7c6471f 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -3,12 +3,12 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index 4ec6e3938..68b46db1b 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -1,7 +1,7 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; /** * Encapsulates identifier and its uri. diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index 1cdb6d92e..7cc1a5be9 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -1,7 +1,7 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index 8fc829234..5cf3c8d9c 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -1,7 +1,7 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 2f00ffb8b..252e9162a 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -2,13 +2,13 @@ import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.HashSet; diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index efbc3cd6d..11e7f27f4 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -1,9 +1,9 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Key (primary/foreign) of attribute diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java index 0a40bdd51..745beed1a 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -3,9 +3,9 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; /** * MAQL AST representation diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 3d37181f4..e87e3b462 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -4,12 +4,12 @@ package com.gooddata.md; import com.gooddata.util.*; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; -import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; +import com.fasterxml.jackson.annotation.JsonCreator; +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; +import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; import org.joda.time.DateTime; import java.io.Serializable; diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index 3e8909936..6d1573771 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -3,12 +3,12 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonSerialize; /** * Metric diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 068a890be..3b81a85df 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -3,13 +3,13 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index 899fcd826..d58102a90 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -1,11 +1,11 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java index 627f3857b..687edabf2 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -4,8 +4,8 @@ package com.gooddata.md; import com.gooddata.report.ReportExportFormat; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 153f25c57..34037be48 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -5,12 +5,12 @@ import com.gooddata.md.report.ReportDefinition; import com.gooddata.report.ReportExportFormat; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonSerialize; import org.joda.time.LocalDate; import java.util.*; diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java index 39651fc06..5b6504e69 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -5,10 +5,10 @@ import com.gooddata.util.GDDateDeserializer; import com.gooddata.util.GDDateSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.LocalDate; /** diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java index 5842bd3a7..1599db03a 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -1,9 +1,9 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java index 358bf2873..f48c69715 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -1,9 +1,9 @@ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 4b4213a26..738863755 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -3,12 +3,12 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index 4d75b001d..d2e539756 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -1,9 +1,9 @@ package com.gooddata.md.report; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 804fe8c34..af0f5344a 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -3,10 +3,10 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/report/GridElement.java b/src/main/java/com/gooddata/md/report/GridElement.java index 9824d83a4..777c87a20 100644 --- a/src/main/java/com/gooddata/md/report/GridElement.java +++ b/src/main/java/com/gooddata/md/report/GridElement.java @@ -3,10 +3,10 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Grid element diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index d35955728..dac7fcbbb 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -4,9 +4,9 @@ package com.gooddata.md.report; import com.gooddata.md.Meta; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index 0fb8709ce..f548137d3 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -4,9 +4,9 @@ package com.gooddata.md.report; import com.gooddata.md.Meta; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index a5eedeaea..c910ed035 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -7,13 +7,13 @@ import com.gooddata.md.Meta; import com.gooddata.md.Queryable; import com.gooddata.md.Updatable; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index ed5ca5f8b..610c4c37c 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -7,12 +7,12 @@ import com.gooddata.md.Meta; import com.gooddata.md.Queryable; import com.gooddata.md.Updatable; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.databind.annotation.JsonSerialize; import java.util.Map; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index 8edc42a15..f511d1ed2 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -3,10 +3,10 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonSubTypes; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index 44041aff5..d172da952 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -3,12 +3,12 @@ */ package com.gooddata.model; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonRawValue; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/src/main/java/com/gooddata/model/MaqlDdlLinks.java index 9e599599a..83f7be993 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/src/main/java/com/gooddata/model/MaqlDdlLinks.java @@ -4,10 +4,10 @@ package com.gooddata.model; import com.gooddata.gdc.LinkEntries; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.List; diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index da41c2042..009739992 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -3,11 +3,11 @@ */ package com.gooddata.model; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 java.util.Collections; import java.util.List; diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 6b5d57f2b..e08c09ee8 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -7,15 +7,15 @@ import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.GDDateTimeDeserializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; -import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index c137bfb1e..3e8b852ae 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -1,12 +1,12 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java index f84eac4ba..a56efc154 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java @@ -2,11 +2,11 @@ import static org.springframework.util.CollectionUtils.isEmpty; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 org.springframework.web.util.UriTemplate; import java.util.ArrayList; diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java index 00977ceff..dc1c06d17 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -3,10 +3,10 @@ */ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Project template. diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java index 91b2dd9be..e581ac371 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -3,10 +3,10 @@ */ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/src/main/java/com/gooddata/project/ProjectValidationResult.java index 6d206fa7e..cbc68e73a 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResult.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResult.java @@ -1,8 +1,8 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index beaf7c0e5..383583e13 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -1,9 +1,9 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.List; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java index 0dce72e29..16d14ec8c 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java @@ -1,8 +1,8 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java index eb2c642a0..7b3e72b56 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java @@ -1,9 +1,9 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; @JsonTypeName("object") @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java index 0c93f14bd..aabc34bb2 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java @@ -1,8 +1,8 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonSubTypes; -import org.codehaus.jackson.annotate.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; /** * Represents validation result message param, must be of certain type. diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index a0f0daf06..b3708eadf 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -1,9 +1,9 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.List; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java index 73e2195ac..c83a5f14c 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java @@ -1,8 +1,8 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeName; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeName; @JsonTypeName("common") @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java index 5a2a6e7df..240a6c4df 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -1,12 +1,12 @@ package com.gooddata.project; import com.gooddata.util.BooleanIntegerDeserializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; import java.util.LinkedList; import java.util.List; diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/src/main/java/com/gooddata/project/ProjectValidationType.java index 422cff02f..65e3419d6 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationType.java +++ b/src/main/java/com/gooddata/project/ProjectValidationType.java @@ -1,7 +1,7 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; /** * Represents project validation type. diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java index 6a7e3d25d..74f6afac8 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -1,9 +1,9 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/com/gooddata/project/Projects.java b/src/main/java/com/gooddata/project/Projects.java index 6ce535240..a39f7b4ec 100644 --- a/src/main/java/com/gooddata/project/Projects.java +++ b/src/main/java/com/gooddata/project/Projects.java @@ -3,10 +3,10 @@ */ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index 7f04d0f89..719c5dd29 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -3,14 +3,14 @@ import com.gooddata.md.Meta; import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.Collections; diff --git a/src/main/java/com/gooddata/project/Roles.java b/src/main/java/com/gooddata/project/Roles.java index 2e44b8a72..85754bc39 100644 --- a/src/main/java/com/gooddata/project/Roles.java +++ b/src/main/java/com/gooddata/project/Roles.java @@ -1,10 +1,10 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 org.springframework.web.util.UriTemplate; import java.util.Set; diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index 6ceb4a8ac..3a50b06ff 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -1,13 +1,13 @@ package com.gooddata.project; import com.gooddata.md.Meta; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.HashMap; diff --git a/src/main/java/com/gooddata/project/Users.java b/src/main/java/com/gooddata/project/Users.java index a866f5838..6704d24a4 100644 --- a/src/main/java/com/gooddata/project/Users.java +++ b/src/main/java/com/gooddata/project/Users.java @@ -5,11 +5,11 @@ import com.gooddata.collections.PageableList; import com.gooddata.collections.Paging; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeInfo.Id; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.springframework.web.util.UriTemplate; import java.util.List; diff --git a/src/main/java/com/gooddata/report/ExecuteDefinition.java b/src/main/java/com/gooddata/report/ExecuteDefinition.java index cec602c19..7e43f7b2c 100644 --- a/src/main/java/com/gooddata/report/ExecuteDefinition.java +++ b/src/main/java/com/gooddata/report/ExecuteDefinition.java @@ -1,7 +1,7 @@ package com.gooddata.report; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonProperty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/report/ExecuteReport.java b/src/main/java/com/gooddata/report/ExecuteReport.java index 467aa34c5..79c521f76 100644 --- a/src/main/java/com/gooddata/report/ExecuteReport.java +++ b/src/main/java/com/gooddata/report/ExecuteReport.java @@ -1,7 +1,7 @@ package com.gooddata.report; -import org.codehaus.jackson.annotate.JsonProperty; +import com.fasterxml.jackson.annotation.JsonProperty; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/report/ReportRequest.java b/src/main/java/com/gooddata/report/ReportRequest.java index 63aeb075b..be8d46f71 100644 --- a/src/main/java/com/gooddata/report/ReportRequest.java +++ b/src/main/java/com/gooddata/report/ReportRequest.java @@ -3,10 +3,10 @@ */ package com.gooddata.report; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Report execution request. diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index d39a780ff..a45169d6b 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -12,8 +12,8 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.node.ObjectNode; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import org.springframework.http.HttpEntity; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpResponse; diff --git a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java index 5e5ace167..6195cea69 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java @@ -2,11 +2,11 @@ import static com.gooddata.util.Validate.notNull; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; -import org.codehaus.jackson.map.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +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 java.io.IOException; @@ -22,7 +22,7 @@ public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOE final JsonNode root = jp.readValueAsTree(); notNull(root, "jsonNode"); if (root.isInt()) { - return ONE.equals(root.getNumberValue()); + return ONE.equals(root.numberValue()); } else { throw new JsonMappingException("Expected int value: " + root.asText(), jp.getCurrentLocation()); } diff --git a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java index b8007ed3a..cc8b3ed99 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; diff --git a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java index c460c4926..34ea28358 100644 --- a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java @@ -2,11 +2,11 @@ import static com.gooddata.util.Validate.notNull; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; -import org.codehaus.jackson.map.JsonMappingException; +import com.fasterxml.jackson.databind.JsonNode; +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 java.io.IOException; @@ -20,7 +20,7 @@ public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOE final JsonNode root = jp.readValueAsTree(); notNull(root, "jsonNode"); if (root.isTextual()) { - return "1".equals(root.getTextValue()); + return "1".equals(root.textValue()); } else { throw new JsonMappingException("Expected textual value: " + root.asText(), jp.getCurrentLocation()); } diff --git a/src/main/java/com/gooddata/util/BooleanStringSerializer.java b/src/main/java/com/gooddata/util/BooleanStringSerializer.java index 265144338..4bf8fd161 100644 --- a/src/main/java/com/gooddata/util/BooleanStringSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanStringSerializer.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; diff --git a/src/main/java/com/gooddata/util/GDDateDeserializer.java b/src/main/java/com/gooddata/util/GDDateDeserializer.java index 9eb02ee96..cc3677f4d 100644 --- a/src/main/java/com/gooddata/util/GDDateDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateDeserializer.java @@ -3,10 +3,10 @@ */ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; @@ -31,7 +31,7 @@ public LocalDate deserialize(JsonParser jp, DeserializationContext ctx) throws I if (root == null || root.isNull()) { return null; } - return FORMATTER.parseLocalDate(root.getTextValue()); + return FORMATTER.parseLocalDate(root.textValue()); } } diff --git a/src/main/java/com/gooddata/util/GDDateSerializer.java b/src/main/java/com/gooddata/util/GDDateSerializer.java index c8a1afd55..a1e8dc7c7 100644 --- a/src/main/java/com/gooddata/util/GDDateSerializer.java +++ b/src/main/java/com/gooddata/util/GDDateSerializer.java @@ -3,9 +3,9 @@ */ package com.gooddata.util; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import org.joda.time.LocalDate; import java.io.IOException; diff --git a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java index bdef9df53..5f17e7abc 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; import org.joda.time.DateTime; import java.io.IOException; @@ -21,6 +21,6 @@ public DateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IO if (root == null || root.isNull()) { return null; } - return FORMATTER.parseDateTime(root.getTextValue()); + return FORMATTER.parseDateTime(root.textValue()); } } diff --git a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java index 450930813..556c2cafd 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormatter; diff --git a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java index a6aad2205..186895615 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java @@ -2,10 +2,10 @@ import java.io.IOException; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.JsonParser; -import org.codehaus.jackson.map.DeserializationContext; -import org.codehaus.jackson.map.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; import org.joda.time.DateTime; import static com.gooddata.util.ISODateTimeSerializer.FORMATTER; @@ -21,7 +21,7 @@ public DateTime deserialize(JsonParser jp, DeserializationContext ctx) throws IO if (root == null || root.isNull()) { return null; } - return FORMATTER.parseDateTime(root.getTextValue()); + return FORMATTER.parseDateTime(root.textValue()); } } \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java index 17805c125..1a6d5a2e3 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonGenerator; -import org.codehaus.jackson.map.JsonSerializer; -import org.codehaus.jackson.map.SerializerProvider; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.format.DateTimeFormatter; diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index e0649597d..e97adc864 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,19 +1,19 @@ package com.gooddata.warehouse; import static com.gooddata.util.Validate.notNull; -import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL; +import static com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion.NON_NULL; import com.gooddata.project.Environment; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; @@ -138,6 +138,7 @@ public void setEnvironment(final String environment) { this.environment = environment; } + @JsonIgnore public void setEnvironment(final Environment environment) { notNull(environment, "environment"); setEnvironment(environment.name()); diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index 2fcd6aa15..de8e6c41e 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -1,10 +1,10 @@ package com.gooddata.warehouse; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; +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 java.util.Map; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index adfda6eb3..7c7c26a7e 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -1,18 +1,18 @@ package com.gooddata.warehouse; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonIgnore; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.Map; import static com.gooddata.util.Validate.notNull; -import static org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_NULL; +import static com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion.NON_NULL; /** * Warehouse user diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java index 419b881da..2a55c6670 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java @@ -2,11 +2,11 @@ import com.gooddata.collections.PageableList; import com.gooddata.collections.Paging; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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 org.springframework.web.util.UriTemplate; import java.util.List; diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index af7464a5f..38b0c61de 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -3,11 +3,11 @@ import com.gooddata.collections.PageableList; import com.gooddata.collections.PageableListSerializer; import com.gooddata.collections.Paging; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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 java.util.List; import java.util.Map; diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index d8f8e8e81..5c0736dda 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -6,7 +6,7 @@ import com.gooddata.util.ResourceUtils; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index 1f67fb2ee..cc286d299 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -1,7 +1,7 @@ package com.gooddata; import com.gooddata.gdc.GdcError; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index 290bd80f9..bb957b4b2 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -4,7 +4,7 @@ import net.javacrumbs.jsonunit.core.Configuration; import net.javacrumbs.jsonunit.core.Option; import net.javacrumbs.jsonunit.core.internal.Diff; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 35a886e35..24ea11b53 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -1,6 +1,6 @@ package com.gooddata.account; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java index 7c2b09ac1..c47f5bfb9 100644 --- a/src/test/java/com/gooddata/collections/PagingTest.java +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -1,6 +1,6 @@ package com.gooddata.collections; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index 2824ced83..cfccf9f29 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index 6b06ffe2b..d3aa02784 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -1,6 +1,6 @@ package com.gooddata.connector; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/connector/ProcessStatusTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java index c2738cf29..d51d285cc 100644 --- a/src/test/java/com/gooddata/connector/ProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -1,6 +1,6 @@ package com.gooddata.connector; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.connector.Status.Code.ERROR; diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java index 8ba60ae34..45a0ac655 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.connector; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 46b175831..54ff2e6f4 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -6,7 +6,7 @@ import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.MatcherAssert.assertThat; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; public class DataloadProcessTest { diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java index 3a5366b32..010642fc8 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.dataload.processes; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index e07699954..d5d5f4659 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataload.processes; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index c1f854526..f846ccb13 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -3,7 +3,7 @@ import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.*; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; public class ProcessExecutionTaskTest { diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index d8c4fff0e..e93ca303d 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -3,7 +3,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.HashMap; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 7e947ae0d..ade1d99e7 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -5,7 +5,7 @@ import com.gooddata.collections.PageableList; import com.gooddata.project.Project; import com.gooddata.util.ResourceUtils; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 622c7ace5..df016cd89 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataload.processes; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.collection.IsMapContaining; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java index 062f1fc42..c12bab0fc 100644 --- a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataload.processes; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index caf9523d0..c99ee88ed 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.dataset; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index ce5b5e100..b87eb7926 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index 52bb6b135..d98b76c20 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -1,7 +1,7 @@ package com.gooddata.dataset; import com.gooddata.gdc.ErrorStructure; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.hamcrest.Matchers; diff --git a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java index a229e1816..6b21c9442 100644 --- a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java +++ b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java @@ -4,7 +4,7 @@ package com.gooddata.dataset; import org.apache.commons.io.IOUtils; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java index 9a4dfc15a..5ebc3aafd 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index e9bf7d021..d4c3761e1 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -1,6 +1,6 @@ package com.gooddata.dataset; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/dataset/TaskStateTest.java b/src/test/java/com/gooddata/dataset/TaskStateTest.java index 73ed4d31c..c581c0eb0 100644 --- a/src/test/java/com/gooddata/dataset/TaskStateTest.java +++ b/src/test/java/com/gooddata/dataset/TaskStateTest.java @@ -4,7 +4,7 @@ package com.gooddata.dataset; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.IOException; diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index fd82c8cea..495e4e6ed 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index d595edcbb..b889d7bd7 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -1,6 +1,6 @@ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java index 55f85df78..ceecf239a 100644 --- a/src/test/java/com/gooddata/gdc/GdcErrorTest.java +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 0eedba857..ac1f3ac0e 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -1,6 +1,6 @@ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index dc0dda0c3..a2254328c 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/TaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java index 41815adf2..f251b6e1f 100644 --- a/src/test/java/com/gooddata/gdc/TaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -1,6 +1,6 @@ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.testng.Assert.*; diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index fda26115a..bbe38e214 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.gdc; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 594ab6e0c..f7a9ecfc7 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -1,6 +1,6 @@ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeElementTest.java b/src/test/java/com/gooddata/md/AttributeElementTest.java index d744e7360..ff89a556d 100644 --- a/src/test/java/com/gooddata/md/AttributeElementTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeElementsTest.java b/src/test/java/com/gooddata/md/AttributeElementsTest.java index bc5ea5d54..2375e3c4d 100644 --- a/src/test/java/com/gooddata/md/AttributeElementsTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementsTest.java @@ -9,7 +9,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 052b2f6c2..cf0a58859 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index b111f15ee..cd9cd0ab4 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -11,7 +11,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/DimensionTest.java b/src/test/java/com/gooddata/md/DimensionTest.java index 44a7a8262..2adc3853e 100644 --- a/src/test/java/com/gooddata/md/DimensionTest.java +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -9,7 +9,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index 6448a64a0..371b9f2f9 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 19e392201..6d15b4804 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index 1fc90352b..a058d0c33 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index 5df9141a4..88ae457d0 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/KeyTest.java b/src/test/java/com/gooddata/md/KeyTest.java index 26d4e4d57..c1149e812 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 7e1612ba0..c1c945934 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index ca63d0c79..84d4b24c5 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index dc6ab75ee..bdbefb314 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -8,7 +8,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index cb933e531..7465f6d5a 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -3,8 +3,8 @@ */ package com.gooddata.md; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index 81b5f92ac..6ad9aec4d 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java index 4b567767e..985ed6be5 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -5,7 +5,7 @@ import com.gooddata.JsonMatchers; import com.gooddata.report.ReportExportFormat; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.LocalDate; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 14e52558f..064dc1d34 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/GridElementTest.java b/src/test/java/com/gooddata/md/report/GridElementTest.java index 21e48edfc..19be6e010 100644 --- a/src/test/java/com/gooddata/md/report/GridElementTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index 6460225f0..cdc6f548b 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index edc0e9399..4916e620e 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.Collection; diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 89e3427a9..b97789cac 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index a0cceca06..b2df4f354 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 59716db6f..90072a0c6 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 97d48b914..356beb04d 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.md.report; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index 9967f48c9..66bd76090 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.model; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index 059bb84d8..c4cfb07d0 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.model; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index e50565c31..483c3ce1b 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.model; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 72a92aa16..626dd79a0 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.model; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 60295bfb8..e15ad7f11 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -8,7 +8,7 @@ import com.gooddata.gdc.FeatureFlags; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/project/ProjectTemplateTest.java b/src/test/java/com/gooddata/project/ProjectTemplateTest.java index b1f607fb2..38bfe8f0f 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplateTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplateTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java index f639322dc..3f54ce4a1 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java @@ -3,7 +3,7 @@ */ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 608b119a8..93912b4b2 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,11 +1,11 @@ package com.gooddata.project; -import org.codehaus.jackson.annotate.JsonIgnoreProperties; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.annotate.JsonTypeInfo; -import org.codehaus.jackson.annotate.JsonTypeName; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.annotate.JsonSerialize; +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.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java index 69bae8838..ff90a90be 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java index aba3755b5..60846d42e 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -1,7 +1,7 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.core.type.TypeReference; import org.testng.annotations.Test; import java.util.List; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java index bb9ee6a9f..38e2a6cc5 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java index 06a261882..5fb29b036 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java index 896edd337..d0de73a3e 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/project/ProjectValidationsTest.java b/src/test/java/com/gooddata/project/ProjectValidationsTest.java index 32c35b00e..9e632c474 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationsTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/project/RoleTest.java b/src/test/java/com/gooddata/project/RoleTest.java index 4e593f70d..524aaa2a2 100644 --- a/src/test/java/com/gooddata/project/RoleTest.java +++ b/src/test/java/com/gooddata/project/RoleTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.IOException; diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java index 870511405..8410f1f2c 100644 --- a/src/test/java/com/gooddata/project/RolesTest.java +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java index 5ae4c4fca..2c52644ff 100644 --- a/src/test/java/com/gooddata/project/UserTest.java +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/project/UsersTest.java b/src/test/java/com/gooddata/project/UsersTest.java index ebbacd737..279197690 100644 --- a/src/test/java/com/gooddata/project/UsersTest.java +++ b/src/test/java/com/gooddata/project/UsersTest.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerClass.java b/src/test/java/com/gooddata/util/BooleanIntegerClass.java index 0ec6c61ed..1f6acaa2a 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerClass.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerClass.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class BooleanIntegerClass { private final boolean foo; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java index 8f6d915c7..311368d31 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,7 +17,7 @@ public void shouldDeserializeTrue() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getNumberValue().intValue(), is(1)); + assertThat(node.path("foo").numberValue().intValue(), is(1)); final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); assertThat(moo.isFoo(), is(true)); @@ -28,7 +28,7 @@ public void shouldDeserializeFalse() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getNumberValue().intValue(), is(0)); + assertThat(node.path("foo").numberValue().intValue(), is(0)); final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); assertThat(moo.isFoo(), is(false)); diff --git a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java index ba2921217..6a70fa107 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -16,7 +16,7 @@ public void shouldSerializeTrue() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getNumberValue().intValue(), is(1)); + assertThat(node.path("foo").numberValue().intValue(), is(1)); } @Test @@ -24,6 +24,6 @@ public void shouldSerializeFalse() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getNumberValue().intValue(), is(0)); + assertThat(node.path("foo").numberValue().intValue(), is(0)); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanStringClass.java b/src/test/java/com/gooddata/util/BooleanStringClass.java index 9821fa6a6..d7b322ebf 100644 --- a/src/test/java/com/gooddata/util/BooleanStringClass.java +++ b/src/test/java/com/gooddata/util/BooleanStringClass.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; public class BooleanStringClass { private final boolean foo; diff --git a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java index 33c7bda05..a45d0ddd7 100644 --- a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java @@ -1,8 +1,8 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.JsonMappingException; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,7 +17,7 @@ public void shouldDeserializeTrue() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getTextValue(), is("1")); + assertThat(node.path("foo").textValue(), is("1")); final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); assertThat(moo.isFoo(), is(true)); @@ -28,7 +28,7 @@ public void shouldDeserializeFalse() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getTextValue(), is("0")); + assertThat(node.path("foo").textValue(), is("0")); final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); assertThat(moo.isFoo(), is(false)); diff --git a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java index 5200a22c1..5a2f2f32f 100644 --- a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -16,7 +16,7 @@ public void shouldSerializeTrue() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getTextValue(), is("1")); + assertThat(node.path("foo").textValue(), is("1")); } @Test @@ -24,6 +24,6 @@ public void shouldSerializeFalse() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").getTextValue(), is("0")); + assertThat(node.path("foo").textValue(), is("0")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index 3fa44ac9f..4c1714faa 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import org.joda.time.LocalDate; diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java index bf75a2420..8cf5507aa 100644 --- a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; @@ -19,7 +19,7 @@ public void testDeserialize() throws Exception { final String json = MAPPER.writeValueAsString(new GDDateClass(new LocalDate(2012, 3, 20))); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20")); + assertThat(node.path("date").textValue(), is("2012-03-20")); final GDDateClass date = MAPPER.readValue(json, GDDateClass.class); assertThat(date.getDate(), is(new LocalDate(2012, 3, 20))); diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java index 6ba597c5a..73f1b5ec6 100644 --- a/src/test/java/com/gooddata/util/GDDateSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; @@ -20,6 +20,6 @@ public void testSerialize() throws Exception { final String json = MAPPER.writeValueAsString(foo); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20")); + assertThat(node.path("date").textValue(), is("2012-03-20")); } } diff --git a/src/test/java/com/gooddata/util/GDDateTimeClass.java b/src/test/java/com/gooddata/util/GDDateTimeClass.java index f2f081793..0da6b1fdc 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeClass.java +++ b/src/test/java/com/gooddata/util/GDDateTimeClass.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; class GDDateTimeClass { diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java index 56259eea4..ec4c5ab7d 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -18,7 +18,7 @@ public void testDeserialize() throws Exception { final String json = MAPPER.writeValueAsString(new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20 14:31:05")); + assertThat(node.path("date").textValue(), is("2012-03-20 14:31:05")); final GDDateTimeClass date = MAPPER.readValue(json, GDDateTimeClass.class); assertThat(date.getDate(), is(new DateTime(2012, 3, 20, 14, 31, 5, DateTimeZone.UTC))); diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java index 627671753..aa6f5a522 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -19,6 +19,6 @@ public void testSerialize() throws Exception { final String json = MAPPER.writeValueAsString(foo); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20 14:31:05")); + assertThat(node.path("date").textValue(), is("2012-03-20 14:31:05")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ISODateClass.java b/src/test/java/com/gooddata/util/ISODateClass.java index 6fa23b791..f3d742008 100644 --- a/src/test/java/com/gooddata/util/ISODateClass.java +++ b/src/test/java/com/gooddata/util/ISODateClass.java @@ -1,9 +1,9 @@ package com.gooddata.util; -import org.codehaus.jackson.annotate.JsonCreator; -import org.codehaus.jackson.annotate.JsonProperty; -import org.codehaus.jackson.map.annotate.JsonDeserialize; -import org.codehaus.jackson.map.annotate.JsonSerialize; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; class ISODateClass { diff --git a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java index 499d2df54..53a04606b 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -19,7 +19,7 @@ public void testDeserialize() throws Exception { final String json = MAPPER.writeValueAsString(new ISODateClass(expected)); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20T14:31:05.003Z")); + assertThat(node.path("date").textValue(), is("2012-03-20T14:31:05.003Z")); final ISODateClass moo = MAPPER.readValue(json, ISODateClass.class); assertThat(moo.getDate(), is(expected)); diff --git a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java index 0f1eab9ac..606dec32e 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java @@ -1,7 +1,7 @@ package com.gooddata.util; -import org.codehaus.jackson.JsonNode; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -19,6 +19,6 @@ public void testSerialize() throws Exception { final String json = MAPPER.writeValueAsString(foo); final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("date").getTextValue(), is("2012-03-20T14:31:05.003Z")); + assertThat(node.path("date").textValue(), is("2012-03-20T14:31:05.003Z")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java index 63792c9fc..287766864 100644 --- a/src/test/java/com/gooddata/util/ResourceUtils.java +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -9,7 +9,7 @@ import static java.lang.String.format; import org.apache.commons.io.IOUtils; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index bfc496698..893e4e90f 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -3,7 +3,7 @@ import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.*; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 2d92784fd..18a0866e9 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -6,7 +6,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import com.gooddata.project.Environment; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index 8002d77bc..2cb76b5d9 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -1,6 +1,6 @@ package com.gooddata.warehouse; -import org.codehaus.jackson.map.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.LinkedHashMap; From 8ed66aa0f5526e7ed2c9a4263d42f9dbb40cfdc6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 19 Nov 2015 10:28:08 +0100 Subject: [PATCH 0264/1191] change group id add link to upgrading Group id and version in readme will be changed once released Close #242 --- README.md | 4 +++- pom.xml | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 121341c36..f841627a3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,9 @@ and currently the SDK is transitioned to be an official GoodData project. ## Usage -See [Wiki](https://github.com/martiner/gooddata-java/wiki) for [Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) +See [Wiki](https://github.com/martiner/gooddata-java/wiki) for +[Upgrading Guide](https://github.com/martiner/gooddata-java/wiki/Upgrading-GoodData-Java-SDK), +[Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-GoodData-Java-SDK). The *GoodData Java SDK* is available in Maven Central Repository, to use it from Maven add to `pom.xml`: diff --git a/pom.xml b/pom.xml index 77aaae571..66e4188f0 100644 --- a/pom.xml +++ b/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - cz.geek + com.gooddata gooddata-java - 0.23.1-SNAPSHOT + 1.0.0-SNAPSHOT ${project.artifactId} GoodData Java SDK From b7e8926a794165d1476ddad215cb87af47dbf7ab Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 20 Nov 2015 09:58:42 +0100 Subject: [PATCH 0265/1191] fix: use fixed version of gooddata-http-client with correct logout request recongnition The 0.9.2 version has fixed logout, but only for calls of execute method with host. 0.9.3 correctly detects also the situation when full uri is given in http method. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66e4188f0..4f9e9d206 100644 --- a/pom.xml +++ b/pom.xml @@ -237,7 +237,7 @@ com.gooddata gooddata-http-client - 0.9.2 + 0.9.3 commons-lang From 515fc2a4e37fa54445b028da6e006915814dfe6c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Sat, 15 Aug 2015 12:36:36 +0200 Subject: [PATCH 0266/1191] Use GoodData HTTP client in DataStoreService Replace user+login authentication with GoodData authentication which is a prerequisite for authentitacion with SST --- src/main/java/com/gooddata/GoodData.java | 13 +- .../com/gooddata/gdc/DataStoreService.java | 271 +++++++++++++++++- 2 files changed, 272 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b135b13ed..eaef2ce84 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -164,16 +164,17 @@ protected GoodData(String hostname, String login, String password, int port, Str notEmpty(login, "login"); notEmpty(password, "password"); notEmpty(protocol, "protocol"); - final HttpClientBuilder httpClientBuilder = createHttpClientBuilder(settings); + final HttpClient httpClient = createHttpClient(login, password, hostname, port, protocol, + createHttpClientBuilder(settings)); - restTemplate = createRestTemplate(login, password, hostname, httpClientBuilder, port, protocol); + restTemplate = createRestTemplate(hostname, httpClient, port, protocol); accountService = new AccountService(getRestTemplate()); projectService = new ProjectService(getRestTemplate(), accountService); metadataService = new MetadataService(getRestTemplate()); modelService = new ModelService(getRestTemplate()); gdcService = new GdcService(getRestTemplate()); - dataStoreService = new DataStoreService(httpClientBuilder, gdcService, new HttpHost(hostname, port, protocol).toURI(), login, password); + dataStoreService = new DataStoreService(httpClient, gdcService, new HttpHost(hostname, port, protocol).toURI()); datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); @@ -181,12 +182,10 @@ protected GoodData(String hostname, String login, String password, int port, Str connectorService = new ConnectorService(getRestTemplate(), projectService); } - private RestTemplate createRestTemplate(String login, String password, String hostname, HttpClientBuilder builder, - int port, String protocol) { - final HttpClient client = createHttpClient(login, password, hostname, port, protocol, builder); + private RestTemplate createRestTemplate(String hostname, HttpClient httpClient, int port, String protocol) { final UriPrefixingClientHttpRequestFactory factory = new UriPrefixingClientHttpRequestFactory( - new HttpComponentsClientHttpRequestFactory(client), hostname, port, protocol); + new HttpComponentsClientHttpRequestFactory(httpClient), hostname, port, protocol); final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 9ac1d58c8..8f1e13e53 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -6,11 +6,30 @@ import com.github.sardine.Sardine; import com.github.sardine.impl.SardineImpl; import com.gooddata.UriPrefixer; +import org.apache.commons.lang.Validate; +import org.apache.http.Header; +import org.apache.http.HeaderIterator; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpRequest; +import org.apache.http.HttpResponse; +import org.apache.http.ProtocolVersion; +import org.apache.http.StatusLine; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.params.HttpParams; +import org.apache.http.protocol.HttpContext; import java.io.IOException; import java.io.InputStream; import java.net.URI; +import java.util.Locale; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -28,16 +47,14 @@ public class DataStoreService { /** * Creates new DataStoreService - * @param httClientBuilder httpClientBuilder to build datastore connection + * @param httpClient httpClient to make datastore connection * @param gdcService used to obtain datastore URI * @param gdcUri complete GDC URI used to prefix possibly relative datastore path - * @param user datastore user - * @param pass datastore password */ - public DataStoreService(HttpClientBuilder httClientBuilder, GdcService gdcService, String gdcUri, String user, String pass) { + public DataStoreService(HttpClient httpClient, GdcService gdcService, String gdcUri) { this.gdcService = notNull(gdcService, "gdcService"); this.gdcUri = URI.create(notEmpty(gdcUri, "gdcUri")); - sardine = new SardineImpl(httClientBuilder, user, pass); + sardine = new SardineImpl(new CustomHttpClientBuilder(httpClient)); } private UriPrefixer getPrefixer() { @@ -109,4 +126,248 @@ public void delete(String path) { throw new DataStoreException("Unable to delete " + uri, e); } } + + /** + * This class is needed to provide Sardine with instance of {@link CloseableHttpClient}, because + * used {@link com.gooddata.http.client.GoodDataHttpClient} is not Closeable at all (on purpose). + * Thanks to that we can use proper GoodData authentication mechanism instead of basic auth. + * + * It creates simple closeable wrapper around plain {@link HttpClient} where {@code close()} + * is implemented as noop (respectively for the response used). + */ + private static class CustomHttpClientBuilder extends HttpClientBuilder { + + private final HttpClient client; + + private CustomHttpClientBuilder(HttpClient client) { + this.client = client; + } + + @Override + public CloseableHttpClient build() { + return new FakeCloseableHttpClient(client); + } + } + + private static class FakeCloseableHttpClient extends CloseableHttpClient { + private final HttpClient client; + + private FakeCloseableHttpClient(HttpClient client) { + notNull(client, "client can't be null"); + this.client = client; + } + + @Override + protected CloseableHttpResponse doExecute(HttpHost target, HttpRequest request, HttpContext context) throws IOException, ClientProtocolException { + // nothing to do - this method is never called, because we override all methods from CloseableHttpClient + return null; + } + + @Override + public void close() throws IOException { + // nothing to close - wrappedClient doesn't have to implement CloseableHttpClient + } + + @Override + @Deprecated + public HttpParams getParams() { + return client.getParams(); + } + + @Override + @Deprecated + public ClientConnectionManager getConnectionManager() { + return client.getConnectionManager(); + } + + @Override + public CloseableHttpResponse execute(HttpUriRequest request) throws IOException, ClientProtocolException { + return new FakeCloseableHttpResponse(client.execute(request)); + } + + @Override + public CloseableHttpResponse execute(HttpUriRequest request, HttpContext context) throws IOException, ClientProtocolException { + return new FakeCloseableHttpResponse(client.execute(request, context)); + } + + @Override + public CloseableHttpResponse execute(HttpHost target, HttpRequest request) throws IOException, ClientProtocolException { + return new FakeCloseableHttpResponse(client.execute(target, request)); + } + + @Override + public CloseableHttpResponse execute(HttpHost target, HttpRequest request, HttpContext context) throws IOException, ClientProtocolException { + return new FakeCloseableHttpResponse(client.execute(target, request, context)); + } + + @Override + public T execute(HttpUriRequest request, ResponseHandler responseHandler) throws IOException, ClientProtocolException { + return client.execute(request, responseHandler); + } + + @Override + public T execute(HttpUriRequest request, ResponseHandler responseHandler, HttpContext context) throws IOException, ClientProtocolException { + return client.execute(request, responseHandler, context); + } + + @Override + public T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler) throws IOException, ClientProtocolException { + return client.execute(target, request, responseHandler); + } + + @Override + public T execute(HttpHost target, HttpRequest request, ResponseHandler responseHandler, HttpContext context) throws IOException, ClientProtocolException { + return client.execute(target, request, responseHandler, context); + } + } + + private static class FakeCloseableHttpResponse implements CloseableHttpResponse { + + private final HttpResponse wrappedResponse; + + public FakeCloseableHttpResponse(HttpResponse wrappedResponse) { + Validate.notNull(wrappedResponse, "wrappedResponse cannot be null!"); + this.wrappedResponse = wrappedResponse; + } + + @Override + public void close() throws IOException { + // nothing to close - wrappedClient doesn't have to implement CloseableHttpResponse + } + + @Override + public StatusLine getStatusLine() { + return wrappedResponse.getStatusLine(); + } + + @Override + public void setStatusLine(StatusLine statusline) { + wrappedResponse.setStatusLine(statusline); + } + + @Override + public void setStatusLine(ProtocolVersion ver, int code) { + wrappedResponse.setStatusLine(ver, code); + } + + @Override + public void setStatusLine(ProtocolVersion ver, int code, String reason) { + wrappedResponse.setStatusLine(ver, code, reason); + } + + @Override + public void setStatusCode(int code) throws IllegalStateException { + wrappedResponse.setStatusCode(code); + } + + @Override + public void setReasonPhrase(String reason) throws IllegalStateException { + wrappedResponse.setReasonPhrase(reason); + } + + @Override + public HttpEntity getEntity() { + return wrappedResponse.getEntity(); + } + + @Override + public void setEntity(HttpEntity entity) { + wrappedResponse.setEntity(entity); + } + + @Override + public Locale getLocale() { + return wrappedResponse.getLocale(); + } + + @Override + public void setLocale(Locale loc) { + wrappedResponse.setLocale(loc); + } + + @Override + public ProtocolVersion getProtocolVersion() { + return wrappedResponse.getProtocolVersion(); + } + + @Override + public boolean containsHeader(String name) { + return wrappedResponse.containsHeader(name); + } + + @Override + public Header[] getHeaders(String name) { + return wrappedResponse.getHeaders(name); + } + + @Override + public Header getFirstHeader(String name) { + return wrappedResponse.getFirstHeader(name); + } + + @Override + public Header getLastHeader(String name) { + return wrappedResponse.getLastHeader(name); + } + + @Override + public Header[] getAllHeaders() { + return wrappedResponse.getAllHeaders(); + } + + @Override + public void addHeader(Header header) { + wrappedResponse.addHeader(header); + } + + @Override + public void addHeader(String name, String value) { + wrappedResponse.addHeader(name, value); + } + + @Override + public void setHeader(Header header) { + wrappedResponse.setHeader(header); + } + + @Override + public void setHeader(String name, String value) { + wrappedResponse.setHeader(name, value); + } + + @Override + public void setHeaders(Header[] headers) { + wrappedResponse.setHeaders(headers); + } + + @Override + public void removeHeader(Header header) { + wrappedResponse.removeHeader(header); + } + + @Override + public void removeHeaders(String name) { + wrappedResponse.removeHeaders(name); + } + + @Override + public HeaderIterator headerIterator() { + return wrappedResponse.headerIterator(); + } + + @Override + public HeaderIterator headerIterator(String name) { + return wrappedResponse.headerIterator(name); + } + + @Override + public HttpParams getParams() { + return wrappedResponse.getParams(); + } + + @Override + public void setParams(HttpParams params) { + wrappedResponse.setParams(params); + } + } } From 0f4a1ac8f8688a71199cb4088f238c18be145093 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 19 Nov 2015 18:01:16 +0100 Subject: [PATCH 0267/1191] FEATURE: add JDBC connection URL to Warehouse instance Conflicts: pom.xml --- src/main/java/com/gooddata/GoodData.java | 2 +- .../com/gooddata/warehouse/Warehouse.java | 42 +++++++++---------- .../gooddata/warehouse/WarehouseService.java | 31 +++----------- .../warehouse/WarehouseServiceAT.java | 2 +- .../warehouse/WarehouseServiceIT.java | 7 +++- .../com/gooddata/warehouse/WarehouseTest.java | 7 +++- .../warehouse/warehouse-null-token.json | 1 + src/test/resources/warehouse/warehouse.json | 1 + src/test/resources/warehouse/warehouses.json | 2 + 9 files changed, 41 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 91ce4b44e..30960b150 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -185,7 +185,7 @@ protected GoodData(String hostname, String login, String password, int port, Str datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); - warehouseService = new WarehouseService(getRestTemplate(), hostname, port); + warehouseService = new WarehouseService(getRestTemplate()); connectorService = new ConnectorService(getRestTemplate(), projectService); } diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index e0649597d..1b2f04225 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -32,7 +32,6 @@ public class Warehouse { public static final String URI = Warehouses.URI + "/{" + ID_PARAM + "}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); - public static final UriTemplate JDBC_CONNECTION_TEMPLATE = new UriTemplate("jdbc:gdc:datawarehouse://{host}:{port}/gdc/datawarehouse/instances/{id}"); private static final String SELF_LINK = "self"; private static final String STATUS_ENABLED = "ENABLED"; @@ -48,9 +47,7 @@ public class Warehouse { private String status; private String environment; private Map links; - - private String warehouseHost; - private int warehousePort = 443; + private String connectionUrl; public Warehouse(String title, String authToken) { this(title, authToken, null); @@ -64,12 +61,13 @@ public Warehouse(String title, String authToken, String description) { @JsonCreator public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, - @JsonProperty("description") String description, - @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, - @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, - @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, - @JsonProperty("status") String status, @JsonProperty("environment") String environment, - @JsonProperty("links") Map links) { + @JsonProperty("description") String description, + @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, + @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, + @JsonProperty("status") String status, @JsonProperty("environment") String environment, + @JsonProperty("connectionUrl") String connectionUrl, + @JsonProperty("links") Map links) { this(title, authToken, description); this.created = created; this.updated = updated; @@ -77,6 +75,7 @@ public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizati this.updatedBy = updatedBy; this.status = status; this.environment = environment; + this.connectionUrl = connectionUrl; this.links = links; } @@ -92,6 +91,13 @@ public String getDescription() { return description; } + /** + * Gets the JDBC connection string. + * + * @return JDBC connection string + */ + public String getConnectionUrl() { return connectionUrl; } + public void setTitle(String title) { this.title = title; } @@ -122,14 +128,6 @@ public String getStatus() { return status; } - void setWarehouseHost(String warehouseHost) { - this.warehouseHost = warehouseHost; - } - - void setWarehousePort(int warehousePort) { - this.warehousePort = warehousePort; - } - public String getEnvironment() { return environment; } @@ -149,15 +147,13 @@ public Map getLinks() { /** * Get jdbc connection string. Works only on Warehouse loaded from API (using WarehouseService). + * @deprecated Use {@link #getConnectionUrl()} instead. * @return jdbc connection string */ @JsonIgnore + @Deprecated public String getJdbcConnectionString() { - if (warehouseHost == null) { - throw new IllegalStateException("Please set warehouseHost " + - "to be able to construct jdbc connection string"); - } - return JDBC_CONNECTION_TEMPLATE.expand(warehouseHost, warehousePort, getId()).toString(); + return getConnectionUrl(); } @JsonIgnore diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 5f978d8a2..a9a1037c1 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -10,6 +10,7 @@ import com.gooddata.collections.PageableList; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -25,21 +26,14 @@ */ public class WarehouseService extends AbstractService { - private final String warehouseHost; - private final int warehousePort; - /** * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending * this abstract one. * * @param restTemplate RESTful HTTP Spring template - * @param warehouseHost host to connect warehouses - * @param warehousePort port to connect warehouses */ - public WarehouseService(RestTemplate restTemplate, String warehouseHost, int warehousePort) { + public WarehouseService(RestTemplate restTemplate) { super(restTemplate); - this.warehouseHost = notNull(warehouseHost, "warehouseHost"); - this.warehousePort = warehousePort; } /** @@ -80,7 +74,7 @@ protected void onFinish() { public void handlePollResult(WarehouseTask pollResult) { try { final Warehouse warehouse = restTemplate.getForObject(pollResult.getWarehouseLink(), Warehouse.class); - setResult(setWarehouseConnection(warehouse)); + setResult(warehouse); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Warehouse creation finished, but can't get created warehouse, uri: " + pollResult.getWarehouseLink(), e); @@ -116,7 +110,7 @@ public void removeWarehouse(Warehouse warehouse) { public Warehouse getWarehouseByUri(String uri) { notEmpty(uri, "uri"); try { - return setWarehouseConnection(restTemplate.getForObject(uri, Warehouse.class)); + return restTemplate.getForObject(uri, Warehouse.class); } catch (GoodDataRestException e) { if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { throw new WarehouseNotFoundException(uri, e); @@ -171,7 +165,7 @@ private PageableList listWarehouses(final URI uri) { if (result == null) { return new PageableList<>(); } - return setWarehouseConnection(result); + return result; } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to list Warehouses", e); } @@ -257,19 +251,4 @@ public Warehouse updateWarehouse(Warehouse toUpdate) { return getWarehouseByUri(toUpdate.getUri()); } - - private Warehouse setWarehouseConnection(Warehouse warehouse) { - notNull(warehouse, "warehouse"); - warehouse.setWarehouseHost(warehouseHost); - warehouse.setWarehousePort(warehousePort); - return warehouse; - } - - private PageableList setWarehouseConnection(PageableList warehouses) { - notNull(warehouses, "warehouses"); - for (Warehouse warehouse : warehouses) { - setWarehouseConnection(warehouse); - } - return warehouses; - } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index fac69398b..56c8c15f6 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -39,7 +39,7 @@ public void createWarehouse() throws Exception { final Warehouse wh = new Warehouse(title, warehouseToken); wh.setEnvironment(Environment.TESTING); warehouse = service.createWarehouse(wh).get(); - String jdbc = warehouse.getJdbcConnectionString(); + String jdbc = warehouse.getConnectionUrl(); } @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index f3d42e372..e7ef9e1d7 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -34,6 +34,8 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { 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 CONNECTION_URL = "CONNECTION_URL"; + private WarehouseTask pollingTask; private WarehouseTask finishedTask; private Warehouse warehouse; @@ -71,7 +73,7 @@ public void shouldCreateWarehouse() throws Exception { final Warehouse created = gd.getWarehouseService().createWarehouse(new Warehouse(TITLE, "{Token}", "Storage")).get(); assertThat(created, notNullValue()); assertThat(created.getTitle(), is(TITLE)); - assertThat(created.getJdbcConnectionString(), is("jdbc:gdc:datawarehouse://localhost:" + port() + WAREHOUSE_URI)); + assertThat(created.getConnectionUrl(), is(CONNECTION_URL)); } @Test(expectedExceptions = GoodDataException.class) @@ -103,6 +105,8 @@ public void shouldListWarehouses() throws Exception { final PageableList list = gd.getWarehouseService().listWarehouses(); assertThat(list, notNullValue()); assertThat(list, hasSize(2)); + assertThat(list.get(0).getConnectionUrl(), notNullValue()); + assertThat(list.get(1).getConnectionUrl(), notNullValue()); } @Test @@ -128,6 +132,7 @@ public void shouldGetWarehouse() throws Exception { final Warehouse warehouse = gd.getWarehouseService().getWarehouseById(WAREHOUSE_ID); assertThat(warehouse, notNullValue()); assertThat(warehouse.getTitle(), is(TITLE)); + assertThat(warehouse.getConnectionUrl(), notNullValue()); } @Test diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 2d92784fd..7f548ace0 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -26,6 +26,7 @@ public class WarehouseTest { public static final String CREATED_BY = "/gdc/account/profile/createdBy"; public static final String UPDATED_BY = "/gdc/account/profile/updatedBy"; public static final String STATUS = "ENABLED"; + public static final String CONNECTION_URL = "CONNECTION_URL"; public static final Map LINKS = new LinkedHashMap() {{ put("self", "/gdc/datawarehouse/instances/instanceId"); put("parent", "/gdc/datawarehouse/instances"); @@ -42,13 +43,13 @@ public void testSerializationForInstanceCreation() throws Exception { @Test public void testSerialization() throws Exception { - final Warehouse warehouse = new Warehouse(TITLE, TOKEN, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, LINKS); + final Warehouse warehouse = new Warehouse(TITLE, TOKEN, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, CONNECTION_URL, LINKS); assertThat(warehouse, serializesToJson("/warehouse/warehouse.json")); } @Test public void testSerializationWithNullToken() throws Exception { - final Warehouse warehouse = new Warehouse(TITLE, null, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, LINKS); + final Warehouse warehouse = new Warehouse(TITLE, null, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, CONNECTION_URL, LINKS); assertThat(warehouse, serializesToJson("/warehouse/warehouse-null-token.json")); } @@ -67,6 +68,7 @@ public void testDeserialization() throws Exception { assertThat(warehouse.getUpdated(), is(UPDATED)); assertThat(warehouse.getStatus(), is(STATUS)); assertThat(warehouse.getLinks(), is(LINKS)); + assertThat(warehouse.getConnectionUrl(), is(CONNECTION_URL)); } @Test @@ -84,5 +86,6 @@ public void testDeserializationWithNullToken() throws Exception { assertThat(warehouse.getUpdated(), is(UPDATED)); assertThat(warehouse.getStatus(), is(STATUS)); assertThat(warehouse.getLinks(), is(LINKS)); + assertThat(warehouse.getConnectionUrl(), is(CONNECTION_URL)); } } diff --git a/src/test/resources/warehouse/warehouse-null-token.json b/src/test/resources/warehouse/warehouse-null-token.json index 708b11db6..4bafa4c50 100644 --- a/src/test/resources/warehouse/warehouse-null-token.json +++ b/src/test/resources/warehouse/warehouse-null-token.json @@ -8,6 +8,7 @@ "createdBy" : "/gdc/account/profile/createdBy", "updatedBy" : "/gdc/account/profile/updatedBy", "environment" : "TESTING", + "connectionUrl" : "CONNECTION_URL", "links" : { "self" : "/gdc/datawarehouse/instances/instanceId", "parent" : "/gdc/datawarehouse/instances", diff --git a/src/test/resources/warehouse/warehouse.json b/src/test/resources/warehouse/warehouse.json index 29deb45e5..971150215 100644 --- a/src/test/resources/warehouse/warehouse.json +++ b/src/test/resources/warehouse/warehouse.json @@ -9,6 +9,7 @@ "createdBy" : "/gdc/account/profile/createdBy", "updatedBy" : "/gdc/account/profile/updatedBy", "environment" : "TESTING", + "connectionUrl" : "CONNECTION_URL", "links" : { "self" : "/gdc/datawarehouse/instances/instanceId", "parent" : "/gdc/datawarehouse/instances", diff --git a/src/test/resources/warehouse/warehouses.json b/src/test/resources/warehouse/warehouses.json index 919eca8ef..f9deee1f8 100644 --- a/src/test/resources/warehouse/warehouses.json +++ b/src/test/resources/warehouse/warehouses.json @@ -10,6 +10,7 @@ "updated" : "2014-03-17T13:02:41.000Z", "createdBy" : "/gdc/account/profile/{profile-id}", "updatedBy" : "/gdc/account/profile/{profile-id}", + "connectionUrl" : "test", "links" : { "self" : "/gdc/datawarehouse/instances/{instance-id}", "parent" : "/gdc/datawarehouse/instances", @@ -27,6 +28,7 @@ "updated" : "2014-04-09T22:10:26.000Z", "createdBy" : "/gdc/account/profile/{profile-id}", "updatedBy" : "/gdc/account/profile/{profile-id}", + "connectionUrl" : "test", "links" : { "self" : "/gdc/datawarehouse/instances/{instance-id}", "parent" : "/gdc/datawarehouse/instances", From 217507560b0a352af9bcb2a952c19a057e2199f7 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 24 Nov 2015 10:18:42 +0100 Subject: [PATCH 0268/1191] [maven-release-plugin] prepare release gooddata-java-1.0.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4f9e9d206..53a2c3930 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.0.0-SNAPSHOT + 1.0.0 ${project.artifactId} GoodData Java SDK From 44271f28e067959eb863ba9d36faff5431183b0a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 24 Nov 2015 10:18:42 +0100 Subject: [PATCH 0269/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 53a2c3930..5b4d0d87a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.0.0 + 1.0.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From fa2204327bc2b3b99d111c3a24ffdb81884895fd Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 24 Nov 2015 10:26:10 +0100 Subject: [PATCH 0270/1191] change group id and version --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f841627a3..9c639b528 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,9 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from ```xml - cz.geek + com.gooddata gooddata-java - 0.23.0 + 1.0.0 ``` From a2e138e84ec2a5d93119d15372a6311b82716747 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Nov 2015 13:58:44 +0100 Subject: [PATCH 0271/1191] [maven-release-plugin] prepare release gooddata-java-1.1.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5b4d0d87a..4a6f81a35 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.0.1-SNAPSHOT + 1.1.0 ${project.artifactId} GoodData Java SDK From 7102222badde8449cb5821f17c8b1817535dd0e3 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Nov 2015 13:58:44 +0100 Subject: [PATCH 0272/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a6f81a35..67fa6a255 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.0 + 1.1.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 2305e4903c30db8eee3ed7b8d9474d6014fa3633 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Nov 2015 14:06:41 +0100 Subject: [PATCH 0273/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9c639b528..b783a1634 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.0.0 + 1.1.0 ``` From 167cd69933df9f470c981adc03d556e8725e09d8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Nov 2015 14:08:06 +0100 Subject: [PATCH 0274/1191] fix: group id in maven badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b783a1634..c6aa0eca5 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/cz.geek/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/cz.geek/gooddata-java) +# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 From 79956f66b416851781a625b5eca4007817df3cd9 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 3 Dec 2015 15:33:19 +0100 Subject: [PATCH 0275/1191] add folder to facts --- src/main/java/com/gooddata/md/Fact.java | 22 +++++++++++++++++---- src/test/java/com/gooddata/md/FactTest.java | 4 +++- src/test/resources/md/fact-input.json | 3 +++ src/test/resources/md/fact.json | 4 ++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index df7c6471f..adfe714d8 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -12,7 +12,7 @@ import java.util.Collection; -import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; /** * Fact of GoodData project dataset @@ -32,9 +32,9 @@ private Fact(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content c } /* Just for serialization test */ - Fact(String title, String data, String type) { + Fact(String title, String data, String type, String folder) { super(new Meta(title)); - content = new Content(asList(new Expression(data, type))); + content = new Content(singletonList(new Expression(data, type)), singletonList(folder)); } @JsonIgnore @@ -42,18 +42,32 @@ public Collection getExpressions() { return content.getExpression(); } + @JsonIgnore + public Collection getFolders() { + return content.getFolders(); + } + + @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) private static class Content { @JsonProperty("expr") private final Collection expression; + @JsonProperty("folders") + private final Collection folders; + @JsonCreator - public Content(@JsonProperty("expr") Collection expression) { + public Content(@JsonProperty("expr") Collection expression, @JsonProperty("folders") Collection folders) { this.expression = expression; + this.folders = folders; } public Collection getExpression() { return expression; } + + public Collection getFolders() { + return folders; + } } } diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index 88ae457d0..a8c2fdf58 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -20,11 +20,13 @@ public void testDeserialization() throws Exception { assertThat(fact, is(notNullValue())); assertThat(fact.getExpressions(), is(notNullValue())); assertThat(fact.getExpressions(), hasSize(1)); + assertThat(fact.getFolders(), is(notNullValue())); + assertThat(fact.getFolders(), hasSize(2)); } @Test public void testSerialization() throws Exception { - final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col"); + final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col", "/gdc/md/PROJECT_ID/obj/FOLDER_ID"); assertThat(fact, serializesToJson("/md/fact-input.json")); } diff --git a/src/test/resources/md/fact-input.json b/src/test/resources/md/fact-input.json index 022d842e4..54fcc4aa9 100644 --- a/src/test/resources/md/fact-input.json +++ b/src/test/resources/md/fact-input.json @@ -6,6 +6,9 @@ "data" : "/gdc/md/PROJECT_ID/obj/COL_ID", "type" : "col" } + ], + "folders" : [ + "/gdc/md/PROJECT_ID/obj/FOLDER_ID" ] }, "meta" : { diff --git a/src/test/resources/md/fact.json b/src/test/resources/md/fact.json index 2a548a13e..c89971215 100644 --- a/src/test/resources/md/fact.json +++ b/src/test/resources/md/fact.json @@ -6,6 +6,10 @@ "data" : "/gdc/md/PROJECT_ID/obj/COL_ID", "type" : "col" } + ], + "folders" : [ + "/gdc/md/PROJECT_ID/obj/FOLDER_ID", + "/gdc/md/PROJECT_ID/obj/FOLDER_ID2" ] }, "meta" : { From 8163088f747f1e11af5b19a4eaeec5bc67f6c39f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 8 Dec 2015 09:28:58 +0100 Subject: [PATCH 0276/1191] [maven-release-plugin] prepare release gooddata-java-1.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 67fa6a255..9847d08f7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.1-SNAPSHOT + 1.1.1 ${project.artifactId} GoodData Java SDK From ccd65d11a212129edd117295d51edbb6680a62bc Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 8 Dec 2015 09:28:58 +0100 Subject: [PATCH 0277/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9847d08f7..014d5bc1b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.1 + 1.1.2-SNAPSHOT ${project.artifactId} GoodData Java SDK From a335efdf1484f4db872300ca2b4ed0d9d82ad9c6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 8 Dec 2015 09:52:41 +0100 Subject: [PATCH 0278/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c6aa0eca5..89e8d005a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.1.0 + 1.1.1 ``` From beeff5f64b1dcbe003309e4fe3da2c4a614cff5c Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Wed, 6 Jan 2016 13:33:50 +0100 Subject: [PATCH 0279/1191] Extend GoodDataRestException with error code --- .../com/gooddata/GoodDataRestException.java | 33 +++++++++++++++++-- .../gooddata/GoodDataRestExceptionTest.java | 16 +++++++-- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 7d117f05f..897f2406c 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -20,23 +20,40 @@ public class GoodDataRestException extends GoodDataException { private final String text; + private final String errorCode; + /** * Construct a GoodDataRestException with specified details. - * * @param statusCode the HTTP status code of the response * @param requestId the GoodData request ID (from header) * @param message the detail message * @param component the GoodData component where error occurred * @param errorClass the class of the error + * @param errorCode the code of the error */ public GoodDataRestException(int statusCode, String requestId, String message, String component, - String errorClass) { + String errorClass, String errorCode) { super(statusCode + (requestId != null ? ": [requestId=" + requestId + "] " : ": ") + message); this.statusCode = statusCode; this.requestId = requestId; this.component = component; this.errorClass = errorClass; this.text = message; + this.errorCode = errorCode; + } + + /** + * Construct a GoodDataRestException with specified details. + * + * @param statusCode the HTTP status code of the response + * @param requestId the GoodData request ID (from header) + * @param message the detail message + * @param component the GoodData component where error occurred + * @param errorClass the class of the error + */ + public GoodDataRestException(int statusCode, String requestId, String message, String component, + String errorClass) { + this(statusCode, requestId, message, component, errorClass, null); } /** @@ -52,7 +69,8 @@ public GoodDataRestException(int statusCode, String requestId, String statusText error != null && error.getRequestId() != null ? error.getRequestId() : requestId, error != null && error.getMessage() != null ? error.getFormattedMessage() : statusText, error != null ? error.getComponent() : null, - error != null ? error.getErrorClass() : null); + error != null ? error.getErrorClass() : null, + error != null ? error.getErrorCode() : null); } /** @@ -91,6 +109,15 @@ public String getErrorClass() { return errorClass; } + /** + * Get the code of the error + * + * @return the code of the error + */ + public String getErrorCode() { + return errorCode; + } + /** * Text message describing the error * @return text message diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index cc286d299..6bc002b1f 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -16,6 +16,18 @@ public class GoodDataRestExceptionTest { @Test public void shouldCreateDefaultInstance() throws Exception { + final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", "component", "gdc.error", "code"); + assertThat(e.getMessage(), is("500: [requestId=a123] message")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getRequestId(), is("a123")); + assertThat(e.getText(), is("message")); + assertThat(e.getComponent(), is("component")); + assertThat(e.getErrorClass(), is("gdc.error")); + assertThat(e.getErrorCode(), is("code")); + } + + @Test + public void shouldCreateDefaultInstanceWithoutErrorCode() throws Exception { final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", "component", "gdc.error"); assertThat(e.getMessage(), is("500: [requestId=a123] message")); assertThat(e.getStatusCode(), is(500)); @@ -56,6 +68,6 @@ public void shouldCreateInstanceWithGdcError() throws Exception { assertThat(e.getErrorClass(), is("CLASS")); assertThat(e.getComponent(), is("COMPONENT")); assertThat(e.getRequestId(), is("REQ")); - + assertThat(e.getErrorCode(), is("CODE")); } -} \ No newline at end of file +} From db69c39d2b0ab8e8470f57d03d02b5de3895ceda Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 7 Jan 2016 14:13:39 +0100 Subject: [PATCH 0280/1191] [maven-release-plugin] prepare release gooddata-java-1.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 014d5bc1b..995ab2cba 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.2-SNAPSHOT + 1.1.2 ${project.artifactId} GoodData Java SDK From 8229e0e48c1a7afe762fff3f0f398c0c11a98df6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 7 Jan 2016 14:13:40 +0100 Subject: [PATCH 0281/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 995ab2cba..5c5c005d5 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.2 + 1.1.3-SNAPSHOT ${project.artifactId} GoodData Java SDK From 1eaed843426d24b0e891180e9f38a0486a9d3059 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 7 Jan 2016 14:37:21 +0100 Subject: [PATCH 0282/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89e8d005a..23fadd282 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.1.1 + 1.1.2 ``` From 1eb91ccb9f1e29041200ed54337078631fc15ac4 Mon Sep 17 00:00:00 2001 From: Jakub Plichta Date: Tue, 12 Jan 2016 15:16:51 +0100 Subject: [PATCH 0283/1191] Add support for URI templates to collection pages --- .../java/com/gooddata/collections/Page.java | 25 ++++++++++++++++++ .../com/gooddata/collections/PageRequest.java | 8 +++++- .../com/gooddata/collections/UriPage.java | 26 ++++++++++++++++--- .../gooddata/collections/PageRequestTest.java | 18 ++++++++++++- .../com/gooddata/collections/UriPageTest.java | 26 ++++++++++++++++++- 5 files changed, 96 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gooddata/collections/Page.java b/src/main/java/com/gooddata/collections/Page.java index 08c02317c..ab374e7a5 100644 --- a/src/main/java/com/gooddata/collections/Page.java +++ b/src/main/java/com/gooddata/collections/Page.java @@ -1,5 +1,6 @@ package com.gooddata.collections; +import org.springframework.web.client.RestOperations; import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; @@ -11,9 +12,33 @@ public interface Page { /** * Creates {@link URI} for this page request. + *

+ * Use {@link #updateWithPageParams(UriComponentsBuilder)} if you have URI template and only want to update it with + * page query params. * * @param uriBuilder URI builder used for generating page URI * @return compiled page URI */ URI getPageUri(final UriComponentsBuilder uriBuilder); + + /** + * Updates provided URI builder query params according to this page configuration. + *

+ * As {@link #getPageUri(UriComponentsBuilder)} returns expanded page URI it is not very useful for cases that + * require use of URI template with URI variables. This method allows you to use URI templates and benefit + * from pagination support implemented in {@link Page} implementations. It is especially useful if you need to handle + * multiple requests of the same URI template in the same way - e.g. monitor request made by {@link RestOperations} + * methods. + *

+ * Use this in the situation when you have URI template with placeholders and URI variables separately. + * This method is useful when you have URI template with placeholders and only want to add query parameters based + * on this page to it. + *

+ * Use {@link #getPageUri(UriComponentsBuilder)} if you want to get concrete page URI and don't have URI template. + * + * @param uriBuilder URI builder used for constructing page URI + * @return provided and updated builder instance + * @see RestOperations + */ + UriComponentsBuilder updateWithPageParams(final UriComponentsBuilder uriBuilder); } diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index 2b4012a46..fa6f6fe59 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -46,11 +46,17 @@ public PageRequest(final int limit) { @Override public URI getPageUri(final UriComponentsBuilder uriBuilder) { notNull(uriBuilder, "uriBuilder"); + final UriComponentsBuilder copy = UriComponentsBuilder.fromUriString(uriBuilder.build().toUriString()); + return updateWithPageParams(copy).build().toUri(); + } + + @Override + public UriComponentsBuilder updateWithPageParams(final UriComponentsBuilder uriBuilder) { if (offset != null) { uriBuilder.queryParam("offset", offset); } uriBuilder.queryParam("limit", limit); - return uriBuilder.build().toUri(); + return uriBuilder; } @Override diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index 8905a49a3..f44a1a7d3 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -1,9 +1,11 @@ package com.gooddata.collections; +import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; -import org.springframework.web.util.UriTemplate; import java.net.URI; +import java.util.List; +import java.util.Map.Entry; import static com.gooddata.util.Validate.notNull; @@ -12,7 +14,7 @@ */ class UriPage implements Page { - private final URI pageUri; + private final UriComponents pageUri; /** * Creates new instance with defined page URI. @@ -20,7 +22,7 @@ class UriPage implements Page { * @param pageUri page URI */ public UriPage(final String pageUri) { - this.pageUri = new UriTemplate(notNull(pageUri, "pageUri")).expand(); + this.pageUri = UriComponentsBuilder.fromUriString(notNull(pageUri, "pageUri")).build(); } /** @@ -31,6 +33,22 @@ public UriPage(final String pageUri) { */ @Override public URI getPageUri(final UriComponentsBuilder uriBuilder) { - return pageUri; + return pageUri.toUri(); + } + + /** + * {@inheritDoc} + *

+ * Note that by using this method you might end up with URI that will be different from the one returned by + * {@link #getPageUri(UriComponentsBuilder)}. Method only copies query parameters and does not care about + * URI path. + */ + @Override + public UriComponentsBuilder updateWithPageParams(final UriComponentsBuilder uriBuilder) { + notNull(uriBuilder, "uriBuilder"); + for (Entry> entry : pageUri.getQueryParams().entrySet()) { + uriBuilder.queryParam(entry.getKey(), entry.getValue().toArray()); + } + return uriBuilder; } } diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index d70d0d279..a21c49180 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -28,4 +28,20 @@ public void testGetPageUriWithStringOffset() throws Exception { assertThat(pageUri, notNullValue()); assertThat(pageUri.toString(), is("test_uri?offset=17&limit=10")); } -} \ No newline at end of file + + @Test + public void testUpdateWithPageParams() throws Exception { + final PageRequest pageRequest = new PageRequest(12, 10); + final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("test_uri/{test}"); + final String pageUri = pageRequest.updateWithPageParams(uriBuilder).build().toUriString(); + assertThat(pageUri, is("test_uri/{test}?offset=12&limit=10")); + } + + @Test + public void testUpdateWithPageParamsWithStringOffset() throws Exception { + final PageRequest pageRequest = new PageRequest("17", 10); + final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("test_uri/{test}"); + final String pageUri = pageRequest.updateWithPageParams(uriBuilder).build().toUriString(); + assertThat(pageUri, is("test_uri/{test}?offset=17&limit=10")); + } +} diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index a068da13c..bfdefea22 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -1,10 +1,19 @@ package com.gooddata.collections; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; import org.testng.annotations.Test; +import java.util.Arrays; +import java.util.Collections; + +import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasEntry; +import static org.springframework.web.util.UriComponentsBuilder.fromUriString; import static org.testng.Assert.fail; public class UriPageTest { @@ -23,4 +32,19 @@ public void testGetPageUri() throws Exception { assertThat(uri.getPageUri(null).toString(), is("uri")); } -} \ No newline at end of file + @Test + public void test() throws Exception { + final UriPage uri = new UriPage("uri?offset=god&limit=10"); + final UriComponentsBuilder builder = fromUriString("/this/is/{template}").query("other=false"); + + uri.updateWithPageParams(builder); + + final UriComponents components = builder.build(); + assertThat(components, is(notNullValue())); + assertThat(components.getPath(), is("/this/is/{template}")); + assertThat(components.getQueryParams(), hasEntry("other", singletonList("false"))); + assertThat(components.getQueryParams(), hasEntry("offset", singletonList("god"))); + assertThat(components.getQueryParams(), hasEntry("limit", singletonList("10"))); + } + +} From 3b6cc3f69ef7e2d907897466b517469f7b854557 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 13 Jan 2016 13:37:19 +0100 Subject: [PATCH 0284/1191] [maven-release-plugin] prepare release gooddata-java-1.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5c5c005d5..fe6338d87 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.1.3-SNAPSHOT + 1.2.0 ${project.artifactId} GoodData Java SDK From c5e6d07e1c0cd3b48d012f169c79705290633a66 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 13 Jan 2016 13:37:19 +0100 Subject: [PATCH 0285/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fe6338d87..eae47196d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.0 + 1.2.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From cb6937e92af1207f65353944eb1fe044a4c7c715 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 13 Jan 2016 13:42:59 +0100 Subject: [PATCH 0286/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 23fadd282..0afcb1fba 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.1.2 + 1.2.0 ``` From 51cb6030bd438edfe62c6a0dfb130d9ce85d22d4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 15 Jan 2016 21:02:30 +0100 Subject: [PATCH 0287/1191] bring back jdbc connection template removed villainously by @ostumpf in #246 --- src/main/java/com/gooddata/warehouse/Warehouse.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 019a79819..d84612cae 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -32,6 +32,7 @@ public class Warehouse { public static final String URI = Warehouses.URI + "/{" + ID_PARAM + "}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); + public static final UriTemplate JDBC_CONNECTION_TEMPLATE = new UriTemplate("jdbc:gdc:datawarehouse://{host}:{port}/gdc/datawarehouse/instances/{id}"); private static final String SELF_LINK = "self"; private static final String STATUS_ENABLED = "ENABLED"; From 0b4ec691e408e08b04cf6ad091cf13b50226d2d6 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 15 Jan 2016 11:14:59 +0100 Subject: [PATCH 0288/1191] upgrade jackson to 2.7.0 Some optional boolean fields are now handled correctly in case of null value. In cases the getters were public, the "is*" methods were left for backward compatibility. --- README.md | 2 +- pom.xml | 2 +- .../com/gooddata/dataset/DatasetManifest.java | 14 ++++-- src/main/java/com/gooddata/md/Dataset.java | 8 ++-- src/main/java/com/gooddata/md/Entry.java | 43 +++++++++++++++---- 5 files changed, 51 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 0afcb1fba..4facfd885 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ The *GoodData Java SDK* uses: * the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.8.2 or later * the *Apache HTTP Client* version 4.3 or later (for white-labeled domains at least version 4.3.2 is required) * the *Spring Framework* version 3.x -* the *Jackson JSON Processor* version 2.5.4 (*GoodData Java SDK* version 0.x requires version 1.9) +* the *Jackson JSON Processor* version 2.7.0 (*GoodData Java SDK* version 0.x requires version 1.9) * the *Java Development Kit (JDK)* version 7 or later ## License diff --git a/pom.xml b/pom.xml index eae47196d..7c594864c 100644 --- a/pom.xml +++ b/pom.xml @@ -42,7 +42,7 @@ UTF-8 UTF-8 4.3.3 - 2.5.4 + 2.7.0 3.2.13.RELEASE 1.1.1 1.5.3 diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index bd550678b..46accf68b 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -130,14 +130,14 @@ public static class Part { private String uploadMode; private String columnName; private List populates; - private boolean referenceKey; + private Boolean referenceKey; private Map constraints; @JsonCreator Part(@JsonProperty("mode") String uploadMode, @JsonProperty("columnName") String columnName, @JsonProperty("populates") List populates, - @JsonProperty("referenceKey") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean referenceKey, + @JsonProperty("referenceKey") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean referenceKey, @JsonProperty("constraints") Map constraints) { this.uploadMode = uploadMode; this.columnName = columnName; @@ -170,8 +170,16 @@ public void setPopulates(List populates) { this.populates = populates; } - @JsonSerialize(using = BooleanIntegerSerializer.class) + /** + * @return true if the referenceKey is set and is true + */ + @JsonIgnore public boolean isReferenceKey() { + return Boolean.TRUE.equals(referenceKey); + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) + public Boolean getReferenceKey() { return referenceKey; } diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index d3cbca018..412c6d21d 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -76,7 +76,7 @@ public List getAttributes() { @JsonIgnore public boolean hasUploadConfiguration() { - return content.hasUploadConfiguration(); + return Boolean.TRUE.equals(content.hasUploadConfiguration()); } @JsonIgnore @@ -96,7 +96,7 @@ private static class Content { private final List facts; private final List dataLoadingColumns; private final List attributes; - private final boolean hasUploadConfiguration; + private final Boolean hasUploadConfiguration; @JsonCreator private Content(@JsonProperty("ties") List ties, @@ -104,7 +104,7 @@ private Content(@JsonProperty("ties") List ties, @JsonProperty("facts") List facts, @JsonProperty("dataLoadingColumns") List dataLoadingColumns, @JsonProperty("attributes") List attributes, - @JsonProperty("hasUploadConfiguration") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean hasUploadConfiguration) { + @JsonProperty("hasUploadConfiguration") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean hasUploadConfiguration) { this.ties = ties; this.mode = mode; this.facts = facts; @@ -135,7 +135,7 @@ public List getAttributes() { @JsonProperty("hasUploadConfiguration") @JsonSerialize(using = BooleanStringSerializer.class) - public boolean hasUploadConfiguration() { + public Boolean hasUploadConfiguration() { return hasUploadConfiguration; } } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 0c84b193f..3d4331606 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,5 +1,6 @@ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.gooddata.util.*; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -21,13 +22,13 @@ public class Entry { private final String category; private final String author; private final String contributor; - private final boolean deprecated; + private final Boolean deprecated; private final String identifier; private final String tags; //TODO collection private final DateTime created; private final DateTime updated; - private final boolean locked; - private final boolean unlisted; + private final Boolean locked; + private final Boolean unlisted; @JsonCreator public Entry(@JsonProperty("link") String link, @@ -36,13 +37,13 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("category") String category, @JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean deprecated, + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean deprecated, @JsonProperty("identifier") String identifier, @JsonProperty("tags") String tags, @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, - @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean locked, - @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean unlisted) { + @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean unlisted) { this.link = link; this.title = title; this.summary = summary; @@ -82,8 +83,16 @@ public String getContributor() { return contributor; } - @JsonSerialize(using = BooleanStringSerializer.class) + /** + * @return true if the deprecated is set and is true + */ + @JsonIgnore public boolean isDeprecated() { + return Boolean.TRUE.equals(deprecated); + } + + @JsonSerialize(using = BooleanStringSerializer.class) + public Boolean getDeprecated() { return deprecated; } @@ -105,13 +114,29 @@ public DateTime getUpdated() { return updated; } - @JsonSerialize(using = BooleanIntegerSerializer.class) + /** + * @return true if the locked is set and is true + */ + @JsonIgnore public boolean isLocked() { + return Boolean.TRUE.equals(locked); + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) + public Boolean getLocked() { return locked; } - @JsonSerialize(using = BooleanIntegerSerializer.class) + /** + * @return true if the unlisted is set and is true + */ + @JsonIgnore public boolean isUnlisted() { + return Boolean.TRUE.equals(unlisted); + } + + @JsonSerialize(using = BooleanIntegerSerializer.class) + public Boolean getUnlisted() { return unlisted; } } From 2d30c44831ae9ef53298c2550b0fc6a07da00fe2 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 15 Jan 2016 11:27:24 +0100 Subject: [PATCH 0289/1191] remove deprecated JsonSerialize.Inclusion it is replaced with @JsonInclude, the benefit is that class level inclusion settings no longer collides with propert level serialization settings --- .../java/com/gooddata/account/Account.java | 4 ++-- .../java/com/gooddata/collections/Paging.java | 4 ++-- .../com/gooddata/connector/Integration.java | 4 ++-- .../connector/IntegrationProcessStatus.java | 3 ++- .../gooddata/connector/ProcessExecution.java | 4 ++-- .../java/com/gooddata/connector/Settings.java | 4 ++-- .../dataload/processes/DataloadProcess.java | 4 ++-- .../gooddata/dataload/processes/Schedule.java | 4 ++-- .../com/gooddata/dataset/DatasetManifest.java | 5 +++-- .../java/com/gooddata/dataset/Datasets.java | 4 ++-- .../java/com/gooddata/dataset/EtlMode.java | 4 ++-- src/main/java/com/gooddata/dataset/Pull.java | 4 ++-- .../java/com/gooddata/dataset/TaskState.java | 4 ++-- .../java/com/gooddata/gdc/AbstractMaql.java | 4 ++-- src/main/java/com/gooddata/gdc/AsyncTask.java | 4 ++-- src/main/java/com/gooddata/gdc/Gdc.java | 4 ++-- src/main/java/com/gooddata/gdc/GdcError.java | 4 ++-- src/main/java/com/gooddata/gdc/TaskStatus.java | 2 -- .../java/com/gooddata/gdc/UriResponse.java | 4 ++-- src/main/java/com/gooddata/md/Attachment.java | 4 ++-- src/main/java/com/gooddata/md/Attribute.java | 4 ++-- .../com/gooddata/md/AttributeDisplayForm.java | 11 ++++++----- .../java/com/gooddata/md/AttributeElement.java | 4 ++-- .../com/gooddata/md/AttributeElements.java | 4 ++-- src/main/java/com/gooddata/md/Dataset.java | 5 +++-- src/main/java/com/gooddata/md/Dimension.java | 4 ++-- src/main/java/com/gooddata/md/DisplayForm.java | 6 +++--- src/main/java/com/gooddata/md/Entry.java | 3 ++- src/main/java/com/gooddata/md/Expression.java | 4 ++-- src/main/java/com/gooddata/md/Fact.java | 6 +++--- src/main/java/com/gooddata/md/InUseMany.java | 3 ++- src/main/java/com/gooddata/md/Key.java | 4 ++-- src/main/java/com/gooddata/md/Meta.java | 18 +++++++++--------- src/main/java/com/gooddata/md/Metric.java | 6 +++--- .../java/com/gooddata/md/NestedAttribute.java | 7 +++---- src/main/java/com/gooddata/md/Query.java | 6 +++--- .../java/com/gooddata/md/ScheduledMail.java | 4 ++-- .../com/gooddata/md/ScheduledMailWhen.java | 4 +++- src/main/java/com/gooddata/md/UseMany.java | 4 ++-- .../java/com/gooddata/md/UseManyEntries.java | 4 ++-- .../gooddata/md/report/AttributeInGrid.java | 4 ++-- .../java/com/gooddata/md/report/Filter.java | 4 ++-- src/main/java/com/gooddata/md/report/Grid.java | 4 ++-- .../com/gooddata/md/report/GridElement.java | 4 ++-- .../md/report/GridReportDefinitionContent.java | 4 ++-- .../OneNumberReportDefinitionContent.java | 8 ++++---- .../java/com/gooddata/md/report/Report.java | 7 +++---- .../gooddata/md/report/ReportDefinition.java | 4 ++-- .../md/report/ReportDefinitionContent.java | 4 ++-- .../java/com/gooddata/model/DiffRequest.java | 4 ++-- .../java/com/gooddata/model/MaqlDdlLinks.java | 4 ++-- .../java/com/gooddata/project/Project.java | 7 +++---- .../gooddata/project/ProjectFeatureFlag.java | 3 ++- .../com/gooddata/project/ProjectTemplate.java | 4 ++-- .../com/gooddata/project/ProjectTemplates.java | 4 ++-- .../gooddata/project/ProjectValidations.java | 4 ++-- .../java/com/gooddata/project/Projects.java | 4 ++-- src/main/java/com/gooddata/project/Role.java | 3 ++- src/main/java/com/gooddata/project/User.java | 7 +++---- .../com/gooddata/report/ReportRequest.java | 4 ++-- .../java/com/gooddata/warehouse/Warehouse.java | 8 ++++---- .../com/gooddata/warehouse/WarehouseUser.java | 5 ++--- 62 files changed, 148 insertions(+), 145 deletions(-) diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 50d311dbe..904131dd5 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; /** @@ -18,7 +18,7 @@ @JsonTypeName("accountSetting") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Account { public static final String URI = "/gdc/account/profile/{id}"; diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index 1105be3da..ca80477a9 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -3,12 +3,12 @@ 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.JsonTypeInfo.As; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Description of the current collection page. @@ -16,7 +16,7 @@ @JsonTypeInfo(include = As.WRAPPER_OBJECT, use = Id.NONE) @JsonTypeName("paging") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Paging { private final String offset; diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index b7e85d3d0..dc715e3f1 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notEmpty; @@ -19,7 +19,7 @@ @JsonTypeName("integration") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Integration { public static final String URL = "/gdc/projects/{project}/connectors/{connector}/integration"; diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index c5d914d9d..bb325c202 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -3,6 +3,7 @@ */ package com.gooddata.connector; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -20,7 +21,7 @@ * Connector process (i.e. single ETL run) status used in integration object. Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class IntegrationProcessStatus { public static final String URI = "/gdc/projects/{project}/connectors/{connector}/integration/processes/{process}"; diff --git a/src/main/java/com/gooddata/connector/ProcessExecution.java b/src/main/java/com/gooddata/connector/ProcessExecution.java index 89e044223..608f87dd0 100644 --- a/src/main/java/com/gooddata/connector/ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/ProcessExecution.java @@ -5,9 +5,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; 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.JsonSerialize; /** * Connector process execution (i.e. definition for single ETL run). Serialization only. @@ -15,7 +15,7 @@ @JsonTypeName("process") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public interface ProcessExecution { @JsonIgnore diff --git a/src/main/java/com/gooddata/connector/Settings.java b/src/main/java/com/gooddata/connector/Settings.java index 45c3e2ca1..93377b5f8 100644 --- a/src/main/java/com/gooddata/connector/Settings.java +++ b/src/main/java/com/gooddata/connector/Settings.java @@ -5,9 +5,9 @@ import com.fasterxml.jackson.annotation.JsonIgnore; 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.JsonSerialize; /** * Connector integration settings. @@ -15,7 +15,7 @@ @JsonTypeName("settings") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public interface Settings { final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 8954a3eaf..ae0a7030b 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; import org.springframework.util.CollectionUtils; import org.springframework.web.util.UriTemplate; @@ -23,7 +23,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("process") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class DataloadProcess { public static final String URI = "/gdc/projects/{projectId}/dataload/processes/{processId}"; diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index b50ae59f0..24bf66de9 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -1,5 +1,6 @@ package com.gooddata.dataload.processes; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.ISODateTimeDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -8,7 +9,6 @@ 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 org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.springframework.web.util.UriTemplate; @@ -26,7 +26,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("schedule") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Schedule { public static final String URI = "/gdc/projects/{projectId}/schedules/{scheduleId}"; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 46accf68b..5b80c9135 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -3,6 +3,7 @@ */ package com.gooddata.dataset; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanIntegerSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -28,7 +29,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("dataSetSLIManifest") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class DatasetManifest { public static final String URI = "/gdc/md/{projectId}/ldm/singleloadinterface/{dataSet}/manifest"; @@ -123,7 +124,7 @@ public void setSource(final InputStream source) { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) public static class Part { @JsonProperty("mode") diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java index 33bd79151..433c7971c 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.List; @@ -19,7 +19,7 @@ @JsonTypeName("about") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) // todo this is almost copy of Gdc public class Datasets { diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java index 0796c6b31..7f5522084 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -2,15 +2,15 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; @JsonTypeName("etlMode") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class EtlMode { public static final String URL = "/gdc/md/{project}/etl/mode"; diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index 50449a96e..64c3a14f1 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -3,14 +3,14 @@ */ package com.gooddata.dataset; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * ETL Pull DTO (for internal use). * Serialization only. */ -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Pull { public static final String URI = "/gdc/md/{projectId}/etl/pull"; diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java index 12b8e5a99..8b3c21f40 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -6,10 +6,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * ETL Pull task status (for internal use). @@ -18,7 +18,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("taskState") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class TaskState { private static final String OK = "OK"; diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/src/main/java/com/gooddata/gdc/AbstractMaql.java index 9da7746a8..d0bd55318 100644 --- a/src/main/java/com/gooddata/gdc/AbstractMaql.java +++ b/src/main/java/com/gooddata/gdc/AbstractMaql.java @@ -4,10 +4,10 @@ package com.gooddata.gdc; 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.databind.annotation.JsonSerialize; /** * Abstract MAQL statement. @@ -15,7 +15,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("manage") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public abstract class AbstractMaql { @JsonProperty("maql") diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java index f5718edbd..799c7a62e 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; /** * Asynchronous task containing link for polling. @@ -18,7 +18,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("asyncTask") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class AsyncTask { @JsonProperty diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 6b0ba4811..cabaa2b34 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; import java.util.List; @@ -19,7 +19,7 @@ @JsonTypeName("about") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Gdc { /** diff --git a/src/main/java/com/gooddata/gdc/GdcError.java b/src/main/java/com/gooddata/gdc/GdcError.java index 0bcba98c9..8f81d3a2e 100644 --- a/src/main/java/com/gooddata/gdc/GdcError.java +++ b/src/main/java/com/gooddata/gdc/GdcError.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * GoodData REST API error structure. @@ -17,7 +17,7 @@ @JsonTypeName("error") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class GdcError extends ErrorStructure { @JsonCreator diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index 8f5d08d11..96e5d1c7f 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -5,7 +5,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -17,7 +16,6 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("wTaskStatus") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class TaskStatus { private static final String OK = "OK"; diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index 439ed40f2..9b591c4d8 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -5,14 +5,14 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Response containing URI */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class UriResponse { private final String uri; diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java index 5e4f9e67b..179ef3a2f 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Common ancestor to {@link ScheduledMail} attachments. @@ -19,7 +19,7 @@ @JsonSubTypes.Type(name = "dashboardAttachment", value = DashboardAttachment.class), @JsonSubTypes.Type(name = "reportAttachment", value = ReportAttachment.class), }) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Attachment { private final String uri; diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index f4a24dfe5..2182bcf23 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -6,10 +6,10 @@ import static java.util.Arrays.asList; 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collections; @@ -18,7 +18,7 @@ */ @JsonTypeName("attribute") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Attribute extends NestedAttribute implements Queryable, Updatable { @JsonCreator diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 64b477111..0463befb3 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,5 +1,6 @@ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanIntegerSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -15,7 +16,7 @@ */ @JsonTypeName("attributeDisplayForm") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class AttributeDisplayForm extends DisplayForm implements Updatable { @JsonProperty("content") @@ -35,16 +36,16 @@ private AttributeDisplayForm(@JsonProperty("meta") Meta meta, @JsonProperty("con @JsonIgnore public boolean isDefault() { - return content.isDefault(); + return Boolean.TRUE.equals(content.isDefault()); } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content extends DisplayForm.Content { private final boolean isDefault; private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean isDefault, + @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean isDefault, @JsonProperty("ldmexpression") String ldmExpression, @JsonProperty("type") String type) { super(formOf, expression, ldmExpression, type); @@ -53,7 +54,7 @@ private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression @JsonProperty("default") @JsonSerialize(using = BooleanIntegerSerializer.class) - public boolean isDefault() { + public Boolean isDefault() { return isDefault; } } diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/src/main/java/com/gooddata/md/AttributeElement.java index 6268fcafc..2a2dca5f7 100644 --- a/src/main/java/com/gooddata/md/AttributeElement.java +++ b/src/main/java/com/gooddata/md/AttributeElement.java @@ -6,14 +6,14 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Represent one element of attribute values */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class AttributeElement { private final String uri; diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index 02f464ca1..e3a2b5894 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -9,10 +9,10 @@ import org.apache.commons.lang.Validate; 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.List; @@ -24,7 +24,7 @@ @JsonTypeName("attributeElements") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class AttributeElements { static final String URI = Obj.OBJ_URI + "/elements"; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 412c6d21d..121ce111c 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -4,6 +4,7 @@ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -23,7 +24,7 @@ */ @JsonTypeName("dataSet") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Dataset extends AbstractObj implements Queryable, Updatable { private static final String DATA_UPLOADS_LINK = "dataUploads"; @@ -89,7 +90,7 @@ public String getUploadConfigurationLink() { return links != null ? links.get(UPLOAD_CONFIGURATION_LINK) : null; } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { private final List ties; private final String mode; diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index 991ec0417..cbbcb2777 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -18,7 +18,7 @@ */ @JsonTypeName("dimension") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Dimension extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 334c214c6..04926d896 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -6,14 +6,14 @@ 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.databind.annotation.JsonSerialize; /** * Display form */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class DisplayForm extends AbstractObj { @JsonProperty("content") @@ -56,7 +56,7 @@ public String getElementsLink() { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) protected static class Content { private final String formOf; diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 3d4331606..735bf69e5 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,6 +1,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.*; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -13,7 +14,7 @@ * Metadata entry (can be named "LINK" in some API docs) */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Entry { private final String link; diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java index e1cbc4bbc..b010b6f28 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/src/main/java/com/gooddata/md/Expression.java @@ -5,14 +5,14 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Expression of fact */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Expression { private final String data; diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index adfe714d8..886195312 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -19,7 +19,7 @@ */ @JsonTypeName("fact") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Fact extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") @@ -47,7 +47,7 @@ public Collection getFolders() { return content.getFolders(); } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { @JsonProperty("expr") diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 252e9162a..15e39f334 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -1,5 +1,6 @@ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -25,7 +26,7 @@ @JsonTypeName("inUseMany") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class InUseMany { public static final String USEDBY_URI = "/gdc/md/{projectId}/usedby2"; diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index 11e7f27f4..74a6f1011 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -2,14 +2,14 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Key (primary/foreign) of attribute */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Key { private final String data; diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index e87e3b462..60ecfa291 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -3,13 +3,13 @@ */ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.*; import com.fasterxml.jackson.annotation.JsonCreator; 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; -import com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; import org.joda.time.DateTime; import java.io.Serializable; @@ -20,7 +20,7 @@ * Metadata meta information (meant just for internal SDK usage) */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Meta implements Serializable { private static final int SUMMARY_MAX_LENGTH = 2048; @@ -103,7 +103,7 @@ public String getContributor() { return contributor; } - @JsonSerialize(using = GDDateTimeSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = GDDateTimeSerializer.class) public DateTime getCreated() { return created; } @@ -124,7 +124,7 @@ public void setTitle(String title) { this.title = title; } - @JsonSerialize(using = GDDateTimeSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = GDDateTimeSerializer.class) public DateTime getUpdated() { return updated; } @@ -154,7 +154,7 @@ public String getUri() { * @return true when the linked object is deprecated, null if not set */ @JsonProperty("deprecated") - @JsonSerialize(using = BooleanStringSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = BooleanStringSerializer.class) public Boolean isDeprecated() { return deprecated; } @@ -178,7 +178,7 @@ public void setIdentifier(String identifier) { * @return true when the linked object is production, null if not set */ @JsonProperty("isProduction") - @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = BooleanIntegerSerializer.class) public Boolean isProduction() { return production; } @@ -194,7 +194,7 @@ public void setProduction(final Boolean production) { * @return true when the linked object is locked, null if not set */ @JsonProperty("locked") - @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = BooleanIntegerSerializer.class) public Boolean isLocked() { return locked; } @@ -210,7 +210,7 @@ public void setLocked(Boolean locked) { * @return true when the linked object is unlisted, null if not set */ @JsonProperty("unlisted") - @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = BooleanIntegerSerializer.class) public Boolean isUnlisted() { return unlisted; } @@ -226,7 +226,7 @@ public void setUnlisted(Boolean unlisted) { * @return true when the linked object is shared, null if not set */ @JsonProperty("sharedWithSomeone") - @JsonSerialize(using = BooleanIntegerSerializer.class, include = Inclusion.NON_NULL) + @JsonSerialize(using = BooleanIntegerSerializer.class) public Boolean isSharedWithSomeone() { return sharedWithSomeone; } diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index 6d1573771..c7cb40a98 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -5,17 +5,17 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Metric */ @JsonTypeName("metric") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Metric extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") @@ -46,7 +46,7 @@ public MaqlAst getMaqlAst() { return content.getMaqlAst(); } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { private final String expression; diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 3b81a85df..710753d3c 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -6,10 +6,10 @@ 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.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -19,10 +19,9 @@ /** * Attribute representation which is nested in some other metadata object (i.e. within {@link Dimension}). * Can't be queried, get or updated directly - use {@link Attribute} for these operations. - * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class NestedAttribute extends AbstractObj { @JsonProperty("content") @@ -113,7 +112,7 @@ public Collection getGrain() { return content.getGrain(); } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) protected static class Content { private final Collection pk; private final Collection fk; diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index d58102a90..5fa92a96c 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -2,10 +2,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -15,7 +15,7 @@ @JsonTypeName("query") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Query { public static final String URI = "/gdc/md/{projectId}/query/{type}"; @@ -47,7 +47,7 @@ public String getTitle() { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Meta { private final String category; private final String summary; diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 34037be48..d8a6d33b2 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -3,6 +3,7 @@ */ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.report.ReportDefinition; import com.gooddata.report.ReportExportFormat; import com.fasterxml.jackson.annotation.JsonCreator; @@ -10,7 +11,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.LocalDate; import java.util.*; @@ -23,7 +23,7 @@ */ @JsonTypeName("scheduledMail") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class ScheduledMail extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java index 5b6504e69..f5a9168f0 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -3,6 +3,7 @@ */ package com.gooddata.md; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.GDDateDeserializer; import com.gooddata.util.GDDateSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -37,7 +38,8 @@ public ScheduledMailWhen() {} public String getRecurrency() { return recurrency; } - @JsonSerialize(using = GDDateSerializer.class, include = JsonSerialize.Inclusion.NON_NULL) + @JsonSerialize(using = GDDateSerializer.class) + @JsonInclude(JsonInclude.Include.NON_NULL) public LocalDate getStartDate() { return startDate; } public String getTimeZone() { return timeZone; } diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java index 1599db03a..f8e09b3ab 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -2,8 +2,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -13,7 +13,7 @@ * UsedBy/Using batch result */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class UseMany { private final Collection useMany; diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java index f48c69715..74d74c9ee 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -2,13 +2,13 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class UseManyEntries { private final String uri; diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 738863755..07b1e62f5 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -5,10 +5,10 @@ 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.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.ArrayList; import java.util.Collection; @@ -20,7 +20,7 @@ @JsonTypeName("attribute") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class AttributeInGrid extends GridElement { private Collection> totals; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index d2e539756..1282dba65 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -2,8 +2,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notEmpty; @@ -11,7 +11,7 @@ * Filter (in report definition) */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Filter { private final String expression; diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index af0f5344a..a231d5bf0 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -5,8 +5,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -18,7 +18,7 @@ * Grid content (in report definition) */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Grid { private final Collection columns; diff --git a/src/main/java/com/gooddata/md/report/GridElement.java b/src/main/java/com/gooddata/md/report/GridElement.java index 777c87a20..759e8a554 100644 --- a/src/main/java/com/gooddata/md/report/GridElement.java +++ b/src/main/java/com/gooddata/md/report/GridElement.java @@ -5,8 +5,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Grid element @@ -14,7 +14,7 @@ * one time in rows or columns) */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class GridElement { private final String uri; diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index dac7fcbbb..291154046 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -3,10 +3,10 @@ */ package com.gooddata.md.report; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -15,7 +15,7 @@ /** * Grid report definition */ -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class GridReportDefinitionContent extends ReportDefinitionContent { public static final String FORMAT = "grid"; diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index f548137d3..e81b5e77c 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -3,10 +3,10 @@ */ package com.gooddata.md.report; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -15,7 +15,7 @@ /** * One number report definition */ -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class OneNumberReportDefinitionContent extends ReportDefinitionContent { public static final String FORMAT = "oneNumber"; @@ -44,7 +44,7 @@ public OneNumberVisualization getOneNumber() { return oneNumber; } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class OneNumberVisualization { private final OneNumberLabels labels; @@ -59,7 +59,7 @@ public OneNumberLabels getLabels() { } } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class OneNumberLabels { private final String description; diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index c910ed035..058224a07 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -3,17 +3,16 @@ */ package com.gooddata.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.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; -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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -24,7 +23,7 @@ */ @JsonTypeName("report") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Report extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") @@ -56,7 +55,7 @@ public Collection getDomains() { return content.getDomains(); } - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { 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 610c4c37c..1a95adab2 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -3,6 +3,7 @@ */ package com.gooddata.md.report; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.AbstractObj; import com.gooddata.md.Meta; import com.gooddata.md.Queryable; @@ -12,7 +13,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Map; @@ -21,7 +21,7 @@ */ @JsonTypeName("reportDefinition") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class ReportDefinition extends AbstractObj implements Queryable, Updatable { private static final String EXPLAIN_LINK = "explain2"; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index f511d1ed2..a828bc034 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -4,9 +4,9 @@ package com.gooddata.md.report; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -20,7 +20,7 @@ value = OneNumberReportDefinitionContent.class) //TODO chart }) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public abstract class ReportDefinitionContent { private final String format; diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index d172da952..a4ffc3632 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -4,11 +4,11 @@ package com.gooddata.model; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonRawValue; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import static com.gooddata.util.Validate.notNull; @@ -18,7 +18,7 @@ */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("diffRequest") -@JsonSerialize(include = JsonSerialize.Inclusion.ALWAYS) +@JsonInclude(JsonInclude.Include.ALWAYS) @JsonIgnoreProperties(ignoreUnknown = true) public class DiffRequest { diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/src/main/java/com/gooddata/model/MaqlDdlLinks.java index 83f7be993..230e01914 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/src/main/java/com/gooddata/model/MaqlDdlLinks.java @@ -3,11 +3,11 @@ */ package com.gooddata.model; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.gdc.LinkEntries; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.List; @@ -16,7 +16,7 @@ * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class MaqlDdlLinks extends LinkEntries { private static final String TASKS_STATUS = "tasks-status"; diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index e08c09ee8..5325ed02a 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -3,6 +3,7 @@ */ package com.gooddata.project; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; import com.gooddata.util.BooleanIntegerDeserializer; import com.gooddata.util.BooleanStringDeserializer; @@ -14,8 +15,6 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; @@ -32,7 +31,7 @@ @JsonTypeName("project") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Project { public static final String PROJECTS_URI = "/gdc/account/profile/{id}/projects"; @@ -262,7 +261,7 @@ public void setEnvironment(final Environment environment) { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class ProjectContent { @JsonProperty("authorizationToken") diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index 3e8b852ae..7d07a4847 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -3,6 +3,7 @@ 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; @@ -18,7 +19,7 @@ @JsonTypeName("featureFlag") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class ProjectFeatureFlag { public static final String FEATURE_FLAG_URI = ProjectFeatureFlags.FEATURE_FLAGS_URI + "/{featureFlag}"; diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java index dc1c06d17..06c8eb916 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -5,15 +5,15 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; /** * Project template. * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class ProjectTemplate { public static final String URI = "/gdc/md/{projectId}/templates"; diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java index e581ac371..fec9a875a 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -5,8 +5,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; @@ -15,7 +15,7 @@ * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class ProjectTemplates { private final Collection templatesInfo; diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java index 74f6afac8..f2eae87ca 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -2,8 +2,8 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.HashSet; import java.util.Set; @@ -15,7 +15,7 @@ * Helper dto, to fetch available validations or start validations. */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) class ProjectValidations { public static final String URI = "/gdc/md/{projectId}/validate"; diff --git a/src/main/java/com/gooddata/project/Projects.java b/src/main/java/com/gooddata/project/Projects.java index a39f7b4ec..a59e28c04 100644 --- a/src/main/java/com/gooddata/project/Projects.java +++ b/src/main/java/com/gooddata/project/Projects.java @@ -5,15 +5,15 @@ 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.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; /** */ @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Projects { public static final String URI = "/gdc/projects"; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index 719c5dd29..272d0d8d3 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -1,5 +1,6 @@ package com.gooddata.project; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; import com.gooddata.util.BooleanStringDeserializer; import com.gooddata.util.BooleanStringSerializer; @@ -26,7 +27,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("projectRole") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Role { public static final String URI = "/gdc/projects/{projectId}/roles/{roleId}"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index 3a50b06ff..a85121613 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -1,13 +1,12 @@ package com.gooddata.project; import com.gooddata.md.Meta; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; 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.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.HashMap; @@ -20,7 +19,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("user") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class User { private UserContent content; @@ -59,7 +58,7 @@ public String getPhoneNumber() { } @JsonIgnoreProperties(ignoreUnknown = true) - @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) + @JsonInclude(JsonInclude.Include.NON_NULL) private static class UserContent { @JsonProperty("email") diff --git a/src/main/java/com/gooddata/report/ReportRequest.java b/src/main/java/com/gooddata/report/ReportRequest.java index be8d46f71..2cb422132 100644 --- a/src/main/java/com/gooddata/report/ReportRequest.java +++ b/src/main/java/com/gooddata/report/ReportRequest.java @@ -4,9 +4,9 @@ package com.gooddata.report; 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.JsonSerialize; /** * Report execution request. @@ -15,7 +15,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("report_req") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) abstract class ReportRequest { public static final String URI = "/gdc/xtab2/executor3"; diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 019a79819..143224732 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,8 +1,8 @@ package com.gooddata.warehouse; import static com.gooddata.util.Validate.notNull; -import static com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion.NON_NULL; +import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.project.Environment; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; @@ -25,7 +25,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("instance") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class Warehouse { private static final String ID_PARAM = "id"; @@ -106,12 +106,12 @@ public void setDescription(String description) { this.description = description; } - @JsonSerialize(using = ISODateTimeSerializer.class, include = NON_NULL) + @JsonSerialize(using = ISODateTimeSerializer.class) public DateTime getCreated() { return created; } - @JsonSerialize(using = ISODateTimeSerializer.class, include = NON_NULL) + @JsonSerialize(using = ISODateTimeSerializer.class) public DateTime getUpdated() { return updated; } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index 7c7c26a7e..bb1a96bba 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -3,16 +3,15 @@ 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.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import java.util.Map; import static com.gooddata.util.Validate.notNull; -import static com.fasterxml.jackson.databind.annotation.JsonSerialize.Inclusion.NON_NULL; /** * Warehouse user @@ -20,7 +19,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("user") @JsonIgnoreProperties(ignoreUnknown = true) -@JsonSerialize(include = NON_NULL) +@JsonInclude(JsonInclude.Include.NON_NULL) public class WarehouseUser { public static final String URI = WarehouseUsers.URI + "/{userId}"; From 435bf91ce554e1c66c1b4b45067953e4030dde02 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 15 Jan 2016 11:28:17 +0100 Subject: [PATCH 0290/1191] remove unused import in dtos --- src/main/java/com/gooddata/md/AttributeElements.java | 2 -- src/main/java/com/gooddata/md/NestedAttribute.java | 5 ----- src/main/java/com/gooddata/project/ProjectFeatureFlags.java | 1 - src/main/java/com/gooddata/project/User.java | 4 ---- 4 files changed, 12 deletions(-) diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index e3a2b5894..866e4342a 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -6,7 +6,6 @@ import static org.apache.commons.lang.Validate.notNull; -import org.apache.commons.lang.Validate; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; @@ -16,7 +15,6 @@ import org.springframework.web.util.UriTemplate; import java.util.List; -import java.util.Set; /** * Represents elements of attribute diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 710753d3c..539f5ffc4 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -8,13 +8,8 @@ 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 java.util.Collection; -import java.util.Collections; - -import static java.util.Arrays.asList; /** * Attribute representation which is nested in some other metadata object (i.e. within {@link Dimension}). diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java index a56efc154..b0022879c 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java @@ -10,7 +10,6 @@ import org.springframework.web.util.UriTemplate; import java.util.ArrayList; -import java.util.Collections; import java.util.List; @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index a85121613..4d5e987c9 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -1,17 +1,13 @@ package com.gooddata.project; -import com.gooddata.md.Meta; import com.fasterxml.jackson.annotation.JsonInclude; 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 org.springframework.web.util.UriTemplate; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * User. From afdc162a6f3b60682417013b4342a9a26ce8ce76 Mon Sep 17 00:00:00 2001 From: Richard Benkovsky Date: Wed, 20 Jan 2016 08:48:25 +0100 Subject: [PATCH 0291/1191] DataStoreService is now able to delete WebDav collections. The root cause of the problem was in the 'sardine' library not following HTTP 301 redirects when doing DELETE on resource on WebDav. In case of GD WebDav infrastructure, when you want to delete collection, you need to execute DELETE on resource with trailing '/', otherwise you get HTTP 301 with correct location. Because of that, UriPrefixer was changed to stop removing trailing slash from given URI. --- src/main/java/com/gooddata/GoodData.java | 2 +- src/main/java/com/gooddata/UriPrefixer.java | 2 +- .../com/gooddata/dataset/DatasetService.java | 2 +- .../com/gooddata/gdc/DataStoreService.java | 20 ++++++++++++++++--- .../gooddata/dataset/DatasetServiceIT.java | 5 +++++ .../com/gooddata/gdc/DatastoreServiceAT.java | 17 ++++++++++++++-- 6 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 0fe032e85..6cb1e7671 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -174,7 +174,7 @@ protected GoodData(String hostname, String login, String password, int port, Str metadataService = new MetadataService(getRestTemplate()); modelService = new ModelService(getRestTemplate()); gdcService = new GdcService(getRestTemplate()); - dataStoreService = new DataStoreService(httpClient, gdcService, new HttpHost(hostname, port, protocol).toURI()); + dataStoreService = new DataStoreService(httpClient, getRestTemplate(), gdcService, new HttpHost(hostname, port, protocol).toURI()); datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 8378920f3..a3bfe7e95 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -54,7 +54,7 @@ public URI getUriPrefix() { */ public URI mergeUris(URI uri) { notNull(uri, "uri"); - final String path = trimTrailingCharacter(trimLeadingCharacter(uri.getRawPath(), '/'), '/'); + final String path = trimLeadingCharacter(uri.getRawPath(), '/'); return UriComponentsBuilder.fromUri(uriPrefix) .pathSegment(path) .query(uri.getRawQuery()) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 188fe989c..2a5dc57e4 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -206,7 +206,7 @@ public void handlePollException(final GoodDataRestException e) { @Override protected void onFinish() { try { - dataStoreService.delete(dirPath.toString() + "/"); + dataStoreService.delete(dirPath.toString()); } catch (DataStoreException ignored) { // todo log? } diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 8f1e13e53..f2d0d8062 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -25,6 +25,11 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.params.HttpParams; import org.apache.http.protocol.HttpContext; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; import java.io.IOException; import java.io.InputStream; @@ -42,18 +47,22 @@ public class DataStoreService { private final Sardine sardine; private final GdcService gdcService; private final URI gdcUri; + private final RestTemplate restTemplate; + private UriPrefixer prefixer; /** * Creates new DataStoreService * @param httpClient httpClient to make datastore connection + * @param restTemplate restTemplate to make datastore connection * @param gdcService used to obtain datastore URI * @param gdcUri complete GDC URI used to prefix possibly relative datastore path */ - public DataStoreService(HttpClient httpClient, GdcService gdcService, String gdcUri) { + public DataStoreService(HttpClient httpClient, RestTemplate restTemplate, GdcService gdcService, String gdcUri) { this.gdcService = notNull(gdcService, "gdcService"); this.gdcUri = URI.create(notEmpty(gdcUri, "gdcUri")); + this.restTemplate = notNull(restTemplate, "restTemplate"); sardine = new SardineImpl(new CustomHttpClientBuilder(httpClient)); } @@ -121,8 +130,13 @@ public void delete(String path) { notEmpty(path, "path"); final URI uri = getUri(path); try { - sardine.delete(uri.toString()); - } catch (IOException e) { + final ResponseEntity result = restTemplate.exchange(uri, HttpMethod.DELETE, org.springframework.http.HttpEntity.EMPTY, Void.class); + + // in case we get redirect (i.e. when we want to delete collection) we will follow redirect to the new location + if (HttpStatus.MOVED_PERMANENTLY.equals(result.getStatusCode())) { + restTemplate.exchange(result.getHeaders().getLocation(), HttpMethod.DELETE, org.springframework.http.HttpEntity.EMPTY, Void.class); + } + } catch (RestClientException e) { throw new DataStoreException("Unable to delete " + uri, e); } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index e3918214d..05f5dc9a0 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -48,6 +48,11 @@ public void setUp() throws Exception { .havingMethodEqualTo("PUT") .respond() .withStatus(200); + onRequest() + .havingPath(startsWith("/uploads/")) + .havingMethodEqualTo("DELETE") + .respond() + .withStatus(200); onRequest() .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/pull") .havingMethodEqualTo("POST") diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 972c09977..a28e38fbe 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -1,7 +1,7 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataAT; -import com.gooddata.gdc.DataStoreService; +import com.gooddata.GoodDataRestException; import org.apache.commons.io.IOUtils; import org.testng.annotations.Test; @@ -10,18 +10,23 @@ import java.io.InputStream; import java.util.UUID; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.fail; + /** * Data store acceptance test */ public class DatastoreServiceAT extends AbstractGoodDataAT { private String file; + private String directory; @Test(groups = "datastore", dependsOnGroups = "account") public void datastoreUpload() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); - file = "/" + UUID.randomUUID().toString() + "/file.csv"; + directory = "/" + UUID.randomUUID().toString(); + file = directory + "/file.csv"; dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); } @@ -42,5 +47,13 @@ public void datastoreDownload() throws Exception { public void datastoreDelete() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); dataStoreService.delete(this.file); + dataStoreService.delete(this.directory); + + try { + dataStoreService.delete(this.directory); + fail("Exception was expected, as there is nothing to delete"); + } catch (GoodDataRestException e) { + assertEquals(404, e.getStatusCode()); + } } } From fe02451713ef845ec929f7daab19ab67cd071df1 Mon Sep 17 00:00:00 2001 From: Richard Benkovsky Date: Wed, 20 Jan 2016 10:06:18 +0100 Subject: [PATCH 0292/1191] Cleansing test code Removed unnecessary imports and some unnecessary conditions. --- src/test/java/com/gooddata/AbstractGoodDataAT.java | 8 +++----- src/test/java/com/gooddata/AbstractGoodDataIT.java | 4 ---- src/test/java/com/gooddata/JsonMatchers.java | 2 -- src/test/java/com/gooddata/collections/UriPageTest.java | 5 ----- .../com/gooddata/dataload/processes/ScheduleTest.java | 2 -- src/test/java/com/gooddata/dataset/FailStatusTest.java | 1 - 6 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index b881e2c07..9f5f58d8a 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -40,11 +40,9 @@ public static String getProperty(String name) { @AfterSuite public static void removeProjectAndLogout() { - if (gd != null) { - if (project != null) { - gd.getProjectService().removeProject(project); - } - gd.logout(); + if (project != null) { + gd.getProjectService().removeProject(project); } + gd.logout(); } } diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 5c0736dda..c4445703d 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -3,16 +3,12 @@ */ package com.gooddata; -import com.gooddata.util.ResourceUtils; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; -import java.io.InputStream; - -import static com.gooddata.util.Validate.notNull; import static net.jadler.Jadler.closeJadler; import static net.jadler.Jadler.initJadler; import static net.jadler.Jadler.port; diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index bb957b4b2..0206e1060 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -1,8 +1,6 @@ package com.gooddata; -import net.javacrumbs.jsonunit.JsonAssert; import net.javacrumbs.jsonunit.core.Configuration; -import net.javacrumbs.jsonunit.core.Option; import net.javacrumbs.jsonunit.core.internal.Diff; import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.BaseMatcher; diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index bfdefea22..7af35a5f7 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -4,17 +4,12 @@ import org.springframework.web.util.UriComponentsBuilder; import org.testng.annotations.Test; -import java.util.Arrays; -import java.util.Collections; - import static java.util.Collections.singletonList; -import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasEntry; import static org.springframework.web.util.UriComponentsBuilder.fromUriString; -import static org.testng.Assert.fail; public class UriPageTest { diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index df016cd89..d0ca412fd 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -1,7 +1,6 @@ package com.gooddata.dataload.processes; import com.fasterxml.jackson.databind.ObjectMapper; -import org.hamcrest.collection.IsMapContaining; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.mockito.Matchers; @@ -14,7 +13,6 @@ import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; -import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java index d98b76c20..f9ce811a4 100644 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ b/src/test/java/com/gooddata/dataset/FailStatusTest.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; -import org.hamcrest.Matchers; import org.testng.annotations.Test; import java.io.InputStream; From 86ef9211ffbceed97b9cd0eaa8852a641d9f40ef Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 26 Jan 2016 15:02:09 +0100 Subject: [PATCH 0293/1191] introduce project events trigger --- src/main/java/com/gooddata/GoodData.java | 12 +++ .../notification/NotificationService.java | 40 +++++++++ .../gooddata/notification/ProjectEvent.java | 88 +++++++++++++++++++ .../notification/NotificationServiceAT.java | 19 ++++ .../notification/NotificationServiceIT.java | 38 ++++++++ .../notification/NotificationServiceTest.java | 52 +++++++++++ .../notification/ProjectEventTest.java | 21 +++++ .../resources/notification/projectEvent.json | 8 ++ 8 files changed, 278 insertions(+) create mode 100644 src/main/java/com/gooddata/notification/NotificationService.java create mode 100644 src/main/java/com/gooddata/notification/ProjectEvent.java create mode 100644 src/test/java/com/gooddata/notification/NotificationServiceAT.java create mode 100644 src/test/java/com/gooddata/notification/NotificationServiceIT.java create mode 100644 src/test/java/com/gooddata/notification/NotificationServiceTest.java create mode 100644 src/test/java/com/gooddata/notification/ProjectEventTest.java create mode 100644 src/test/resources/notification/projectEvent.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 6cb1e7671..ab3e9ad4f 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -6,6 +6,7 @@ import com.gooddata.account.AccountService; import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.notification.NotificationService; import com.gooddata.util.ResponseErrorHandler; import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; @@ -71,6 +72,7 @@ public class GoodData { private final ConnectorService connectorService; private final ProcessService processService; private final WarehouseService warehouseService; + private final NotificationService notificationService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -180,6 +182,7 @@ protected GoodData(String hostname, String login, String password, int port, Str processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); warehouseService = new WarehouseService(getRestTemplate()); connectorService = new ConnectorService(getRestTemplate(), projectService); + notificationService = new NotificationService(getRestTemplate()); } private RestTemplate createRestTemplate(String hostname, HttpClient httpClient, int port, String protocol) { @@ -355,4 +358,13 @@ public WarehouseService getWarehouseService() { public ConnectorService getConnectorService() { return connectorService; } + + /** + * Get initialized service for project notifications management. + * + * @return initialized service for project notifications management + */ + public NotificationService getNotificationService() { + return notificationService; + } } diff --git a/src/main/java/com/gooddata/notification/NotificationService.java b/src/main/java/com/gooddata/notification/NotificationService.java new file mode 100644 index 000000000..a4333f460 --- /dev/null +++ b/src/main/java/com/gooddata/notification/NotificationService.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static com.gooddata.util.Validate.notNull; + +import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.project.Project; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +/** + * Service to trigger and manage notifications. + */ +public class NotificationService extends AbstractService { + + public NotificationService(final RestTemplate restTemplate) { + super(restTemplate); + } + + /** + * Triggers given project event. + * + * @param project project of the event + * @param event event to trigger + */ + public void triggerEvent(final Project project, final ProjectEvent event) { + notNull(project, "project can't be null"); + notNull(event, "event can't be null"); + try { + restTemplate.postForEntity(ProjectEvent.URI, event, Void.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to post project event.", e); + } + } +} diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java new file mode 100644 index 000000000..1d7e22e88 --- /dev/null +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; + +import org.springframework.web.util.UriTemplate; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * Project event. + * + * Serialization only. + */ +@JsonTypeName("projectEvent") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public class ProjectEvent { + + public static final String URI = "/gdc/projects/{projectId}/notifications/events"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final String type; + private final Map parameters; + + public ProjectEvent(final String type) { + this(type, new HashMap()); + } + + public ProjectEvent(final String type, final Map parameters) { + notEmpty(type, "type can't be empty"); + notNull(parameters, "parameters can't be null"); + this.type = type; + this.parameters = parameters; + } + + /** + * Set the parameter with given key and value, overwriting the preceding value of the same key (if any). + * @param key parameter key + * @param value parameter value + */ + public void setParameter(final String key, final String value) { + notNull(key, "parameter key can't be null"); + notNull(value, "parameter value can't be null"); + parameters.put(key, value); + } + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("parameters") + public Map getParameters() { + return parameters; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof ProjectEvent)) + return false; + + ProjectEvent that = (ProjectEvent) o; + + if (type != null ? !type.equals(that.type) : that.type != null) + return false; + return !(parameters != null ? !parameters.equals(that.parameters) : that.parameters != null); + + } + + @Override + public int hashCode() { + int result = type != null ? type.hashCode() : 0; + result = 31 * result + (parameters != null ? parameters.hashCode() : 0); + return result; + } +} diff --git a/src/test/java/com/gooddata/notification/NotificationServiceAT.java b/src/test/java/com/gooddata/notification/NotificationServiceAT.java new file mode 100644 index 000000000..f147666b4 --- /dev/null +++ b/src/test/java/com/gooddata/notification/NotificationServiceAT.java @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static java.util.Collections.singletonMap; + +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +public class NotificationServiceAT extends AbstractGoodDataAT { + + @Test(groups = "notification", dependsOnGroups = "project") + public void triggerProjectEvent() throws Exception { + gd.getNotificationService().triggerEvent(project, new ProjectEvent("sdk.event.test", singletonMap("test", "map"))); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/notification/NotificationServiceIT.java b/src/test/java/com/gooddata/notification/NotificationServiceIT.java new file mode 100644 index 000000000..de2a20336 --- /dev/null +++ b/src/test/java/com/gooddata/notification/NotificationServiceIT.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static java.util.Collections.singletonMap; +import static net.jadler.Jadler.onRequest; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class NotificationServiceIT extends AbstractGoodDataIT { + + private static final String PROJECT_ID = "PROJECT_ID"; + private static final String PROJECT_EVENT_PATH = ProjectEvent.TEMPLATE.expand(PROJECT_ID).toString(); + + private Project project; + + @BeforeClass + public void setUp() throws Exception { + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + } + + @Test + public void shouldTriggerEvent() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROJECT_EVENT_PATH) + .respond() + .withStatus(204); + + gd.getNotificationService().triggerEvent(project, new ProjectEvent("type", singletonMap("key", "value"))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/notification/NotificationServiceTest.java b/src/test/java/com/gooddata/notification/NotificationServiceTest.java new file mode 100644 index 000000000..053cbff4d --- /dev/null +++ b/src/test/java/com/gooddata/notification/NotificationServiceTest.java @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static java.util.Collections.singletonMap; +import static org.mockito.Mockito.*; + +import com.gooddata.project.Project; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class NotificationServiceTest { + + private static final String PROJECT_ID = "TEST_PROJ_ID"; + + @Mock + private Project project; + + @Mock + private RestTemplate restTemplate; + + private NotificationService notificationService; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + notificationService = new NotificationService(restTemplate); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test + public void testTriggerEvent() throws Exception { + final ProjectEvent projectEvent = new ProjectEvent("type", singletonMap("key", "value")); + notificationService.triggerEvent(project, projectEvent); + verify(restTemplate).postForEntity(eq(ProjectEvent.URI), eq(projectEvent), eq(Void.class), eq(PROJECT_ID)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTriggerNullEvent() throws Exception { + notificationService.triggerEvent(project, null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testTriggerNullProject() throws Exception { + notificationService.triggerEvent(null, mock(ProjectEvent.class)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/notification/ProjectEventTest.java b/src/test/java/com/gooddata/notification/ProjectEventTest.java new file mode 100644 index 000000000..7e7da6d11 --- /dev/null +++ b/src/test/java/com/gooddata/notification/ProjectEventTest.java @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.notification; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.testng.annotations.Test; + +public class ProjectEventTest { + + @Test + public void testSerialization() { + final ProjectEvent projectEvent = new ProjectEvent("etl.test"); + projectEvent.setParameter("text", "cool"); + assertThat(projectEvent, serializesToJson("/notification/projectEvent.json")); + } + +} \ No newline at end of file diff --git a/src/test/resources/notification/projectEvent.json b/src/test/resources/notification/projectEvent.json new file mode 100644 index 000000000..ebc179c7f --- /dev/null +++ b/src/test/resources/notification/projectEvent.json @@ -0,0 +1,8 @@ +{ + "projectEvent": { + "type": "etl.test", + "parameters": { + "text": "cool" + } + } +} \ No newline at end of file From 2850c6743d5136f941800a5835622d36189ffd7c Mon Sep 17 00:00:00 2001 From: Ondrej Benkovsky Date: Fri, 29 Jan 2016 11:21:11 +0100 Subject: [PATCH 0294/1191] fixed sardine to close connection --- .../com/gooddata/gdc/DataStoreService.java | 2 +- .../java/com/gooddata/gdc/GdcSardine.java | 36 +++++++++++++++++++ .../java/com/gooddata/AbstractGoodDataAT.java | 24 ++++++++++++- .../com/gooddata/gdc/DatastoreServiceAT.java | 24 +++++++++++++ 4 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gooddata/gdc/GdcSardine.java diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index f2d0d8062..3b6694210 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -63,7 +63,7 @@ public DataStoreService(HttpClient httpClient, RestTemplate restTemplate, GdcSer this.gdcService = notNull(gdcService, "gdcService"); this.gdcUri = URI.create(notEmpty(gdcUri, "gdcUri")); this.restTemplate = notNull(restTemplate, "restTemplate"); - sardine = new SardineImpl(new CustomHttpClientBuilder(httpClient)); + sardine = new GdcSardine(new CustomHttpClientBuilder(httpClient)); } private UriPrefixer getPrefixer() { diff --git a/src/main/java/com/gooddata/gdc/GdcSardine.java b/src/main/java/com/gooddata/gdc/GdcSardine.java new file mode 100644 index 000000000..7f1b3d755 --- /dev/null +++ b/src/main/java/com/gooddata/gdc/GdcSardine.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import static com.gooddata.util.Validate.notNull; + +import com.github.sardine.impl.SardineImpl; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.methods.HttpRequestBase; +import org.apache.http.impl.client.HttpClientBuilder; + +import java.io.IOException; + +/** + * This class extends SardineImpl, connections were not correctly closed by parent + */ +class GdcSardine extends SardineImpl { + + public GdcSardine(HttpClientBuilder builder) { + super(builder); + } + + /** + * had to be overriden, because parent method did not close connection after execution + */ + @Override + protected T execute(HttpRequestBase request, ResponseHandler responseHandler) throws IOException { + try { + notNull(request,"request must not be null!"); + return super.execute(request, responseHandler); + } finally { + request.releaseConnection(); + } + } +} diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 9f5f58d8a..ed711399c 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -1,11 +1,18 @@ package com.gooddata; +import com.gooddata.http.client.GoodDataHttpClient; +import com.gooddata.http.client.LoginSSTRetrievalStrategy; +import com.gooddata.http.client.SSTRetrievalStrategy; import com.gooddata.md.Attribute; import com.gooddata.md.Metric; import com.gooddata.md.ScheduledMail; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; +import org.apache.http.HttpHost; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.joda.time.LocalDate; import org.testng.annotations.AfterSuite; @@ -18,7 +25,22 @@ public abstract class AbstractGoodDataAT { "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); protected static final GoodData gd = - new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); + new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")){ + /** + * had to be overriden to access connectionManager, to test how many connections were not closed + */ + @Override + protected HttpClient createHttpClient(String login, String password, String hostname, int port, String protocol, HttpClientBuilder builder) { + PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager(); + final HttpHost host = new HttpHost(hostname, port, protocol); + final HttpClient httpClient = builder.setConnectionManager(httpClientConnectionManager).build(); + final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(httpClient, host, login, password); + connManager = httpClientConnectionManager; + return new GoodDataHttpClient(httpClient, strategy); + } + }; + + protected static PoolingHttpClientConnectionManager connManager; protected static Project project; diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index a28e38fbe..3bc3669b1 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -10,6 +10,9 @@ import java.io.InputStream; import java.util.UUID; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; @@ -20,6 +23,7 @@ public class DatastoreServiceAT extends AbstractGoodDataAT { private String file; private String directory; + private static final int ITER_MAX = 10; @Test(groups = "datastore", dependsOnGroups = "account") public void datastoreUpload() throws Exception { @@ -56,4 +60,24 @@ public void datastoreDelete() throws Exception { assertEquals(404, e.getStatusCode()); } } + + @Test(groups = "datastore", dependsOnGroups = "account") + public void datastoreConnectionsClosedAfterMultipleConnections() { + DataStoreService dataStoreService = gd.getDataStoreService(); + directory = "/" + UUID.randomUUID().toString(); + for (int i = 0; i < ITER_MAX; i++) { + dataStoreService.upload(directory + "/file" + i + ".csv", getClass().getResourceAsStream("/person.csv")); + } + assertThat(connManager.getTotalStats().getLeased(), is(equalTo(0))); + } + + @Test(groups = "datastore", dependsOnGroups = "account") + public void datastoreConnectionClosedAfterSingleConnection() throws Exception { + DataStoreService dataStoreService = gd.getDataStoreService(); + + directory = "/" + UUID.randomUUID().toString(); + file = directory + "/file.csv"; + dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); + assertThat(connManager.getTotalStats().getLeased(), is(equalTo(0))); + } } From d639c7cb06db614be2425b7ca95c4db0f2e23dfc Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 3 Feb 2016 11:34:35 +0100 Subject: [PATCH 0295/1191] fix invalid javadocs --- src/main/java/com/gooddata/collections/Page.java | 8 ++++---- src/main/java/com/gooddata/collections/UriPage.java | 2 +- .../java/com/gooddata/connector/ConnectorService.java | 2 +- src/main/java/com/gooddata/md/ReportAttachment.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gooddata/collections/Page.java b/src/main/java/com/gooddata/collections/Page.java index ab374e7a5..6216455d7 100644 --- a/src/main/java/com/gooddata/collections/Page.java +++ b/src/main/java/com/gooddata/collections/Page.java @@ -12,7 +12,7 @@ public interface Page { /** * Creates {@link URI} for this page request. - *

+ *

* Use {@link #updateWithPageParams(UriComponentsBuilder)} if you have URI template and only want to update it with * page query params. * @@ -23,17 +23,17 @@ public interface Page { /** * Updates provided URI builder query params according to this page configuration. - *

+ *

* As {@link #getPageUri(UriComponentsBuilder)} returns expanded page URI it is not very useful for cases that * require use of URI template with URI variables. This method allows you to use URI templates and benefit * from pagination support implemented in {@link Page} implementations. It is especially useful if you need to handle * multiple requests of the same URI template in the same way - e.g. monitor request made by {@link RestOperations} * methods. - *

+ *

* Use this in the situation when you have URI template with placeholders and URI variables separately. * This method is useful when you have URI template with placeholders and only want to add query parameters based * on this page to it. - *

+ *

* Use {@link #getPageUri(UriComponentsBuilder)} if you want to get concrete page URI and don't have URI template. * * @param uriBuilder URI builder used for constructing page URI diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index f44a1a7d3..19228a4d3 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -38,7 +38,7 @@ public URI getPageUri(final UriComponentsBuilder uriBuilder) { /** * {@inheritDoc} - *

+ *

* Note that by using this method you might end up with URI that will be different from the one returned by * {@link #getPageUri(UriComponentsBuilder)}. Method only copies query parameters and does not care about * URI path. diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index 23f4f9b90..a60a338a1 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -208,7 +208,7 @@ public FutureResult executeProcess(final Project project, final P /** * Gets status of provided connector process. - *

+ *

* You can use process retrieved by getXXXProcess methods on {@link Integration} as well as a result of * {@link ConnectorService#executeProcess(Project, ProcessExecution)}. * diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java index 687edabf2..6f2af36a8 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -94,7 +94,7 @@ protected ReportAttachment(String uri, Map exportOptions, Report * * * - * @return + * @return map of export options */ public Map getExportOptions() { return exportOptions; } From 3af7bfc29b945d4930010301cc7a0f4d5ca74b09 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 3 Feb 2016 13:59:24 +0100 Subject: [PATCH 0296/1191] [maven-release-plugin] prepare release gooddata-java-1.2.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7c594864c..a36438f4a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.1-SNAPSHOT + 1.2.1 ${project.artifactId} GoodData Java SDK From c97211593d07a83bd135c9a15e74cbe5fb33d2f2 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 3 Feb 2016 13:59:24 +0100 Subject: [PATCH 0297/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a36438f4a..bd7ff1de2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.1 + 1.2.2-SNAPSHOT ${project.artifactId} GoodData Java SDK From 14c842e545a3e900a234aabfd53f8595e8bf441f Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 3 Feb 2016 15:15:43 +0100 Subject: [PATCH 0298/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4facfd885..bcad1a907 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.2.0 + 1.2.1 ``` From 57781c198d40986b3d80fc8fed04e7126b9b07f6 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 10 Feb 2016 15:11:03 +0100 Subject: [PATCH 0299/1191] introduce zendesk connector start dates --- .../connector/Zendesk4ProcessExecution.java | 30 +++++++++++++++++++ .../Zendesk4ProcessExecutionTest.java | 10 +++++++ .../process-execution-startDate.json | 6 ++++ 3 files changed, 46 insertions(+) create mode 100644 src/test/resources/connector/process-execution-startDate.json diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 424633714..a2fca64d0 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -4,14 +4,29 @@ package com.gooddata.connector; import static com.gooddata.connector.ConnectorType.ZENDESK4; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.joda.time.format.DateTimeFormatter; +import org.joda.time.format.ISODateTimeFormat; + +import java.util.Map; +import java.util.TreeMap; /** * Zendesk 4 (Insights) connector process execution (i.e. definition for single ETL run). Serialization only. */ public class Zendesk4ProcessExecution implements ProcessExecution { + private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); + private Boolean incremental; + private Map startTimes; + @Override public ConnectorType getConnectorType() { return ZENDESK4; @@ -24,4 +39,19 @@ public Boolean getIncremental() { public void setIncremental(final Boolean incremental) { this.incremental = incremental; } + + @JsonAnyGetter + public Map getStartTimes() { + return startTimes; + } + + + public void setStartTime(final String resource, final DateTime startTime) { + notEmpty(resource, "resource can't be empty"); + notNull(startTime, "startTime can't be null"); + + startTimes = startTimes == null ? new TreeMap() : startTimes; + + startTimes.put(resource + "StartDate", FORMATTER.print(startTime)); + } } diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index 756a53fef..af8e996aa 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -4,6 +4,7 @@ package com.gooddata.connector; import com.gooddata.JsonMatchers; +import org.joda.time.DateTime; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; @@ -23,4 +24,13 @@ public void testShouldSerializeIncremental() throws Exception { assertThat(execution, JsonMatchers.serializesToJson( "/connector/process-execution-incremental.json")); } + + @Test + public void testShouldSerializeStartTimes() throws Exception { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + execution.setIncremental(true); + execution.setStartTime("tickets", new DateTime(0L)); + assertThat(execution, JsonMatchers.serializesToJson( + "/connector/process-execution-startDate.json")); + } } \ No newline at end of file diff --git a/src/test/resources/connector/process-execution-startDate.json b/src/test/resources/connector/process-execution-startDate.json new file mode 100644 index 000000000..3f2042132 --- /dev/null +++ b/src/test/resources/connector/process-execution-startDate.json @@ -0,0 +1,6 @@ +{ + "process": { + "incremental": true, + "ticketsStartDate": "1970-01-01T00:00:00.000Z" + } +} \ No newline at end of file From f831092fd39e1261c07fbd9619615846c1b36279 Mon Sep 17 00:00:00 2001 From: Ondrej Benkovsky Date: Mon, 1 Feb 2016 14:55:33 +0100 Subject: [PATCH 0300/1191] parser for batch fail status json --- .../com/gooddata/dataset/BatchFailStatus.java | 54 +++++++++++++ .../com/gooddata/dataset/DatasetService.java | 80 ++++++++++++------- .../gooddata/dataset/BatchFailStatusTest.java | 43 ++++++++++ .../gooddata/dataset/DatasetServiceAT.java | 33 ++++++++ .../gooddata/dataset/DatasetServiceIT.java | 50 ++++++++++++ src/test/resources/corruptedPerson.csv | 5 ++ .../resources/dataset/batchFailStatus1.json | 33 ++++++++ .../resources/dataset/batchFailStatus2.json | 9 +++ 8 files changed, 277 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/BatchFailStatus.java create mode 100644 src/test/java/com/gooddata/dataset/BatchFailStatusTest.java create mode 100644 src/test/resources/corruptedPerson.csv create mode 100755 src/test/resources/dataset/batchFailStatus1.json create mode 100644 src/test/resources/dataset/batchFailStatus2.json diff --git a/src/main/java/com/gooddata/dataset/BatchFailStatus.java b/src/main/java/com/gooddata/dataset/BatchFailStatus.java new file mode 100644 index 000000000..924c9cad6 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/BatchFailStatus.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import com.fasterxml.jackson.annotation.JsonCreator; +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; +import com.gooddata.util.GDDateTimeDeserializer; +import com.gooddata.util.GDDateTimeSerializer; + +import org.joda.time.DateTime; + +import java.util.List; + +/** + * Batch fail status of dataset load. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class BatchFailStatus { + + private final List failStatuses; + private final List messages; + private final String status; + private final DateTime date; + + @JsonCreator + private BatchFailStatus(@JsonProperty("uploads") List failStatuses, @JsonProperty("messages") List messages, + @JsonProperty("status") String status, @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date) { + this.failStatuses = failStatuses; + this.messages = messages; + this.status = status; + this.date = date; + } + + public List getFailStatuses() { + return failStatuses; + } + + public List getMessages() { + return messages; + } + + public String getStatus() { + return status; + } + + @JsonSerialize(using = GDDateTimeSerializer.class) + public DateTime getDate() { + return date; + } +} diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 2a5dc57e4..9332208b4 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -35,6 +35,7 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; +import static java.util.Collections.singletonList; import static org.springframework.util.StringUtils.isEmpty; /** @@ -101,7 +102,7 @@ public FutureResult loadDataset(final Project project, final DatasetManife final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); - return pullLoad(project, dirPath, manifest.getDataSet()); + return pullLoad(project, dirPath, manifest.getDataSet(), false); } catch (IOException e) { throw new DatasetException("Unable to serialize manifest", manifest.getDataSet(), e); } catch (DataStoreException | GoodDataRestException | RestClientException e) { @@ -156,7 +157,7 @@ public FutureResult loadDatasets(final Project project, final Collection datasets) } } - private FutureResult pullLoad(Project project, final Path dirPath, final String dataset) { - return pullLoad(project, dirPath, asList(dataset)); + private FutureResult pullLoad(Project project, final Path dirPath, final String dataset, boolean isBatchUpload) { + return pullLoad(project, dirPath, singletonList(dataset), isBatchUpload); } - private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets) { + private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets, final boolean isBatchUpload) { final PullTask pullTask = restTemplate .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); return new PollResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { @@ -192,7 +193,7 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { final PullTaskStatus status = extractData(response, PullTaskStatus.class); final boolean finished = status.isFinished(); if (finished && !status.isSuccess()) { - final String message = getErrorMessage(status, dirPath); + final String message = getErrorMessage(status, dirPath, isBatchUpload); throw new DatasetException(message, datasets); } return finished; @@ -215,30 +216,16 @@ protected void onFinish() { } - private String getErrorMessage(final PullTaskStatus status, final Path dirPath) { + private String getErrorMessage(final PullTaskStatus status, final Path dirPath, boolean isBatchUpload) { String message = "status: " + status.getStatus(); try { - final FailStatus failStatus = download(dirPath.resolve(STATUS_FILE_NAME), FailStatus.class); - if (failStatus != null) { - final List errorParts = failStatus.getErrorParts(); - if (!errorParts.isEmpty()) { - final List errors = new ArrayList<>(); - for (FailPart part: errorParts) { - if (part.getLogName() != null) { - try { - final String[] msg = download(dirPath.resolve(part.getLogName()), String[].class); - errors.addAll(asList(msg)); - } catch (IOException | DataStoreException e) { - if (part.getError() != null) { - errors.add(part.getError().getFormattedMessage()); - } - } - } - } - message = errors.toString(); - } else if (failStatus.getError() != null) { - message = failStatus.getError().getFormattedMessage(); - } + Path statusFile = dirPath.resolve(STATUS_FILE_NAME); + if (isBatchUpload) { + final BatchFailStatus batchFailStatus = download(statusFile, BatchFailStatus.class); + message = getBatchFailStatusErrorMsg(dirPath, message, batchFailStatus); + } else { + final FailStatus failStatus = download(statusFile, FailStatus.class); + message = getFailStatusErrorMsg(dirPath, message, failStatus); } } catch (IOException | DataStoreException ignored) { // todo log? @@ -246,6 +233,41 @@ private String getErrorMessage(final PullTaskStatus status, final Path dirPath) return message; } + private String getBatchFailStatusErrorMsg(final Path dirPath, final String defaultMessage, final BatchFailStatus batchFailStatus) { + if (batchFailStatus == null || batchFailStatus.getFailStatuses() == null) { + return defaultMessage; + } + final List messages = new ArrayList<>(); + for (FailStatus failStatus : batchFailStatus.getFailStatuses()) { + messages.add(getFailStatusErrorMsg(dirPath, defaultMessage, failStatus)); + } + return messages.isEmpty() ? defaultMessage : messages.toString(); + } + + private String getFailStatusErrorMsg(final Path dirPath, final String defaultMessage, final FailStatus failStatus) { + if (failStatus == null) { + return defaultMessage; + } + final List errorParts = failStatus.getErrorParts(); + if (errorParts.isEmpty()){ + return (failStatus.getError() != null) ? failStatus.getError().getFormattedMessage() : defaultMessage; + } + final List errors = new ArrayList<>(); + for (FailPart part : errorParts) { + if (part.getLogName() != null) { + try { + final String[] msg = download(dirPath.resolve(part.getLogName()), String[].class); + errors.addAll(asList(msg)); + } catch (IOException | DataStoreException e) { + if (part.getError() != null) { + errors.add(part.getError().getFormattedMessage()); + } + } + } + } + return errors.toString(); + } + private T download(final Path path, final Class type) throws IOException { try (final InputStream input = dataStoreService.download(path.toString())) { return mapper.readValue(input, type); @@ -324,7 +346,6 @@ public void handlePollException(final GoodDataRestException e) { * @param project project to be updated * @param maqlDml update script to be executed in the project * @return poll result - * * @see com.gooddata.model.ModelService#updateProjectModel */ public FutureResult updateProjectData(final Project project, final String maqlDml) { @@ -362,5 +383,4 @@ public void handlePollException(final GoodDataRestException e) { } }); } - } diff --git a/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java b/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java new file mode 100644 index 000000000..705397fa0 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.hamcrest.Matchers; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.io.InputStream; + +public class BatchFailStatusTest { + @Test + public void testParser() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/batchFailStatus1.json"); + final BatchFailStatus value = new ObjectMapper().readValue(stream, BatchFailStatus.class); + assertThat(value, is(notNullValue())); + assertThat(value.getStatus(),is("ERROR")); + assertThat(value.getMessages(),is(Matchers.empty())); + assertThat(value.getDate(),is(new DateTime(2016,2,1,10,12,9, DateTimeZone.UTC))); + assertThat(value.getFailStatuses(),hasSize(2)); + } + + @Test + public void testParser2() throws IOException { + final InputStream stream = getClass().getResourceAsStream("/dataset/batchFailStatus2.json"); + final BatchFailStatus value = new ObjectMapper().readValue(stream, BatchFailStatus.class); + assertThat(value,is(notNullValue())); + assertThat(value.getStatus(),is("ERROR")); + assertThat(value.getMessages(),containsInAnyOrder("test1","test2")); + assertThat(value.getDate(),is(new DateTime(2016,1,1,10,11,15, DateTimeZone.UTC))); + assertThat(value.getFailStatuses(),is(Matchers.empty())); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index 6afb34cdb..42dde60c4 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -1,6 +1,12 @@ package com.gooddata.dataset; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.testng.Assert.fail; + import com.gooddata.AbstractGoodDataAT; +import static org.hamcrest.MatcherAssert.assertThat; + import org.testng.annotations.Test; /** @@ -34,5 +40,32 @@ public void updateData() { datasetService.updateProjectData(project, "DELETE FROM {attr.person.name} WHERE {label.person.name} = \"not exists\";"); } + @Test(groups = "dataset", dependsOnGroups = {"md", "datastore"}) + public void loadDatasetFail(){ + final DatasetService datasetService = gd.getDatasetService(); + final DatasetManifest manifest = datasetService.getDatasetManifest(project, "dataset.person"); + try { + datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/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"))); + } + } + + @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) + public void loadDatasetBatchFail() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + final DatasetManifest personManifest = datasetService.getDatasetManifest(project, "dataset.person"); + personManifest.setSource(getClass().getResourceAsStream("/corruptedPerson.csv")); + final DatasetManifest cityManifest = datasetService.getDatasetManifest(project, "dataset.city"); + cityManifest.setSource(getClass().getResourceAsStream("/city.csv")); + + try { + 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, Number of columns doesn't corespond on line 3 in dataset.person.csv]"))); + } + } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 05f5dc9a0..1e43fac44 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -280,4 +280,54 @@ public void shouldFailUpdateProjectData() throws IOException { gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); } + + @Test + public void shouldReadBatchErrorMessages() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/pullTaskStatusError.json")); + onRequest() + .havingPath(containsString("upload_status.json")) + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/batchFailStatus1.json")); + + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final InputStream source = new ByteArrayInputStream(new byte[]{}); + manifest.setSource(source); + try { + gd.getDatasetService().loadDatasets(project, manifest).get(); + fail("Exception should be thrown"); + } catch (DatasetException e) { + assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: [Manifest consist of columns that are not in single CSV file dataset.stats.csv: f_competitors.nm_name., Manifest consist of columns that are not in single CSV file dataset.stats.csv: f_competitors.nm_name.]")); + } + } + + @Test + public void shouldReadBatchErrorMessagesNoFailStatuses() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/pullTaskStatusError.json")); + onRequest() + .havingPath(containsString("upload_status.json")) + .havingMethodEqualTo("GET") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/batchFailStatus2.json")); + + final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final InputStream source = new ByteArrayInputStream(new byte[]{}); + manifest.setSource(source); + try { + gd.getDatasetService().loadDatasets(project, manifest).get(); + fail("Exception should be thrown"); + } catch (DatasetException e) { + assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: status: ERROR")); + } + } } \ No newline at end of file diff --git a/src/test/resources/corruptedPerson.csv b/src/test/resources/corruptedPerson.csv new file mode 100644 index 000000000..d31565503 --- /dev/null +++ b/src/test/resources/corruptedPerson.csv @@ -0,0 +1,5 @@ +f_person.f_shoesize,f_person.nm_name,d_person_role.nm_role,f_person.f_age,d_person_department.nm_department +37,Jane,manager,35,HR +42,developer,25,DevOps +35,Sandy,recruiter,27 +40,Jonathan,developer,50,DevOps diff --git a/src/test/resources/dataset/batchFailStatus1.json b/src/test/resources/dataset/batchFailStatus1.json new file mode 100755 index 000000000..cb135ab94 --- /dev/null +++ b/src/test/resources/dataset/batchFailStatus1.json @@ -0,0 +1,33 @@ +{ + "uploads" : [ + { + "date" : "2016-02-01 10:12:09", + "status" : "ERROR", + "error" : { + "parameters" : [ + "dataset.stats.csv", + "f_competitors.nm_name" + ], + "component" : "GDC::SliToDli", + "errorClass" : "GDC::Exception::User", + "message" : "Manifest consist of columns that are not in single CSV file %s: %s." + } + }, + { + "date" : "2016-02-01 10:12:09", + "status" : "ERROR", + "error" : { + "parameters" : [ + "dataset.stats.csv", + "f_competitors.nm_name" + ], + "component" : "GDC::SliToDli", + "errorClass" : "GDC::Exception::User", + "message" : "Manifest consist of columns that are not in single CSV file %s: %s." + } + } + ], + "messages" : [], + "status" : "ERROR", + "date" : "2016-02-01 10:12:09" +} \ No newline at end of file diff --git a/src/test/resources/dataset/batchFailStatus2.json b/src/test/resources/dataset/batchFailStatus2.json new file mode 100644 index 000000000..e789a3157 --- /dev/null +++ b/src/test/resources/dataset/batchFailStatus2.json @@ -0,0 +1,9 @@ +{ + "uploads": [], + "messages": [ + "test1", + "test2" + ], + "status": "ERROR", + "date": "2016-01-01 10:11:15" +} \ No newline at end of file From afe9f0e2f776271a59c7bae28ccee2cb69f7f9a1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 11 Feb 2016 13:53:46 +0100 Subject: [PATCH 0301/1191] [maven-release-plugin] prepare release gooddata-java-1.2.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bd7ff1de2..ed6c76f52 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.2-SNAPSHOT + 1.2.2 ${project.artifactId} GoodData Java SDK From b41305444802656ad591ceed822976ad3759ddb6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 11 Feb 2016 13:53:47 +0100 Subject: [PATCH 0302/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ed6c76f52..4917e6bc1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.2 + 1.2.3-SNAPSHOT ${project.artifactId} GoodData Java SDK From 419b5fdb690a6caf996bca3b34ccabc27ceb659a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 11 Feb 2016 14:32:57 +0100 Subject: [PATCH 0303/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bcad1a907..7f56be041 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.2.1 + 1.2.2 ``` From 2dd9fc8d789b830d721744a86f480791187b3584 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 11 Feb 2016 14:50:38 +0100 Subject: [PATCH 0304/1191] add code of conduct --- CODE_OF_CONDUCT.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 CODE_OF_CONDUCT.md diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..a734e49fb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,5 @@ +# Contributor Code of Conduct + +This project adheres to No Code of Conduct. We are all adults. We accept anyone's contributions. Nothing else matters. + +For more information please visit the [No Code of Conduct](https://github.com/domgetter/NCoC) homepage. From d801f1c772c7cd4d1f569236cb73a9486b1c82ef Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 29 Jan 2016 16:21:57 +0100 Subject: [PATCH 0305/1191] Report the unauthenticated webdav 500 response conveniently --- .../com/gooddata/gdc/DataStoreService.java | 8 +++++++ .../com/gooddata/gdc/DatastoreServiceAT.java | 23 ++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 3b6694210..f5842a5ee 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -4,6 +4,7 @@ package com.gooddata.gdc; import com.github.sardine.Sardine; +import com.github.sardine.impl.SardineException; import com.github.sardine.impl.SardineImpl; import com.gooddata.UriPrefixer; import org.apache.commons.lang.Validate; @@ -100,6 +101,13 @@ public void upload(String path, InputStream stream) { private void upload(URI url, InputStream stream) { try { sardine.put(url.toString(), stream); + } catch (SardineException e) { + if (HttpStatus.INTERNAL_SERVER_ERROR.value() == e.getStatusCode()) { + throw new DataStoreException("Got 500 while uploading to " + url + "." + + "\nThis can be known limitation, see https://github.com/martiner/gooddata-java/wiki/Known-limitations", e); + } else { + throw new DataStoreException("Unable to upload to " + url + " got status " + e.getStatusCode(), e); + } } catch (IOException e) { throw new DataStoreException("Unable to upload to " + url, e); } diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 3bc3669b1..65180c2e0 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -1,8 +1,11 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataAT; +import com.gooddata.GoodData; import com.gooddata.GoodDataRestException; import org.apache.commons.io.IOUtils; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.File; @@ -25,11 +28,15 @@ public class DatastoreServiceAT extends AbstractGoodDataAT { private String directory; private static final int ITER_MAX = 10; + @BeforeClass + public void setUp() throws Exception { + directory = "/" + UUID.randomUUID().toString(); + } + @Test(groups = "datastore", dependsOnGroups = "account") public void datastoreUpload() throws Exception { DataStoreService dataStoreService = gd.getDataStoreService(); - directory = "/" + UUID.randomUUID().toString(); file = directory + "/file.csv"; dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); } @@ -80,4 +87,18 @@ public void datastoreConnectionClosedAfterSingleConnection() throws Exception { dataStoreService.upload(file, getClass().getResourceAsStream("/person.csv")); assertThat(connManager.getTotalStats().getLeased(), is(equalTo(0))); } + + @Test(groups = "datastore", expectedExceptions = DataStoreException.class, + expectedExceptionsMessageRegExp = "(?s).* 500 .*https://github.com/.*/Known-limitations") + public void datastoreUploadWithAuthentication() throws Exception { + final GoodData datastoreGd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); + DataStoreService dataStoreService = datastoreGd.getDataStoreService(); + + try { + final String fileWithAuth = directory + "/fileWithAuth.csv"; + dataStoreService.upload(fileWithAuth, getClass().getResourceAsStream("/person.csv")); + } finally { + datastoreGd.logout(); + } + } } From 5ad2587ae0cc74b04299038bdd0abb841b508f8b Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 15 Feb 2016 10:54:02 +0100 Subject: [PATCH 0306/1191] Add support for partial metadata import/export --- src/main/java/com/gooddata/GoodData.java | 12 ++ .../java/com/gooddata/md/MetadataService.java | 1 - .../md/maintenance/ExportImportException.java | 16 ++ .../md/maintenance/ExportImportService.java | 102 ++++++++++++ .../md/maintenance/PartialMdArtifact.java | 35 ++++ .../md/maintenance/PartialMdExport.java | 86 ++++++++++ .../md/maintenance/PartialMdExportToken.java | 105 ++++++++++++ .../java/com/gooddata/AbstractGoodDataAT.java | 1 + .../java/com/gooddata/gdc/TaskStatusTest.java | 3 +- .../gooddata/md/ExportImportServiceAT.java | 67 ++++++++ .../md/maintenance/ExportImportServiceIT.java | 152 ++++++++++++++++++ .../maintenance/ExportImportServiceTest.java | 54 +++++++ .../md/maintenance/PartialMdArtifactTest.java | 30 ++++ .../md/maintenance/PartialMdExportTest.java | 30 ++++ .../maintenance/PartialMdExportTokenTest.java | 18 +++ .../gooddata/project/ProjectServiceAT.java | 2 - .../task-status.json} | 0 .../partial-export-task-status-fail.json | 17 ++ .../partial-import-task-status-fail.json | 17 ++ .../md/maintenance/partialMDArtifact.json | 8 + .../partialMDExport-defaultVals.json | 8 + .../md/maintenance/partialMDExport.json | 10 ++ .../md/maintenance/partialMDImport.json | 8 + 23 files changed, 777 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gooddata/md/maintenance/ExportImportException.java create mode 100644 src/main/java/com/gooddata/md/maintenance/ExportImportService.java create mode 100644 src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java create mode 100644 src/main/java/com/gooddata/md/maintenance/PartialMdExport.java create mode 100644 src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java create mode 100644 src/test/java/com/gooddata/md/ExportImportServiceAT.java create mode 100644 src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java create mode 100644 src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java create mode 100644 src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java create mode 100644 src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java create mode 100644 src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java rename src/test/resources/{model/maql-ddl-task-status.json => gdc/task-status.json} (100%) create mode 100644 src/test/resources/md/maintenance/partial-export-task-status-fail.json create mode 100644 src/test/resources/md/maintenance/partial-import-task-status-fail.json create mode 100644 src/test/resources/md/maintenance/partialMDArtifact.json create mode 100644 src/test/resources/md/maintenance/partialMDExport-defaultVals.json create mode 100644 src/test/resources/md/maintenance/partialMDExport.json create mode 100644 src/test/resources/md/maintenance/partialMDImport.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index ab3e9ad4f..1b77ed9a1 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -6,6 +6,7 @@ import com.gooddata.account.AccountService; import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; import com.gooddata.util.ResponseErrorHandler; import com.gooddata.warehouse.WarehouseService; @@ -73,6 +74,7 @@ public class GoodData { private final ProcessService processService; private final WarehouseService warehouseService; private final NotificationService notificationService; + private final ExportImportService exportImportService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -183,6 +185,7 @@ protected GoodData(String hostname, String login, String password, int port, Str warehouseService = new WarehouseService(getRestTemplate()); connectorService = new ConnectorService(getRestTemplate(), projectService); notificationService = new NotificationService(getRestTemplate()); + exportImportService = new ExportImportService(getRestTemplate()); } private RestTemplate createRestTemplate(String hostname, HttpClient httpClient, int port, String protocol) { @@ -367,4 +370,13 @@ public ConnectorService getConnectorService() { public NotificationService getNotificationService() { return notificationService; } + + /** + * Get initialized service for metadata export/import. + * + * @return initialized service for metadata export/import + */ + public ExportImportService getExportImportService() { + return exportImportService; + } } diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 221cd6594..165564c64 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -20,7 +20,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportException.java b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java new file mode 100644 index 000000000..24f56d6ef --- /dev/null +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java @@ -0,0 +1,16 @@ +package com.gooddata.md.maintenance; + +import com.gooddata.GoodDataException; + +/** + * Exception thrown by ExportImportService when some task failed. + */ +public class ExportImportException extends GoodDataException { + public ExportImportException(String message) { + super(message); + } + + public ExportImportException(String message, Throwable cause) { + super(message, cause); + } +} diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java new file mode 100644 index 000000000..07af4f2e9 --- /dev/null +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.maintenance; + +import static com.gooddata.util.Validate.notNull; + +import com.gooddata.AbstractPollHandler; +import com.gooddata.AbstractService; +import com.gooddata.FutureResult; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.PollResult; +import com.gooddata.gdc.TaskStatus; +import com.gooddata.gdc.UriResponse; +import com.gooddata.project.Project; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +/** + * Service providing metadata export/import tasks. + */ +public class ExportImportService extends AbstractService { + + public ExportImportService(RestTemplate restTemplate) { + super(restTemplate); + } + + + /** + * Exports partial metadata from project and returns token identifying this export + * + * @param project project from which metadata should be exported + * @param export export to execute + * @return {@link FutureResult} of the task containing token identifying partial export after the task is completed + * @throws ExportImportException when export resource call fails, polling on export status fails or export status is ERROR + */ + public FutureResult partialExport(Project project, final PartialMdExport export) { + notNull(project, "project"); + notNull(export, "export"); + + final PartialMdArtifact partialMdArtifact; + try { + partialMdArtifact = restTemplate.postForObject(PartialMdExport.URI, export, PartialMdArtifact.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new ExportImportException("Unable to export metadata from objects " + export.getUris() + ".", e); + } + + return new PollResult<>(this, new AbstractPollHandler(partialMdArtifact.getStatus().getUri(), + TaskStatus.class, PartialMdExportToken.class) { + @Override + public void handlePollResult(TaskStatus pollResult) { + if (!pollResult.isSuccess()) { + throw new ExportImportException("Partial metadata export failed with errors: " + pollResult.getMessages()); + } + setResult(new PartialMdExportToken(partialMdArtifact.getToken(), export.isExportAttributeProperties())); + } + + @Override + public void handlePollException(GoodDataRestException e) { + throw new ExportImportException("Unable to to export partial metadata.", e); + } + }); + } + + /** + * Imports partial metadata to project based on given token + * + * @param project project to which metadata should be imported + * @param mdExportToken export token to be imported + * @return {@link FutureResult} of the task + * @throws ExportImportException when import resource call fails, polling on import status fails or import status is ERROR + */ + public FutureResult partialImport(Project project, PartialMdExportToken mdExportToken) { + notNull(project, "project"); + notNull(mdExportToken, "mdExportToken"); + + final UriResponse importResponse; + try { + importResponse = restTemplate.postForObject(PartialMdExportToken.URI, mdExportToken, UriResponse.class, project.getId()); + } catch (GoodDataRestException | RestClientException e) { + throw new ExportImportException("Unable to import partial metadata to project '" + project.getUri() + + "' with token '" + mdExportToken.getToken() + "'.", e); + } + + return new PollResult<>(this, new AbstractPollHandler(importResponse.getUri(), TaskStatus.class, Void.class) { + @Override + public void handlePollResult(TaskStatus pollResult) { + if (!pollResult.isSuccess()) { + throw new ExportImportException("Partial metadata import failed with errors: " + pollResult.getMessages()); + } + setResult(null); + } + + @Override + public void handlePollException(GoodDataRestException e) { + throw new ExportImportException("Unable to import partial metadata.", e); + } + }); + } +} diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java new file mode 100644 index 000000000..a3abec75b --- /dev/null +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java @@ -0,0 +1,35 @@ +package com.gooddata.md.maintenance; + +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.gdc.UriResponse; + +/** + * Partial metadata export result structure. + * For internal use only. + */ +@JsonTypeName("partialMDArtifact") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonInclude(JsonInclude.Include.NON_NULL) +class PartialMdArtifact { + + private final UriResponse status; + private final String token; + + @JsonCreator + public PartialMdArtifact(@JsonProperty("status") UriResponse status, @JsonProperty("token") String token) { + this.status = status; + this.token = token; + } + + public UriResponse getStatus() { + return status; + } + + public String getToken() { + return token; + } +} diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java new file mode 100644 index 000000000..ed72f6b6f --- /dev/null +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java @@ -0,0 +1,86 @@ +package com.gooddata.md.maintenance; + +import static com.gooddata.util.Validate.notEmpty; +import static java.util.Arrays.asList; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Collection; +import java.util.HashSet; + +/** + * Partial metadata export configuration structure. + * Serialization only. + */ +@JsonTypeName("partialMDExport") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonInclude(JsonInclude.Include.NON_DEFAULT) +public class PartialMdExport { + + public static final String URI = "/gdc/md/{projectId}/maintenance/partialmdexport"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final Collection uris; + private final boolean crossDataCenterExport; + private final boolean exportAttributeProperties; + + /** + * Creates new PartialMdExport. At least one uri should be given. + * Sets crossDataCenterExport and exportAttributeProperties to false. + * + * @param mdObjectsUris list of uris to metadata objects which should be exported + */ + public PartialMdExport(String... mdObjectsUris) { + this(new HashSet<>(asList(mdObjectsUris))); + } + + /** + * Creates new PartialMdExport. At least one uri should be given. + * Sets crossDataCenterExport and exportAttributeProperties to false. + * + * @param mdObjectsUris list of uris to metadata objects which should be exported + */ + public PartialMdExport(Collection mdObjectsUris) { + this(false, false, mdObjectsUris); + } + + /** + * Creates new PartialMdExport. At least one uri should be given. + * + * @param exportAttributeProperties whether to add necessary data to be able to clone attribute properties + * @param crossDataCenterExport whether export should be usable in any Data Center + * @param mdObjectsUris list of uris to metadata objects which should be exported + */ + public PartialMdExport(boolean exportAttributeProperties, boolean crossDataCenterExport, String... mdObjectsUris) { + this(exportAttributeProperties, crossDataCenterExport, new HashSet<>(asList(mdObjectsUris))); + } + + /** + * Creates new PartialMdExport. At least one uri should be given. + * + * @param exportAttributeProperties whether to add necessary data to be able to clone attribute properties + * @param crossDataCenterExport whether export should be usable in any Data Center + * @param mdObjectsUris list of uris to metadata objects which should be exported + */ + public PartialMdExport(boolean exportAttributeProperties, boolean crossDataCenterExport, Collection mdObjectsUris) { + notEmpty(mdObjectsUris, "uris"); + this.uris = mdObjectsUris; + this.crossDataCenterExport = crossDataCenterExport; + this.exportAttributeProperties = exportAttributeProperties; + } + + public Collection getUris() { + return uris; + } + + public boolean isCrossDataCenterExport() { + return crossDataCenterExport; + } + + public boolean isExportAttributeProperties() { + return exportAttributeProperties; + } +} diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java new file mode 100644 index 000000000..1c928a422 --- /dev/null +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java @@ -0,0 +1,105 @@ +package com.gooddata.md.maintenance; + +import static com.gooddata.util.Validate.notEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +/** + * Partial metadata export token. Serves as configuration structure for import. + * Serialization only. + */ +@JsonTypeName("partialMDImport") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public class PartialMdExportToken { + + public static final String URI = "/gdc/md/{projectId}/maintenance/partialmdimport"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final String token; + private boolean overwriteNewer; + private boolean updateLDMObjects; + private boolean importAttributeProperties; + + /** + * Creates new PartialMdExportToken. + *
+ * Sets default values to properties: + *

    + *
  • importAttributeProperties - default false
  • + *
  • overwriteNewer - default true
  • + *
  • updateLDMObjects - default false
  • + *
+ * + * @param token token identifying metadata partially exported from another project + */ + public PartialMdExportToken(String token) { + this(token, false); + } + + /** + * Creates new PartialMdExportToken. For internal purposes only. + *
+ * Sets default values to properties: + *
    + *
  • overwriteNewer - default true
  • + *
  • updateLDMObjects - default false
  • + *
+ * + * @param token token identifying metadata partially exported from another project + * @param importAttributeProperties see {@link #setImportAttributeProperties(boolean)} + */ + PartialMdExportToken(String token, boolean importAttributeProperties) { + this.token = notEmpty(token, "token"); + setImportAttributeProperties(importAttributeProperties); + setOverwriteNewer(true); + setUpdateLDMObjects(false); + } + + public String getToken() { + return token; + } + + public boolean isOverwriteNewer() { + return overwriteNewer; + } + + public boolean isUpdateLDMObjects() { + return updateLDMObjects; + } + + public boolean isImportAttributeProperties() { + return importAttributeProperties; + } + + /** + * Sets the flag {@code overwriteNewer}. + * If {@code true}, UDM/ADM objects are overwritten without checking modification time. + */ + public void setOverwriteNewer(boolean overwriteNewer) { + this.overwriteNewer = overwriteNewer; + } + + /** + * Sets the flag {@code updateLDMObjects}. + * If {@code true}, related LDM objects name, description and tags are overwritten + */ + public void setUpdateLDMObjects(boolean updateLDMObjects) { + this.updateLDMObjects = updateLDMObjects; + } + + /** + * Sets the flag {@code importAttributeProperties}. + * If {@code true}, following attribute properties are cloned: + *
    + *
  • for attribute - import drillDownStepAttributeDF setting
  • + *
  • for attributeDisplayForm - import type setting
  • + *
+ * It also implies {@code 'updateLDMObjects = true'} for all mentioned types.
+ * It will not reliably work (can fail) for exports without {@code 'exportAttributeProperties = true'}. + */ + public void setImportAttributeProperties(boolean importAttributeProperties) { + this.importAttributeProperties = importAttributeProperties; + } +} diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index ed711399c..23b74f270 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -42,6 +42,7 @@ protected HttpClient createHttpClient(String login, String password, String host protected static PoolingHttpClientConnectionManager connManager; + protected static String projectToken; protected static Project project; protected static String fact; diff --git a/src/test/java/com/gooddata/gdc/TaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java index f251b6e1f..a5d0910b9 100644 --- a/src/test/java/com/gooddata/gdc/TaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import static org.testng.Assert.*; import static org.hamcrest.Matchers.*; import static org.hamcrest.MatcherAssert.*; @@ -13,7 +12,7 @@ public class TaskStatusTest { @Test public void testDeser() throws Exception { - final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status.json"), TaskStatus.class); + final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/gdc/task-status.json"), TaskStatus.class); assertThat(status.getStatus(), is("OK")); assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); } diff --git a/src/test/java/com/gooddata/md/ExportImportServiceAT.java b/src/test/java/com/gooddata/md/ExportImportServiceAT.java new file mode 100644 index 000000000..751a57d3f --- /dev/null +++ b/src/test/java/com/gooddata/md/ExportImportServiceAT.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.md.maintenance.PartialMdExport; +import com.gooddata.md.maintenance.PartialMdExportToken; +import com.gooddata.model.ModelDiff; +import com.gooddata.model.ModelService; +import com.gooddata.project.Environment; +import com.gooddata.project.Project; +import org.apache.commons.lang.StringUtils; +import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.InputStreamReader; + +/** + * Metadata export/import acceptance tests. + */ +public class ExportImportServiceAT extends AbstractGoodDataAT { + + private Project importProject; + private PartialMdExportToken partialMdExportToken; + + @BeforeClass + public void setUp() throws Exception { + final Project newProject = new Project(title + " - metadata import", projectToken); + newProject.setEnvironment(Environment.TESTING); + importProject = gd.getProjectService().createProject(newProject).get(); + + final ModelService modelService = gd.getModelService(); + final ModelDiff projectModelDiff = modelService.getProjectModelDiff(importProject, + new InputStreamReader(getClass().getResourceAsStream("/person.json"))).get(); + modelService.updateProjectModel(importProject, projectModelDiff).get(); + } + + @AfterClass + public void tearDown() throws Exception { + if (importProject != null) { + gd.getProjectService().removeProject(importProject); + } + } + + @Test(groups = "exportimport", dependsOnGroups = "md") + public void partialExportMetric() throws Exception { + partialMdExportToken = gd.getExportImportService().partialExport(project, new PartialMdExport(metric.getUri())).get(); + assertThat(partialMdExportToken, notNullValue()); + assertThat(partialMdExportToken.getToken(), not(isEmptyOrNullString())); + assertThat(partialMdExportToken.isImportAttributeProperties(), is(false)); + } + + @Test(groups = "exportimport", dependsOnMethods = "partialExportMetric") + public void partialImportMetric() throws Exception { + gd.getExportImportService().partialImport(importProject, partialMdExportToken).get(); + final Metric importedMetric = gd.getMetadataService().getObjById(importProject, + StringUtils.substringAfterLast(metric.getUri(), "/"), Metric.class); + + assertThat(importedMetric, notNullValue()); + } +} diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java new file mode 100644 index 000000000..285dc58b0 --- /dev/null +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.maintenance; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.JsonMatchers; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +public class ExportImportServiceIT extends AbstractGoodDataIT { + + private Project project; + + @BeforeClass + public void setUp() throws Exception { + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + } + + @Test + public void shouldExportPartialMetadata() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExport.TEMPLATE.expand(project.getId()).toString()) + .havingBody(JsonMatchers.isJsonString("/md/maintenance/partialMDExport-defaultVals.json")) + .respond() + .withStatus(200) + .withBody(readFromResource("/md/maintenance/partialMDArtifact.json")); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(200) + .withBody(readFromResource("/gdc/task-status.json")); + + final PartialMdExportToken partialExport = gd.getExportImportService() + .partialExport(project, new PartialMdExport(false, false, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234")).get(); + + assertThat(partialExport, notNullValue()); + assertThat(partialExport.getToken(), is("TOKEN123")); + assertThat(partialExport.isImportAttributeProperties(), is(false)); + } + + @Test(expectedExceptions = ExportImportException.class, + expectedExceptionsMessageRegExp = ".*The object with uri \\(/gdc/md/PROJECT_ID/obj/123\\) doesn't exists.*") + public void shouldPartialExportFailWhenErrorResult() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExport.TEMPLATE.expand(project.getId()).toString()) + .respond() + .withStatus(200) + .withBody(readFromResource("/md/maintenance/partialMDArtifact.json")); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(200) + .withBody(readFromResource("/md/maintenance/partial-export-task-status-fail.json")); + + gd.getExportImportService().partialExport(project, new PartialMdExport(false, false, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234")).get(); + } + + @Test(expectedExceptions = ExportImportException.class) + public void shouldPartialExportFailWhenPollingError() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExport.TEMPLATE.expand(project.getId()).toString()) + .respond() + .withStatus(200) + .withBody(readFromResource("/md/maintenance/partialMDArtifact.json")); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(404); + + gd.getExportImportService().partialExport(project, new PartialMdExport(false, false, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234")).get(); + } + + @Test + public void shouldImportPartialMetadata() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExportToken.TEMPLATE.expand(project.getId()).toString()) + .havingBody(JsonMatchers.isJsonString("/md/maintenance/partialMDImport.json")) + .respond() + .withStatus(200) + .withBody("{ \"uri\": \"/gdc/md/projectId/tasks/taskId/status\" }"); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(200) + .withBody(readFromResource("/gdc/task-status.json")); + + final PartialMdExportToken exportToken = new PartialMdExportToken("TOKEN123"); + exportToken.setUpdateLDMObjects(true); + exportToken.setImportAttributeProperties(true); + gd.getExportImportService().partialImport(project, exportToken).get(); + } + + @Test(expectedExceptions = ExportImportException.class, + expectedExceptionsMessageRegExp = ".*The token \\(TOKEN123\\) is not valid.*") + public void shouldPartialImportFailWhenErrorResult() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExportToken.TEMPLATE.expand(project.getId()).toString()) + .respond() + .withStatus(200) + .withBody("{ \"uri\": \"/gdc/md/projectId/tasks/taskId/status\" }"); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(200) + .withBody(readFromResource("/md/maintenance/partial-import-task-status-fail.json")); + + gd.getExportImportService().partialImport(project, new PartialMdExportToken("TOKEN123")).get(); + } + + @Test(expectedExceptions = ExportImportException.class) + public void shouldPartialImportFailWhenPollingError() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PartialMdExportToken.TEMPLATE.expand(project.getId()).toString()) + .respond() + .withStatus(200) + .withBody("{ \"uri\": \"/gdc/md/projectId/tasks/taskId/status\" }"); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/projectId/tasks/taskId/status") + .respond() + .withStatus(404); + + gd.getExportImportService().partialImport(project, new PartialMdExportToken("TOKEN123")).get(); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java new file mode 100644 index 000000000..bd3dc829b --- /dev/null +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.maintenance; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.UriResponse; +import com.gooddata.project.Project; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class ExportImportServiceTest { + + private static final String PROJECT_ID = "TEST_PROJ_ID"; + + @Mock + private Project project; + @Mock + private RestTemplate restTemplate; + + private ExportImportService service; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new ExportImportService(restTemplate); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test(expectedExceptions = ExportImportException.class) + public void testCreatePartialExportError() throws Exception { + when(restTemplate.postForObject(eq(PartialMdExport.URI), any(PartialMdExport.class), eq(PartialMdArtifact.class), eq(PROJECT_ID))) + .thenThrow(new GoodDataRestException(400, "request", "Failed", "export", "error")); + + service.partialExport(project, new PartialMdExport(false, false, "uri123")); + } + + @Test(expectedExceptions = ExportImportException.class) + public void testCreatePartialImportError() throws Exception { + when(restTemplate.postForObject(eq(PartialMdExportToken.URI), any(PartialMdExportToken.class), eq(UriResponse.class), eq(PROJECT_ID))) + .thenThrow(new GoodDataRestException(400, "request", "Failed", "import", "error")); + + service.partialImport(project, new PartialMdExportToken("TOKEN123")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java new file mode 100644 index 000000000..6cc8d255b --- /dev/null +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -0,0 +1,30 @@ +package com.gooddata.md.maintenance; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.gdc.UriResponse; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class PartialMdArtifactTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/md/maintenance/partialMDArtifact.json"); + final PartialMdArtifact partialMdArtifact = new ObjectMapper().readValue(input, PartialMdArtifact.class); + + assertThat(partialMdArtifact.getStatus().getUri(), is("/gdc/md/projectId/tasks/taskId/status")); + assertThat(partialMdArtifact.getToken(), is("TOKEN123")); + } + + @Test + public void shouldSerialize() throws Exception { + final PartialMdArtifact partialMdArtifact = new PartialMdArtifact(new UriResponse("/gdc/md/projectId/tasks/taskId/status"), "TOKEN123"); + + assertThat(partialMdArtifact, serializesToJson("/md/maintenance/partialMDArtifact.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java new file mode 100644 index 000000000..4d750a573 --- /dev/null +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java @@ -0,0 +1,30 @@ +package com.gooddata.md.maintenance; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.testng.annotations.Test; + +public class PartialMdExportTest { + + @Test + public void shouldSerialize() throws Exception { + final PartialMdExport partialMdExport = + new PartialMdExport(true, true, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234"); + + assertThat(partialMdExport, serializesToJson("/md/maintenance/partialMDExport.json")); + } + + @Test + public void shouldNotSerializeDefaultValues() { + final PartialMdExport partialMdExport = + new PartialMdExport(false, false, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234"); + + assertThat(partialMdExport, serializesToJson("/md/maintenance/partialMDExport-defaultVals.json")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testEmptyUris() throws Exception { + new PartialMdExport(); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java new file mode 100644 index 000000000..863628ffd --- /dev/null +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java @@ -0,0 +1,18 @@ +package com.gooddata.md.maintenance; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.testng.annotations.Test; + +public class PartialMdExportTokenTest { + + @Test + public void shouldSerialize() throws Exception { + final PartialMdExportToken partialMdExportToken = new PartialMdExportToken("TOKEN123"); + partialMdExportToken.setUpdateLDMObjects(true); + partialMdExportToken.setImportAttributeProperties(true); + + assertThat(partialMdExportToken, serializesToJson("/md/maintenance/partialMDImport.json")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index 43a180a18..f87f2cb1c 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -31,8 +31,6 @@ public class ProjectServiceAT extends AbstractGoodDataAT { private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; - private final String projectToken; - public ProjectServiceAT() { projectToken = getProperty("projectToken"); } diff --git a/src/test/resources/model/maql-ddl-task-status.json b/src/test/resources/gdc/task-status.json similarity index 100% rename from src/test/resources/model/maql-ddl-task-status.json rename to src/test/resources/gdc/task-status.json diff --git a/src/test/resources/md/maintenance/partial-export-task-status-fail.json b/src/test/resources/md/maintenance/partial-export-task-status-fail.json new file mode 100644 index 000000000..b33b6fa69 --- /dev/null +++ b/src/test/resources/md/maintenance/partial-export-task-status-fail.json @@ -0,0 +1,17 @@ +{ + "wTaskStatus": { + "messages": [ + { + "error": { + "parameters": ["/gdc/md/PROJECT_ID/obj/123"], + "requestId": "REQUEST_ID", + "component": "GDC::MAINTENANCE::PARTIAL_EXPORT", + "errorClass": "GDC::Exception::User", + "message": "The object with uri (%s) doesn't exists." + } + } + ], + "poll": "/gdc/md/PROJECT_ID/tasks/TASK_ID/status", + "status": "ERROR" + } +} \ No newline at end of file diff --git a/src/test/resources/md/maintenance/partial-import-task-status-fail.json b/src/test/resources/md/maintenance/partial-import-task-status-fail.json new file mode 100644 index 000000000..baee12345 --- /dev/null +++ b/src/test/resources/md/maintenance/partial-import-task-status-fail.json @@ -0,0 +1,17 @@ +{ + "wTaskStatus": { + "messages": [ + { + "error": { + "parameters": ["TOKEN123"], + "requestId": "REQUEST_ID", + "component": "GDC::MAINTENANCE::PARTIAL_IMPORT", + "errorClass": "GDC::Exception::User", + "message": "The token (%s) is not valid." + } + } + ], + "poll": "/gdc/md/PROJECT_ID/tasks/TASK_ID/status", + "status": "ERROR" + } +} \ No newline at end of file diff --git a/src/test/resources/md/maintenance/partialMDArtifact.json b/src/test/resources/md/maintenance/partialMDArtifact.json new file mode 100644 index 000000000..36f2a4e90 --- /dev/null +++ b/src/test/resources/md/maintenance/partialMDArtifact.json @@ -0,0 +1,8 @@ +{ + "partialMDArtifact": { + "status": { + "uri": "/gdc/md/projectId/tasks/taskId/status" + }, + "token": "TOKEN123" + } +} diff --git a/src/test/resources/md/maintenance/partialMDExport-defaultVals.json b/src/test/resources/md/maintenance/partialMDExport-defaultVals.json new file mode 100644 index 000000000..4587b1697 --- /dev/null +++ b/src/test/resources/md/maintenance/partialMDExport-defaultVals.json @@ -0,0 +1,8 @@ +{ + "partialMDExport": { + "uris": [ + "/gdc/md/projectId/obj/123", + "/gdc/md/projectId/obj/234" + ] + } +} \ No newline at end of file diff --git a/src/test/resources/md/maintenance/partialMDExport.json b/src/test/resources/md/maintenance/partialMDExport.json new file mode 100644 index 000000000..d83c0232f --- /dev/null +++ b/src/test/resources/md/maintenance/partialMDExport.json @@ -0,0 +1,10 @@ +{ + "partialMDExport": { + "uris": [ + "/gdc/md/projectId/obj/123", + "/gdc/md/projectId/obj/234" + ], + "crossDataCenterExport": true, + "exportAttributeProperties": true + } +} \ No newline at end of file diff --git a/src/test/resources/md/maintenance/partialMDImport.json b/src/test/resources/md/maintenance/partialMDImport.json new file mode 100644 index 000000000..ddc46c1ac --- /dev/null +++ b/src/test/resources/md/maintenance/partialMDImport.json @@ -0,0 +1,8 @@ +{ + "partialMDImport": { + "token": "TOKEN123", + "overwriteNewer": true, + "updateLDMObjects": true, + "importAttributeProperties": true + } +} From db17eefe73095ba97f55fcc5d1232289d886ab06 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 26 Feb 2016 15:40:59 +0100 Subject: [PATCH 0307/1191] fix javadocs in PartialMdExportToken --- .../gooddata/md/maintenance/PartialMdExportToken.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java index 1c928a422..d5536c2da 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java @@ -24,7 +24,7 @@ public class PartialMdExportToken { /** * Creates new PartialMdExportToken. - *
+ *
* Sets default values to properties: *
    *
  • importAttributeProperties - default false
  • @@ -76,6 +76,8 @@ public boolean isImportAttributeProperties() { /** * Sets the flag {@code overwriteNewer}. * If {@code true}, UDM/ADM objects are overwritten without checking modification time. + * + * @param overwriteNewer flag value to be set */ public void setOverwriteNewer(boolean overwriteNewer) { this.overwriteNewer = overwriteNewer; @@ -84,6 +86,8 @@ public void setOverwriteNewer(boolean overwriteNewer) { /** * Sets the flag {@code updateLDMObjects}. * If {@code true}, related LDM objects name, description and tags are overwritten + * + * @param updateLDMObjects flag value to be set */ public void setUpdateLDMObjects(boolean updateLDMObjects) { this.updateLDMObjects = updateLDMObjects; @@ -96,8 +100,10 @@ public void setUpdateLDMObjects(boolean updateLDMObjects) { *
  • for attribute - import drillDownStepAttributeDF setting
  • *
  • for attributeDisplayForm - import type setting
  • *
- * It also implies {@code 'updateLDMObjects = true'} for all mentioned types.
+ * It also implies {@code 'updateLDMObjects = true'} for all mentioned types.
* It will not reliably work (can fail) for exports without {@code 'exportAttributeProperties = true'}. + * + * @param importAttributeProperties flag value to be set */ public void setImportAttributeProperties(boolean importAttributeProperties) { this.importAttributeProperties = importAttributeProperties; From ebc375c048733b17114372e6aab705c1c6892005 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 26 Feb 2016 15:50:13 +0100 Subject: [PATCH 0308/1191] [maven-release-plugin] prepare release gooddata-java-1.3.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4917e6bc1..43a16c1d6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.2.3-SNAPSHOT + 1.3.0 ${project.artifactId} GoodData Java SDK From bf267d98e2e1f4258397830f48fdc49128a4f7a9 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 26 Feb 2016 15:50:14 +0100 Subject: [PATCH 0309/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 43a16c1d6..d34b9c692 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.3.0 + 1.3.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 011a0e7bb522dfe0de7b8556f9e6108e5d8e17b5 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 26 Feb 2016 16:00:31 +0100 Subject: [PATCH 0310/1191] bump version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f56be041..234ab9ddc 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.2.2 + 1.3.0 ``` From 7f98e7f722a3fdc38c9f8f5e49abced0c3800cf2 Mon Sep 17 00:00:00 2001 From: Adam Stulpa Date: Wed, 2 Mar 2016 08:27:29 +0100 Subject: [PATCH 0311/1191] expose http client for extending classes --- src/main/java/com/gooddata/GoodData.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 1b77ed9a1..caa17d48b 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -62,6 +62,7 @@ public class GoodData { private static final int RESTAPI_VERSION = 1; private final RestTemplate restTemplate; + private final HttpClient httpClient; private final AccountService accountService; private final ProjectService projectService; private final MetadataService metadataService; @@ -168,7 +169,7 @@ protected GoodData(String hostname, String login, String password, int port, Str notEmpty(login, "login"); notEmpty(password, "password"); notEmpty(protocol, "protocol"); - final HttpClient httpClient = createHttpClient(login, password, hostname, port, protocol, + httpClient = createHttpClient(login, password, hostname, port, protocol, createHttpClientBuilder(settings)); restTemplate = createRestTemplate(hostname, httpClient, port, protocol); @@ -178,7 +179,7 @@ protected GoodData(String hostname, String login, String password, int port, Str metadataService = new MetadataService(getRestTemplate()); modelService = new ModelService(getRestTemplate()); gdcService = new GdcService(getRestTemplate()); - dataStoreService = new DataStoreService(httpClient, getRestTemplate(), gdcService, new HttpHost(hostname, port, protocol).toURI()); + dataStoreService = new DataStoreService(getHttpClient(), getRestTemplate(), gdcService, new HttpHost(hostname, port, protocol).toURI()); datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); @@ -255,6 +256,15 @@ protected final RestTemplate getRestTemplate() { return restTemplate; } + /** + * Get the configured {@link HttpClient} used by the library. + * This is the extension point for inheriting classes providing additional services. + * @return HTTP client + */ + protected final HttpClient getHttpClient() { + return httpClient; + } + /** * Logout from GoodData Platform */ From ec841f83ca215b24561177b347ecb6f9724b8b80 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 2 Mar 2016 17:29:42 +0100 Subject: [PATCH 0312/1191] [maven-release-plugin] prepare release gooddata-java-1.3.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d34b9c692..ff47c7cb2 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.3.1-SNAPSHOT + 1.3.1 ${project.artifactId} GoodData Java SDK From 90e244d509d89b88b458cb0c53b57b316ec8bbfe Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 2 Mar 2016 17:29:43 +0100 Subject: [PATCH 0313/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ff47c7cb2..3b16d39bd 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.3.1 + 1.3.2-SNAPSHOT ${project.artifactId} GoodData Java SDK From 91ce6d339813916807fec12910a254e40c061454 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 2 Mar 2016 17:40:08 +0100 Subject: [PATCH 0314/1191] Bump version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 234ab9ddc..d44556eec 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.3.0 + 1.3.1 ``` From 2d3bbbfaa9b7f55866a2f09f88b5df7e8bc4b2b4 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 3 Mar 2016 14:15:34 +0100 Subject: [PATCH 0315/1191] Add nexus-staging-maven-plugin --- pom.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pom.xml b/pom.xml index 3b16d39bd..890c4f6a5 100644 --- a/pom.xml +++ b/pom.xml @@ -147,6 +147,19 @@ + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.6 + true + + sonatype-nexus-staging + https://oss.sonatype.org/ + + true + + From ea18a389a6140010b52b5a708a93bd403e64f021 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 18 Jun 2015 19:27:00 +0200 Subject: [PATCH 0316/1191] Add FeatureFlagService with listFeatureFlags Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- src/main/java/com/gooddata/GoodData.java | 12 +++ .../com/gooddata/featureflag/FeatureFlag.java | 53 +++++++++++ .../featureflag/FeatureFlagService.java | 53 +++++++++++ .../gooddata/featureflag/FeatureFlags.java | 88 +++++++++++++++++++ .../java/com/gooddata/gdc/FeatureFlag.java | 4 + .../java/com/gooddata/gdc/FeatureFlags.java | 11 ++- .../com/gooddata/project/ProjectService.java | 8 +- .../featureflag/FeatureFlagServiceAT.java | 29 ++++++ .../featureflag/FeatureFlagServiceIT.java | 43 +++++++++ .../featureflag/FeatureFlagServiceTest.java | 72 +++++++++++++++ .../featureflag/FeatureFlagsTest.java | 54 ++++++++++++ .../com/gooddata/gdc/FeatureFlagsTest.java | 3 +- .../gooddata/project/ProjectServiceAT.java | 9 -- .../gooddata/project/ProjectServiceIT.java | 3 +- .../gooddata/project/ProjectServiceTest.java | 1 + 15 files changed, 428 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/gooddata/featureflag/FeatureFlag.java create mode 100644 src/main/java/com/gooddata/featureflag/FeatureFlagService.java create mode 100644 src/main/java/com/gooddata/featureflag/FeatureFlags.java create mode 100644 src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java create mode 100644 src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java create mode 100644 src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java create mode 100644 src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index caa17d48b..52b13dad6 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -6,6 +6,7 @@ import com.gooddata.account.AccountService; import com.gooddata.connector.ConnectorService; import com.gooddata.dataload.processes.ProcessService; +import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; import com.gooddata.util.ResponseErrorHandler; @@ -76,6 +77,7 @@ public class GoodData { private final WarehouseService warehouseService; private final NotificationService notificationService; private final ExportImportService exportImportService; + private final FeatureFlagService featureFlagService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -187,6 +189,7 @@ protected GoodData(String hostname, String login, String password, int port, Str connectorService = new ConnectorService(getRestTemplate(), projectService); notificationService = new NotificationService(getRestTemplate()); exportImportService = new ExportImportService(getRestTemplate()); + featureFlagService = new FeatureFlagService(restTemplate); } private RestTemplate createRestTemplate(String hostname, HttpClient httpClient, int port, String protocol) { @@ -389,4 +392,13 @@ public NotificationService getNotificationService() { public ExportImportService getExportImportService() { return exportImportService; } + + /** + * Get initialized service for feature flag management. + * + * @return initialized service for feature flag management + */ + public FeatureFlagService getFeatureFlagService() { + return featureFlagService; + } } diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/src/main/java/com/gooddata/featureflag/FeatureFlag.java new file mode 100644 index 000000000..0cdae3566 --- /dev/null +++ b/src/main/java/com/gooddata/featureflag/FeatureFlag.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import static com.gooddata.util.Validate.notNull; + +/** + * Feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform. + * It can be used in various scopes (per project, per project group, per user, global etc.). + */ +public class FeatureFlag { + + private final String name; + private boolean enabled; + + public FeatureFlag(final String name, final boolean enabled) { + this.name = notNull(name, "name cannot be null"); + this.enabled = enabled; + } + + public String getName() { + return name; + } + + public boolean isEnabled() { + return enabled; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final FeatureFlag that = (FeatureFlag) o; + + if (enabled != that.enabled) return false; + return !(name != null ? !name.equals(that.name) : that.name != null); + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (enabled ? 1 : 0); + return result; + } + + @Override + public String toString() { + return "{name='" + name + '\'' + ", enabled=" + enabled + "}"; + } +} diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java new file mode 100644 index 000000000..c95606423 --- /dev/null +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; +import com.gooddata.project.Project; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import static com.gooddata.featureflag.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.util.Validate.notNull; + +/** + * Provides feature flag management. Feature flag is a boolean flag used for enabling / disabling some specific feature + * of GoodData platform. It can be used in various scopes (per project, per project group, per user, global etc.). + */ +public class FeatureFlagService extends AbstractService { + + /** + * Constructs service for GoodData feature flags management. + * + * @param restTemplate RESTful HTTP Spring template + */ + public FeatureFlagService(final RestTemplate restTemplate) { + super(restTemplate); + } + + /** + * Returns aggregated feature flags for given project and current user (aggregates global, project group, project + * and user feature flags). + * It doesn't matter whether feature flag is enabled or not, it'll be included in both cases. + * + * @param project project, cannot be null + * @return aggregated feature flags for given project and current user + */ + public FeatureFlags listFeatureFlags(final Project project) { + notNull(project, "project"); + try { + final FeatureFlags featureFlags = restTemplate + .getForObject(AGGREGATED_FEATURE_FLAGS_TEMPLATE.expand(project.getId()), FeatureFlags.class); + + if (featureFlags == null) { + throw new GoodDataException("empty response from API call"); + } + return featureFlags; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list aggregated feature flags for project ID=" + project.getId(), e); + } + } + +} diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java new file mode 100644 index 000000000..3eba66bea --- /dev/null +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import static com.gooddata.util.Validate.notEmpty; +import static org.springframework.util.Assert.notNull; + +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("featureFlags") +@JsonIgnoreProperties(ignoreUnknown = true) +public class FeatureFlags implements Iterable { + + public static final String AGGREGATED_FEATURE_FLAGS_URI = "/gdc/internal/projects/{projectId}/featureFlags"; + public static final UriTemplate AGGREGATED_FEATURE_FLAGS_TEMPLATE = new UriTemplate(AGGREGATED_FEATURE_FLAGS_URI); + + private final List featureFlags = new LinkedList<>(); + + /* protected helper method for JSON deserialization */ + @JsonAnySetter + protected void addFlag(final String name, final boolean enabled) { + notNull(name); + featureFlags.add(new FeatureFlag(name, enabled)); + } + + /** + * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class + */ + @Deprecated + public List getFeatureFlags() { + return featureFlags; + } + + /** + * {@inheritDoc Iterable#iterator} + */ + @Override + public Iterator iterator() { + return featureFlags.iterator(); + } + + /** + * Returns true if the feature flag with given name exists and is enabled, false otherwise. + * + * @param flagName the name of feature flag + * @return true if the feature flag with given name exists and is enabled, false otherwise + */ + public boolean isEnabled(final String flagName) { + notEmpty(flagName, "flagName"); + for (final FeatureFlag flag : featureFlags) { + if (flagName.equalsIgnoreCase(flag.getName())) { + return flag.isEnabled(); + } + } + return false; + } + + @Override + public boolean equals(final Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + final FeatureFlags that = (FeatureFlags) o; + + return !(featureFlags != null ? !featureFlags.equals(that.featureFlags) : that.featureFlags != null); + + } + + @Override + public int hashCode() { + return featureFlags != null ? featureFlags.hashCode() : 0; + } + + @Override + public String toString() { + return "FeatureFlags{" + featureFlags + "}"; + } +} diff --git a/src/main/java/com/gooddata/gdc/FeatureFlag.java b/src/main/java/com/gooddata/gdc/FeatureFlag.java index be09a43ee..4ce05d17a 100644 --- a/src/main/java/com/gooddata/gdc/FeatureFlag.java +++ b/src/main/java/com/gooddata/gdc/FeatureFlag.java @@ -8,7 +8,11 @@ /** * Feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform. * It can be used in various scopes (per project, per project group, per user, global etc.). + * + * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.FeatureFlag} instead */ +@Deprecated +@SuppressWarnings("deprecation") public class FeatureFlag { private final String name; diff --git a/src/main/java/com/gooddata/gdc/FeatureFlags.java b/src/main/java/com/gooddata/gdc/FeatureFlags.java index 088a1d1dd..2cce6c703 100644 --- a/src/main/java/com/gooddata/gdc/FeatureFlags.java +++ b/src/main/java/com/gooddata/gdc/FeatureFlags.java @@ -13,11 +13,15 @@ import java.util.List; import static org.springframework.util.Assert.notNull; -import static org.springframework.util.CollectionUtils.isEmpty; +/** + * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.FeatureFlags} instead + */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("featureFlags") @JsonIgnoreProperties(ignoreUnknown = true) +@Deprecated +@SuppressWarnings("deprecation") public class FeatureFlags { public static final String AGGREGATED_FEATURE_FLAGS_URI = "/gdc/internal/projects/{projectId}/featureFlags"; @@ -32,6 +36,10 @@ protected void addFlag(final String name, final boolean enabled) { featureFlags.add(new FeatureFlag(name, enabled)); } + /** + * @deprecated use {@link com.gooddata.featureflag.FeatureFlags#isEnabled(String)} method or its {@link Iterable} feature + */ + @Deprecated public List getFeatureFlags() { return featureFlags; } @@ -44,7 +52,6 @@ public boolean equals(final Object o) { final FeatureFlags that = (FeatureFlags) o; return !(featureFlags != null ? !featureFlags.equals(that.featureFlags) : that.featureFlags != null); - } @Override diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 0b76fb5cb..e6f157e85 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -13,6 +13,7 @@ import com.gooddata.account.AccountService; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; +import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.FeatureFlag; import com.gooddata.gdc.FeatureFlags; @@ -353,7 +354,10 @@ public Role getRoleByUri(String uri) { * * @param project project, cannot be null * @return list of aggregated feature flags for given project and current user + * @deprecated use {@link FeatureFlagService#listFeatureFlags(Project)} instead */ + @Deprecated + @SuppressWarnings("deprecation") public List listAggregatedFeatureFlags(final Project project) { notNull(project, "project"); try { @@ -372,8 +376,8 @@ public List listAggregatedFeatureFlags(final Project project) { } /** - * Lists all project feature flags (only project scoped flags, use {@link #listAggregatedFeatureFlags(Project)} for - * aggregated flags from all scopes). + * Lists all project feature flags (only project scoped flags, use {@link FeatureFlagService#listFeatureFlags(Project)} + * for aggregated flags from all scopes). * It doesn't matter whether feature flag is enabled or not, it'll be included in all cases. * * @param project project, cannot be null diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java new file mode 100644 index 000000000..94104424c --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.featureflag; + +import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItems; + +/** + * Feature flag acceptance tests. + */ +public class FeatureFlagServiceAT extends AbstractGoodDataAT { + + private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; + + @Test(groups = "featureFlag", dependsOnGroups = "project") + public void listFeatureFlags() throws Exception { + final FeatureFlags flags = gd.getFeatureFlagService().listFeatureFlags(project); + + assertThat(flags, hasItems( + new com.gooddata.featureflag.FeatureFlag("mostRecentFeatureFlag", true), + new com.gooddata.featureflag.FeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + +} diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java new file mode 100644 index 000000000..d50c1739b --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readStringFromResource; +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; + +public class FeatureFlagServiceIT extends AbstractGoodDataIT { + + private FeatureFlagService service; + private Project project; + + @BeforeMethod + public void setUp() throws Exception { + service = gd.getFeatureFlagService(); + project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + } + + @Test + public void listFeatureFlagsShouldReturnAggregatedFlagsForProject() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/internal/projects/PROJECT_ID/featureFlags") + .respond() + .withBody(readStringFromResource("/gdc/featureFlags.json")) + .withStatus(200); + + final FeatureFlags flags = service.listFeatureFlags(project); + + assertThat(flags, containsInAnyOrder( + new FeatureFlag("testFeature", true), + new FeatureFlag("testFeature2", false))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java new file mode 100644 index 000000000..d0256ce6c --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.gooddata.GoodDataException; +import com.gooddata.project.Project; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.net.URI; + +import static java.util.Collections.singleton; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.mockito.Mockito.when; + +public class FeatureFlagServiceTest { + + private static final String PROJECT_ID = "11"; + private static final String FEATURE_FLAGS_URI = "/gdc/internal/projects/11/featureFlags"; + + @Mock + private Project project; + @Mock + private FeatureFlags featureFlags; + @Mock + private RestTemplate restTemplate; + + private FeatureFlagService service; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + service = new FeatureFlagService(restTemplate); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullArgThenGetFeatureFlagsShouldThrow() throws Exception { + service.listFeatureFlags(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenEmptyResponseThenGetFeatureFlagsShouldThrow() throws Exception { + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)).thenReturn(null); + service.listFeatureFlags(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenGetFeatureFlagsShouldThrow() throws Exception { + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)) + .thenThrow(new RestClientException("")); + service.listFeatureFlags(project); + } + + @Test + public void testGetFeatureFlags() throws Exception { + final FeatureFlag flag1 = new FeatureFlag("flag1", true); + when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)).thenReturn(featureFlags); + when(featureFlags.iterator()).thenReturn(singleton(flag1).iterator()); + + final FeatureFlags flags = service.listFeatureFlags(project); + + assertThat(flags, contains(flag1)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java new file mode 100644 index 000000000..df9664834 --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.isOneOf; +import static org.testng.AssertJUnit.assertNotNull; + +public class FeatureFlagsTest { + + @Test + public void testDeserialize() { + final FeatureFlags flags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", FeatureFlags.class); + + assertNotNull(flags); + assertThat(flags, containsInAnyOrder( + new FeatureFlag("testFeature", true), + new FeatureFlag("testFeature2", false))); + } + + @Test + public void shouldIterateThroughFlagsInForeach() throws Exception { + final FeatureFlags flags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", FeatureFlags.class); + for (FeatureFlag flag : flags) { + assertThat(flag, isOneOf( + new FeatureFlag("testFeature", true), + new FeatureFlag("testFeature2", false))); + } + } + + @Test + public void isEnabledShouldReturnCorrectBoolean() throws Exception { + final FeatureFlags flags = new FeatureFlags(); + flags.addFlag("enabledFlag", true); + flags.addFlag("disabledFlag", false); + + assertThat(flags.isEnabled("enabledFlag"), is(true)); + assertThat(flags.isEnabled("disabledFlag"), is(false)); + assertThat(flags.isEnabled("nonexistentFlag"), is(false)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullNameThenIsEnabledShouldThrow() throws Exception { + final FeatureFlags flags = new FeatureFlags(); + flags.isEnabled(null); + } + +} diff --git a/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java b/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java index b51924ef7..54ef24649 100644 --- a/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java +++ b/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java @@ -11,14 +11,15 @@ import static org.hamcrest.Matchers.hasSize; import static org.testng.AssertJUnit.assertNotNull; +@SuppressWarnings("deprecation") public class FeatureFlagsTest { @Test public void testDeserialize() { final FeatureFlags featureFlags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", FeatureFlags.class); - assertNotNull(featureFlags); + assertNotNull(featureFlags); assertThat(featureFlags.getFeatureFlags(), hasSize(2)); assertThat(featureFlags.getFeatureFlags(), contains( new FeatureFlag("testFeature", true), diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index f87f2cb1c..981b157b3 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -107,15 +107,6 @@ public void listProjectFeatureFlags() throws Exception { new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); } - @Test(groups = "project", dependsOnMethods = "listProjectFeatureFlags") - public void listAggregatedFeatureFlags() throws Exception { - final List flags = gd.getProjectService().listAggregatedFeatureFlags(project); - - assertThat(flags, hasItems( - new FeatureFlag("mostRecentFeatureFlag", true), - new FeatureFlag(PROJECT_FEATURE_FLAG, true))); - } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") public void getProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index e15ad7f11..83206c2c8 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Set; +@SuppressWarnings("deprecation") public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -146,7 +147,7 @@ public void shouldReturnProjectTemplates() throws Exception { assertThat(templates, hasSize(1)); } - @Test + @Test public void shouldReturnAvailableValidations() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/" + PROJECT_ID + "/validate") diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java index 377d3d703..c72e7f0a2 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceTest.java +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -28,6 +28,7 @@ import static org.hamcrest.Matchers.hasSize; import static org.mockito.Mockito.when; +@SuppressWarnings("deprecation") public class ProjectServiceTest { private static final String ACCOUNT_ID = "17"; From 7c507faf1cc9d5328984ec428e261d381434324e Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 19 Jun 2015 19:11:28 +0200 Subject: [PATCH 0317/1191] Move getProjectFeatureFlags to FeatureFlagService Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- .../featureflag/FeatureFlagService.java | 25 ++++ .../featureflag/ProjectFeatureFlag.java | 133 ++++++++++++++++++ .../featureflag/ProjectFeatureFlags.java | 65 +++++++++ .../gooddata/project/ProjectFeatureFlag.java | 4 +- .../gooddata/project/ProjectFeatureFlags.java | 4 + .../com/gooddata/project/ProjectService.java | 8 ++ .../featureflag/FeatureFlagServiceAT.java | 12 ++ .../featureflag/FeatureFlagServiceIT.java | 21 ++- .../featureflag/FeatureFlagServiceTest.java | 33 +++++ .../featureflag/ProjectFeatureFlagTest.java | 34 +++++ .../featureflag/ProjectFeatureFlagsTest.java | 87 ++++++++++++ .../project/ProjectFeatureFlagsTest.java | 16 ++- .../gooddata/project/ProjectServiceAT.java | 14 -- .../resources/featureflag/featureFlags.json | 6 + .../featureflag/projectFeatureFlag.json | 9 ++ .../featureflag/projectFeatureFlags.json | 29 ++++ 16 files changed, 479 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java create mode 100644 src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java create mode 100644 src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java create mode 100644 src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java create mode 100644 src/test/resources/featureflag/featureFlags.json create mode 100644 src/test/resources/featureflag/projectFeatureFlag.json create mode 100644 src/test/resources/featureflag/projectFeatureFlags.json diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index c95606423..912c36f33 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -10,6 +10,7 @@ import org.springframework.web.client.RestTemplate; import static com.gooddata.featureflag.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.featureflag.ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_TEMPLATE; import static com.gooddata.util.Validate.notNull; /** @@ -50,4 +51,28 @@ public FeatureFlags listFeatureFlags(final Project project) { } } + /** + * Returns project feature flags (only project scoped flags, use {@link #listFeatureFlags(Project)} for aggregated + * flags from all scopes) for given project. + * It doesn't matter whether feature flag is enabled or not, it'll be included in both cases. + * + * @param project project, cannot be null + * @return list of all feature flags for given project + */ + public ProjectFeatureFlags listProjectFeatureFlags(final Project project) { + notNull(project, "project"); + try { + final ProjectFeatureFlags projectFeatureFlags = restTemplate + .getForObject(PROJECT_FEATURE_FLAGS_TEMPLATE.expand(project.getId()), ProjectFeatureFlags.class); + + if (projectFeatureFlags == null) { + throw new GoodDataException("empty response from API call"); + } + + return projectFeatureFlags; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list project feature flags for project ID=" + project.getId(), e); + } + } + } diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java new file mode 100644 index 000000000..da2661715 --- /dev/null +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.fasterxml.jackson.annotation.*; +import org.springframework.web.util.UriTemplate; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform + * on per project basis. + */ +@JsonTypeName("featureFlag") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ProjectFeatureFlag { + + public static final String PROJECT_FEATURE_FLAG_URI = ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_URI + "/{featureFlag}"; + public static final UriTemplate PROJECT_FEATURE_FLAG_TEMPLATE = new UriTemplate(PROJECT_FEATURE_FLAG_URI); + + private final String name; + private boolean enabled; + + @JsonIgnore + private Links links; + + /** + * Creates new project feature flag which is by default enabled (true). + * + * @param name unique name of feature flag + */ + public ProjectFeatureFlag(String name) { + this(notEmpty(name, "name"), true, null); + } + + /** + * Creates new project feature flag with given value. + * + * @param name unique name of feature flag + * @param enabled true (flag enabled) or false (flag disabled) + */ + public ProjectFeatureFlag(String name, boolean enabled) { + this(notEmpty(name, "name"), enabled, null); + } + + @JsonCreator + ProjectFeatureFlag(@JsonProperty("key") String name, + @JsonProperty("value") boolean enabled, + @JsonProperty("links") Links links) { + this.name = name; + this.enabled = enabled; + this.links = links; + } + + @JsonProperty("key") + public String getName() { + return name; + } + + @JsonProperty("value") + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + @JsonIgnore + public String getUri() { + notNull(links, "links cannot be null if you want to get feature flag uri!"); + return links.getSelf(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + final ProjectFeatureFlag that = (ProjectFeatureFlag) o; + + if (enabled != that.enabled) { + return false; + } + return !(name != null ? !name.equals(that.name) : that.name != null); + + } + + @Override + public int hashCode() { + int result = name != null ? name.hashCode() : 0; + result = 31 * result + (enabled ? 1 : 0); + return result; + } + + @Override + public String toString() { + return "ProjectFeatureFlag{" + + "name='" + name + '\'' + + ", enabled=" + enabled + + ", links=" + links + + '}'; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + static class Links { + private final String self; + + @JsonCreator + public Links(@JsonProperty("self") String self) { + this.self = self; + } + + public String getSelf() { + return self; + } + + @Override + public String toString() { + return "Links{" + + "self='" + self + '\'' + + '}'; + } + } +} diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java new file mode 100644 index 000000000..64ebff02d --- /dev/null +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import com.fasterxml.jackson.annotation.*; +import com.gooddata.project.Project; +import org.springframework.web.util.UriTemplate; + +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; + +import static com.gooddata.util.Validate.notEmpty; +import static org.springframework.util.CollectionUtils.isEmpty; + +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("featureFlags") +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectFeatureFlags implements Iterable { + + public static final String PROJECT_FEATURE_FLAGS_URI = Project.URI + "/projectFeatureFlags"; + public static final UriTemplate PROJECT_FEATURE_FLAGS_TEMPLATE = new UriTemplate(PROJECT_FEATURE_FLAGS_URI); + + private final List items = new LinkedList<>(); + + @JsonCreator + ProjectFeatureFlags(@JsonProperty("items") List items) { + if (!isEmpty(items)) { + this.items.addAll(items); + } + } + + /** + *{@inheritDoc Iterable#iterator} + */ + @Override + public Iterator iterator() { + return items.iterator(); + } + + /** + * Returns true if the project feature flag with given name exists and is enabled, false otherwise. + * + * @param flagName the name of project feature flag + * @return true if the project feature flag with given name exists and is enabled, false otherwise + */ + public boolean isEnabled(final String flagName) { + notEmpty(flagName, "flagName"); + for (final ProjectFeatureFlag flag : items) { + if (flagName.equalsIgnoreCase(flag.getName())) { + return flag.isEnabled(); + } + } + return false; + } + + /** + * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class + */ + @Deprecated + public List getItems() { + return items; + } +} diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java index 7d07a4847..fb3ffac8c 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java @@ -7,7 +7,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.springframework.web.util.UriTemplate; import static com.gooddata.util.Validate.notNull; @@ -15,11 +14,14 @@ /** * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform * on per project basis. + * + * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.ProjectFeatureFlags} instead */ @JsonTypeName("featureFlag") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) +@Deprecated public class ProjectFeatureFlag { public static final String FEATURE_FLAG_URI = ProjectFeatureFlags.FEATURE_FLAGS_URI + "/{featureFlag}"; diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java index b0022879c..8e617df0a 100644 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java @@ -12,9 +12,13 @@ import java.util.ArrayList; import java.util.List; +/** + * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.ProjectFeatureFlags} instead + */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("featureFlags") @JsonIgnoreProperties(ignoreUnknown = true) +@Deprecated public class ProjectFeatureFlags { public static final String FEATURE_FLAGS_URI = Project.URI + "/projectFeatureFlags"; diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index e6f157e85..3232bdc1c 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -382,7 +382,10 @@ public List listAggregatedFeatureFlags(final Project project) { * * @param project project, cannot be null * @return list of all feature flags for given project + * @deprecated use {@link FeatureFlagService#listProjectFeatureFlags(Project)} instead */ + @Deprecated + @SuppressWarnings("deprecation") public List listFeatureFlags(Project project) { notNull(project, "project"); try { @@ -409,6 +412,7 @@ public List listFeatureFlags(Project project) { * @param featureFlag feature flag to be created, cannot be null * @return created feature flag */ + @SuppressWarnings("deprecation") public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { notNull(project, "project"); notNull(featureFlag, "featureFlag"); @@ -431,6 +435,7 @@ public ProjectFeatureFlag createFeatureFlag(final Project project, final Project * @param featureFlagName name of feature flag, cannot be empty * @return feature flag */ + @SuppressWarnings("deprecation") public ProjectFeatureFlag getFeatureFlag(final Project project, final String featureFlagName) { notNull(project, "project"); notEmpty(featureFlagName, "featureFlagName"); @@ -445,6 +450,7 @@ public ProjectFeatureFlag getFeatureFlag(final Project project, final String fea * @param featureFlag updated feature flag * @return updated feature flag */ + @SuppressWarnings("deprecation") public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag) { notNull(featureFlag, "featureFlag"); notEmpty(featureFlag.getUri(), "featureFlag"); @@ -462,6 +468,7 @@ public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag * * @param featureFlag existing project feature flag with links set properly, cannot be null */ + @SuppressWarnings("deprecation") public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { notNull(featureFlag, "featureFlag"); notEmpty(featureFlag.getUri(), "featureFlag URI"); @@ -474,6 +481,7 @@ public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { } + @SuppressWarnings("deprecation") private ProjectFeatureFlag getFeatureFlag(String featureFlagUri) { return restTemplate.getForObject(featureFlagUri, ProjectFeatureFlag.class); } diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 94104424c..17d57f4cc 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -18,6 +18,18 @@ public class FeatureFlagServiceAT extends AbstractGoodDataAT { private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; @Test(groups = "featureFlag", dependsOnGroups = "project") + public void listProjectFeatureFlags() throws Exception { + gd.getProjectService().createFeatureFlag(project, + new com.gooddata.project.ProjectFeatureFlag("mostRecentFeatureFlag")); + + final ProjectFeatureFlags flags = gd.getFeatureFlagService().listProjectFeatureFlags(project); + + assertThat(flags, hasItems( + new ProjectFeatureFlag("mostRecentFeatureFlag", true), + new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); + } + + @Test(groups = "featureFlag", dependsOnMethods = "listProjectFeatureFlags") public void listFeatureFlags() throws Exception { final FeatureFlags flags = gd.getFeatureFlagService().listFeatureFlags(project); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index d50c1739b..6ac916900 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -31,7 +31,7 @@ public void listFeatureFlagsShouldReturnAggregatedFlagsForProject() throws Excep .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/internal/projects/PROJECT_ID/featureFlags") .respond() - .withBody(readStringFromResource("/gdc/featureFlags.json")) + .withBody(readStringFromResource("/featureflag/featureFlags.json")) .withStatus(200); final FeatureFlags flags = service.listFeatureFlags(project); @@ -40,4 +40,23 @@ public void listFeatureFlagsShouldReturnAggregatedFlagsForProject() throws Excep new FeatureFlag("testFeature", true), new FeatureFlag("testFeature2", false))); } + + + @Test + public void listProjectFeatureFlagsShouldReturnProjectFeatureFlags() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/projects/PROJECT_ID/projectFeatureFlags") + .respond() + .withBody(readStringFromResource("/featureflag/projectFeatureFlags.json")) + .withStatus(200); + + final ProjectFeatureFlags flags = service.listProjectFeatureFlags(project); + + assertThat(flags, containsInAnyOrder( + new ProjectFeatureFlag("myCoolFeature", true), + new ProjectFeatureFlag("mySuperCoolFeature", true), + new ProjectFeatureFlag("mySuperSecretFeature", false))); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index d0256ce6c..d525fde7f 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -23,10 +23,13 @@ public class FeatureFlagServiceTest { private static final String PROJECT_ID = "11"; private static final String FEATURE_FLAGS_URI = "/gdc/internal/projects/11/featureFlags"; + private static final String PROJECT_FEATURE_FLAGS_URI = "/gdc/projects/11/projectFeatureFlags"; @Mock private Project project; @Mock + private ProjectFeatureFlags projectFeatureFlags; + @Mock private FeatureFlags featureFlags; @Mock private RestTemplate restTemplate; @@ -69,4 +72,34 @@ public void testGetFeatureFlags() throws Exception { assertThat(flags, contains(flag1)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullArgThenGetProjectFeatureFlagsShouldThrow() throws Exception { + service.listProjectFeatureFlags(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenEmptyResponseThenGetProjectFeatureFlagsShouldThrow() throws Exception { + when(restTemplate.getForObject(new URI(PROJECT_FEATURE_FLAGS_URI), ProjectFeatureFlags.class)).thenReturn(null); + service.listProjectFeatureFlags(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenGetProjectFeatureFlagsShouldThrow() throws Exception { + when(restTemplate.getForObject(new URI(PROJECT_FEATURE_FLAGS_URI), ProjectFeatureFlags.class)) + .thenThrow(new RestClientException("")); + service.listProjectFeatureFlags(project); + } + + @Test + public void testGetProjectFeatureFlags() throws Exception { + final ProjectFeatureFlag flag1 = new ProjectFeatureFlag("flag1", true); + when(restTemplate.getForObject(new URI(PROJECT_FEATURE_FLAGS_URI), ProjectFeatureFlags.class)) + .thenReturn(projectFeatureFlags); + when(projectFeatureFlags.iterator()).thenReturn(singleton(flag1).iterator()); + + final ProjectFeatureFlags flags = service.listProjectFeatureFlags(project); + + assertThat(flags, contains(flag1)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java new file mode 100644 index 000000000..e20fd6cbe --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class ProjectFeatureFlagTest { + + @Test + public void testDefaultValue() throws Exception { + final ProjectFeatureFlag flag = new ProjectFeatureFlag("test"); + assertThat(flag.isEnabled(), is(true)); + } + + @Test + public void testCustomValue() throws Exception { + final ProjectFeatureFlag flag = new ProjectFeatureFlag("test", false); + assertThat(flag.isEnabled(), is(false)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testEmptyName() throws Exception { + new ProjectFeatureFlag(" "); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testEmptyNameWithValue() throws Exception { + new ProjectFeatureFlag(" ", false); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java new file mode 100644 index 000000000..b9b29fef0 --- /dev/null +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.featureflag; + +import org.testng.annotations.Test; + +import java.io.IOException; + +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.isOneOf; +import static org.hamcrest.core.StringContains.containsString; +import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.testng.AssertJUnit.assertNotNull; + +public class ProjectFeatureFlagsTest { + + @Test + public void testDeserialize() { + final ProjectFeatureFlags featureFlags = readObjectFromResource(getClass(), "/project/feature-flags.json", + ProjectFeatureFlags.class); + assertNotNull(featureFlags); + + assertThat(featureFlags, containsInAnyOrder( + new ProjectFeatureFlag("myCoolFeature", true), + new ProjectFeatureFlag("mySuperCoolFeature", true), + new ProjectFeatureFlag("mySuperSecretFeature", false))); + } + + @Test + public void testSerialize() throws IOException { + final ProjectFeatureFlags projectFeatureFlags = new ProjectFeatureFlags(asList( + new ProjectFeatureFlag("enabledFeatureFlag", true), + new ProjectFeatureFlag("disabledFeatureFlag", false))); + + final String serializedFeatureFlags = OBJECT_MAPPER.writeValueAsString(projectFeatureFlags); + + assertThat(serializedFeatureFlags, startsWith("{\"featureFlags\"")); + assertThat(serializedFeatureFlags, containsString("\"key\":\"enabledFeatureFlag\",\"value\":true")); + assertThat(serializedFeatureFlags, containsString("\"key\":\"disabledFeatureFlag\",\"value\":false")); + } + + @Test + public void shouldIterateThroughFlagsInForeach() throws Exception { + final ProjectFeatureFlags flags = readObjectFromResource(getClass(), "/project/feature-flags.json", + ProjectFeatureFlags.class); + for (ProjectFeatureFlag flag : flags) { + assertThat(flag, isOneOf( + new ProjectFeatureFlag("myCoolFeature", true), + new ProjectFeatureFlag("mySuperCoolFeature", true), + new ProjectFeatureFlag("mySuperSecretFeature", false))); + } + } + + @Test + public void isEnabledShouldReturnCorrectBoolean() throws Exception { + final ProjectFeatureFlags flags = new ProjectFeatureFlags(asList( + new ProjectFeatureFlag("enabledFlag", true), + new ProjectFeatureFlag("disabledFlag", false) + )); + + assertThat(flags.isEnabled("enabledFlag"), is(true)); + assertThat(flags.isEnabled("disabledFlag"), is(false)); + assertThat(flags.isEnabled("nonexistentFlag"), is(false)); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullNameThenIsEnabledShouldThrow() throws Exception { + final ProjectFeatureFlags flags = new ProjectFeatureFlags( + singletonList(new ProjectFeatureFlag("enabledFlag", true))); + flags.isEnabled(null); + } + + @Test + public void whenNullArgumentInConstructorThenShouldStillWork() throws Exception { + final ProjectFeatureFlags flags = new ProjectFeatureFlags(null); + assertNotNull(flags.iterator()); + assertThat(flags.isEnabled("nonexistentFlag"), is(false)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java index 9195bf804..fa8e5211d 100644 --- a/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java +++ b/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java @@ -1,18 +1,24 @@ package com.gooddata.project; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.Collections; + import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringStartsWith.startsWith; import static org.testng.AssertJUnit.assertNotNull; -import org.testng.annotations.Test; - -import java.io.IOException; - +@SuppressWarnings("deprecation") public class ProjectFeatureFlagsTest { @Test @@ -21,7 +27,7 @@ public void testDeserialize() { ProjectFeatureFlags.class); assertNotNull(featureFlags); - assertThat(featureFlags.getItems(), contains( + assertThat(featureFlags.getItems(), containsInAnyOrder( new ProjectFeatureFlag("myCoolFeature", true), new ProjectFeatureFlag("mySuperCoolFeature", true), new ProjectFeatureFlag("mySuperSecretFeature", false))); diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index 981b157b3..c42e9a59d 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -3,9 +3,7 @@ import com.gooddata.AbstractGoodDataAT; import com.gooddata.GoodDataRestException; import com.gooddata.collections.PageRequest; -import com.gooddata.gdc.FeatureFlag; import org.springframework.http.HttpStatus; -import org.testng.annotations.AfterClass; import org.testng.annotations.Test; import java.util.ArrayList; @@ -17,7 +15,6 @@ import static com.gooddata.project.ProjectIdMatcher.hasSameIdAs; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; @@ -96,17 +93,6 @@ public void createProjectFeatureFlag() throws Exception { checkFeatureFlag(featureFlag, true); } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void listProjectFeatureFlags() throws Exception { - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); - - final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(project); - - assertThat(projectFeatureFlags, hasItems( - new ProjectFeatureFlag("mostRecentFeatureFlag", true), - new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); - } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") public void getProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = diff --git a/src/test/resources/featureflag/featureFlags.json b/src/test/resources/featureflag/featureFlags.json new file mode 100644 index 000000000..72ff8f9d2 --- /dev/null +++ b/src/test/resources/featureflag/featureFlags.json @@ -0,0 +1,6 @@ +{ + "featureFlags": { + "testFeature": true, + "testFeature2": false + } +} \ No newline at end of file diff --git a/src/test/resources/featureflag/projectFeatureFlag.json b/src/test/resources/featureflag/projectFeatureFlag.json new file mode 100644 index 000000000..26916a200 --- /dev/null +++ b/src/test/resources/featureflag/projectFeatureFlag.json @@ -0,0 +1,9 @@ +{ + "featureFlag" : { + "key" : "myCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" + } + } +} \ No newline at end of file diff --git a/src/test/resources/featureflag/projectFeatureFlags.json b/src/test/resources/featureflag/projectFeatureFlags.json new file mode 100644 index 000000000..1e77993a7 --- /dev/null +++ b/src/test/resources/featureflag/projectFeatureFlags.json @@ -0,0 +1,29 @@ +{ + "featureFlags" : { + "items" : [ { + "featureFlag" : { + "key" : "myCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" + } + } + }, { + "featureFlag" : { + "key" : "mySuperCoolFeature", + "value" : true, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperCoolFeature" + } + } + }, { + "featureFlag" : { + "key" : "mySuperSecretFeature", + "value" : false, + "links" : { + "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperSecretFeature" + } + } + }] + } +} \ No newline at end of file From 0debad7063fa4d7f1723a1b4183172ed529c7e55 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 21 Jul 2015 10:39:46 +0200 Subject: [PATCH 0318/1191] Move createProjectFeatureFlag to FeatureFlagService Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- .../featureflag/FeatureFlagService.java | 38 ++++++++++++++++ .../com/gooddata/project/ProjectService.java | 2 + .../featureflag/FeatureFlagServiceAT.java | 18 +++++++- .../featureflag/FeatureFlagServiceIT.java | 38 ++++++++++++++++ .../featureflag/FeatureFlagServiceTest.java | 44 ++++++++++++++++++- .../gooddata/project/ProjectServiceAT.java | 7 --- 6 files changed, 136 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 912c36f33..36bf4bb51 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -9,6 +9,8 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import java.net.URI; + import static com.gooddata.featureflag.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; import static com.gooddata.featureflag.ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_TEMPLATE; import static com.gooddata.util.Validate.notNull; @@ -75,4 +77,40 @@ public ProjectFeatureFlags listProjectFeatureFlags(final Project project) { } } + /** + * Creates new feature flag for given project. + *

+ * Usually, it doesn't make sense to create feature flag that is disabled because + * this is the same as having no feature flag at all. + * + * @param project project for which the feature flag should be created, cannot be null + * @param flag feature flag to be created, cannot be null + * @return created feature flag + */ + public ProjectFeatureFlag createProjectFeatureFlag(final Project project, final ProjectFeatureFlag flag) { + notNull(project, "project"); + notNull(flag, "flag"); + + final String featureFlagsUri = PROJECT_FEATURE_FLAGS_TEMPLATE.expand(project.getId()).toString(); + + try { + final URI featureFlagUri = restTemplate.postForLocation(featureFlagsUri, flag); + if (featureFlagUri == null) { + throw new GoodDataException("URI of new flag can't be null"); + } + return getProjectFeatureFlag(featureFlagUri.toString()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create feature flag: " + flag, e); + } + } + + + private ProjectFeatureFlag getProjectFeatureFlag(final String flagUri) { + final ProjectFeatureFlag result = restTemplate.getForObject(flagUri, ProjectFeatureFlag.class); + if (result == null) { + throw new GoodDataException("flag cannot be retrieved"); + } + return result; + } + } diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 3232bdc1c..290df23b4 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -411,7 +411,9 @@ public List listFeatureFlags(Project project) { * @param project project for which the feature flag should be created, cannot be null * @param featureFlag feature flag to be created, cannot be null * @return created feature flag + * @deprecated use {@link FeatureFlagService#createProjectFeatureFlag(Project, com.gooddata.featureflag.ProjectFeatureFlag)} */ + @Deprecated @SuppressWarnings("deprecation") public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { notNull(project, "project"); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 17d57f4cc..448b80d53 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -8,6 +8,8 @@ import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.hasItems; /** @@ -18,9 +20,15 @@ public class FeatureFlagServiceAT extends AbstractGoodDataAT { private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; @Test(groups = "featureFlag", dependsOnGroups = "project") + public void createProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = gd.getFeatureFlagService() + .createProjectFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); + checkProjectFeatureFlag(featureFlag, true); + } + + @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") public void listProjectFeatureFlags() throws Exception { - gd.getProjectService().createFeatureFlag(project, - new com.gooddata.project.ProjectFeatureFlag("mostRecentFeatureFlag")); + gd.getFeatureFlagService().createProjectFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); final ProjectFeatureFlags flags = gd.getFeatureFlagService().listProjectFeatureFlags(project); @@ -38,4 +46,10 @@ public void listFeatureFlags() throws Exception { new com.gooddata.featureflag.FeatureFlag(PROJECT_FEATURE_FLAG, true))); } + private void checkProjectFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); + assertThat(featureFlag.isEnabled(), is(expectedValue)); + } + } diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 6ac916900..521dfe9a6 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -8,17 +8,24 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static com.gooddata.featureflag.ProjectFeatureFlag.PROJECT_FEATURE_FLAG_TEMPLATE; +import static com.gooddata.featureflag.ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_TEMPLATE; import static com.gooddata.util.ResourceUtils.readFromResource; import static com.gooddata.util.ResourceUtils.readStringFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; public class FeatureFlagServiceIT extends AbstractGoodDataIT { private FeatureFlagService service; private Project project; + private static final String PROJECT_ID = "PROJECT_ID"; + private static final String PROJECT_FEATURE_FLAGS_URI_STRING = PROJECT_FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString(); + @BeforeMethod public void setUp() throws Exception { service = gd.getFeatureFlagService(); @@ -59,4 +66,35 @@ public void listProjectFeatureFlagsShouldReturnProjectFeatureFlags() throws Exce new ProjectFeatureFlag("mySuperSecretFeature", false))); } + @Test + public void createProjectFeatureFlagShouldCreateAndReturnNewProjectFeatureFlag() { + final String featureFlagName = "myCoolFeature"; + final String projectFeatureFlagUriString = getProjectFeatureFlagUriString(featureFlagName); + + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROJECT_FEATURE_FLAGS_URI_STRING) + .respond() + .withHeader("Location", projectFeatureFlagUriString) + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(projectFeatureFlagUriString) + .respond() + .withBody(readStringFromResource("/featureflag/projectFeatureFlag.json")) + .withStatus(200); + + final ProjectFeatureFlag featureFlag = service.createProjectFeatureFlag(project, + new ProjectFeatureFlag(featureFlagName)); + + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(featureFlagName)); + assertThat(featureFlag.isEnabled(), is(true)); + } + + + private String getProjectFeatureFlagUriString(String featureFlagName) { + return PROJECT_FEATURE_FLAG_TEMPLATE.expand(PROJECT_ID, featureFlagName).toString(); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index d525fde7f..663f9734f 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -17,17 +17,22 @@ import static java.util.Collections.singleton; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.when; public class FeatureFlagServiceTest { private static final String PROJECT_ID = "11"; + private static final String FLAG_NAME = "flag1"; private static final String FEATURE_FLAGS_URI = "/gdc/internal/projects/11/featureFlags"; private static final String PROJECT_FEATURE_FLAGS_URI = "/gdc/projects/11/projectFeatureFlags"; + private static final String PROJECT_FEATURE_FLAG_URI = "/gdc/projects/11/projectFeatureFlags/" + FLAG_NAME; @Mock private Project project; @Mock + private ProjectFeatureFlag projectFeatureFlag; + @Mock private ProjectFeatureFlags projectFeatureFlags; @Mock private FeatureFlags featureFlags; @@ -63,7 +68,7 @@ public void whenClientErrorResponseThenGetFeatureFlagsShouldThrow() throws Excep @Test public void testGetFeatureFlags() throws Exception { - final FeatureFlag flag1 = new FeatureFlag("flag1", true); + final FeatureFlag flag1 = new FeatureFlag(FLAG_NAME, true); when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)).thenReturn(featureFlags); when(featureFlags.iterator()).thenReturn(singleton(flag1).iterator()); @@ -92,7 +97,7 @@ public void whenClientErrorResponseThenGetProjectFeatureFlagsShouldThrow() throw @Test public void testGetProjectFeatureFlags() throws Exception { - final ProjectFeatureFlag flag1 = new ProjectFeatureFlag("flag1", true); + final ProjectFeatureFlag flag1 = new ProjectFeatureFlag(FLAG_NAME, true); when(restTemplate.getForObject(new URI(PROJECT_FEATURE_FLAGS_URI), ProjectFeatureFlags.class)) .thenReturn(projectFeatureFlags); when(projectFeatureFlags.iterator()).thenReturn(singleton(flag1).iterator()); @@ -102,4 +107,39 @@ public void testGetProjectFeatureFlags() throws Exception { assertThat(flags, contains(flag1)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullKeyThenCreateProjectFeatureFlagShouldThrow() throws Exception { + service.createProjectFeatureFlag(project, null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullProjectThenCreateProjectFeatureFlagShouldThrow() throws Exception { + service.createProjectFeatureFlag(null, projectFeatureFlag); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenEmptyResponseThenCreateProjectFeatureFlagShouldThrow() throws Exception { + when(restTemplate.postForLocation(PROJECT_FEATURE_FLAG_URI, projectFeatureFlag)).thenReturn(null); + service.createProjectFeatureFlag(project, projectFeatureFlag); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenCreateProjectFeatureFlagShouldThrow() throws Exception { + when(restTemplate.postForLocation(PROJECT_FEATURE_FLAG_URI, projectFeatureFlag)) + .thenThrow(new RestClientException("")); + service.createProjectFeatureFlag(project, projectFeatureFlag); + } + + @Test + public void testCreateProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag flag = new ProjectFeatureFlag(FLAG_NAME, true); + when(restTemplate.postForLocation(PROJECT_FEATURE_FLAGS_URI, flag)) + .thenReturn(new URI(PROJECT_FEATURE_FLAG_URI)); + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)).thenReturn(flag); + + final ProjectFeatureFlag result = service.createProjectFeatureFlag(project, flag); + + assertThat(result, is(flag)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index c42e9a59d..15d2dd20f 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -86,13 +86,6 @@ public void validateProject() throws Exception { assertThat(results.getResults(), is(notNullValue())); } - @Test(groups = "project", dependsOnMethods = "createProject") - public void createProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); - checkFeatureFlag(featureFlag, true); - } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") public void getProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = From 956a70c29e6c1db21930deb2d1be25afd0f2a999 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 24 Sep 2015 18:21:34 +0200 Subject: [PATCH 0319/1191] Move getProjectFeatureFlag to FeatureFlagService Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- .../featureflag/FeatureFlagService.java | 32 ++++++++++++++++++ .../com/gooddata/project/ProjectService.java | 2 ++ .../featureflag/FeatureFlagServiceAT.java | 7 ++++ .../featureflag/FeatureFlagServiceIT.java | 27 ++++++++++----- .../featureflag/FeatureFlagServiceTest.java | 33 +++++++++++++++++++ .../gooddata/project/ProjectServiceAT.java | 9 +---- 6 files changed, 94 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 36bf4bb51..fd03298ff 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -12,7 +12,9 @@ import java.net.URI; import static com.gooddata.featureflag.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.featureflag.ProjectFeatureFlag.PROJECT_FEATURE_FLAG_TEMPLATE; import static com.gooddata.featureflag.ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_TEMPLATE; +import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; /** @@ -77,6 +79,32 @@ public ProjectFeatureFlags listProjectFeatureFlags(final Project project) { } } + /** + * Returns project feature flag (only project scoped flags, use {@link #listFeatureFlags(Project)} for aggregated + * flags from all scopes) for given project by its unique name (aka "key"). + * It doesn't matter whether feature flag is enabled or not, it'll be included in both cases. + * + * @param project project, cannot be null + * @param featureFlagName unique name (key) of feature flag, cannot be empty + * @return feature flag for given project with given name (key) + */ + public ProjectFeatureFlag getProjectFeatureFlag(final Project project, final String featureFlagName) { + notNull(project, "project"); + notEmpty(featureFlagName, "featureFlagName"); + + try { + final ProjectFeatureFlag flag = getProjectFeatureFlag(getProjectFeatureFlagUri(project, featureFlagName)); + + if (flag == null) { + throw new GoodDataException("empty response from API call"); + } + + return flag; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to get project feature flag: " + featureFlagName, e); + } + } + /** * Creates new feature flag for given project. *

@@ -105,6 +133,10 @@ public ProjectFeatureFlag createProjectFeatureFlag(final Project project, final } + String getProjectFeatureFlagUri(final Project project, final String flagName) { + return PROJECT_FEATURE_FLAG_TEMPLATE.expand(project.getId(), flagName).toString(); + } + private ProjectFeatureFlag getProjectFeatureFlag(final String flagUri) { final ProjectFeatureFlag result = restTemplate.getForObject(flagUri, ProjectFeatureFlag.class); if (result == null) { diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 290df23b4..964450dd3 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -436,7 +436,9 @@ public ProjectFeatureFlag createFeatureFlag(final Project project, final Project * @param project project, cannot be null * @param featureFlagName name of feature flag, cannot be empty * @return feature flag + * @deprecated use {@link FeatureFlagService#getProjectFeatureFlag(Project, String)} */ + @Deprecated @SuppressWarnings("deprecation") public ProjectFeatureFlag getFeatureFlag(final Project project, final String featureFlagName) { notNull(project, "project"); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 448b80d53..c68827d25 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -46,6 +46,13 @@ public void listFeatureFlags() throws Exception { new com.gooddata.featureflag.FeatureFlag(PROJECT_FEATURE_FLAG, true))); } + @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") + public void getProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getFeatureFlagService().getProjectFeatureFlag(project, PROJECT_FEATURE_FLAG); + checkProjectFeatureFlag(featureFlag, true); + } + private void checkProjectFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { assertThat(featureFlag, is(notNullValue())); assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 521dfe9a6..9767b688a 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -24,7 +24,11 @@ public class FeatureFlagServiceIT extends AbstractGoodDataIT { private Project project; private static final String PROJECT_ID = "PROJECT_ID"; - private static final String PROJECT_FEATURE_FLAGS_URI_STRING = PROJECT_FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString(); + private static final String PROJECT_FEATURE_FLAGS_URI_STRING = PROJECT_FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID) + .toString(); + private static final String FEATURE_FLAG_NAME = "myCoolFeature"; + private static final String PROJECT_FEATURE_FLAG_URI_STRING = PROJECT_FEATURE_FLAG_TEMPLATE + .expand(PROJECT_ID, FEATURE_FLAG_NAME).toString(); @BeforeMethod public void setUp() throws Exception { @@ -48,7 +52,6 @@ public void listFeatureFlagsShouldReturnAggregatedFlagsForProject() throws Excep new FeatureFlag("testFeature2", false))); } - @Test public void listProjectFeatureFlagsShouldReturnProjectFeatureFlags() throws Exception { onRequest() @@ -68,8 +71,7 @@ public void listProjectFeatureFlagsShouldReturnProjectFeatureFlags() throws Exce @Test public void createProjectFeatureFlagShouldCreateAndReturnNewProjectFeatureFlag() { - final String featureFlagName = "myCoolFeature"; - final String projectFeatureFlagUriString = getProjectFeatureFlagUriString(featureFlagName); + final String projectFeatureFlagUriString = service.getProjectFeatureFlagUri(project, FEATURE_FLAG_NAME); onRequest() .havingMethodEqualTo("POST") @@ -85,16 +87,25 @@ public void createProjectFeatureFlagShouldCreateAndReturnNewProjectFeatureFlag() .withStatus(200); final ProjectFeatureFlag featureFlag = service.createProjectFeatureFlag(project, - new ProjectFeatureFlag(featureFlagName)); + new ProjectFeatureFlag(FEATURE_FLAG_NAME)); assertThat(featureFlag, is(notNullValue())); - assertThat(featureFlag.getName(), is(featureFlagName)); + assertThat(featureFlag.getName(), is(FEATURE_FLAG_NAME)); assertThat(featureFlag.isEnabled(), is(true)); } + @Test + public void getProjectFeatureFlagShouldReturnProjectFeatureFlag() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROJECT_FEATURE_FLAG_URI_STRING) + .respond() + .withBody(readStringFromResource("/featureflag/projectFeatureFlag.json")) + .withStatus(200); + + final ProjectFeatureFlag flag = service.getProjectFeatureFlag(project, FEATURE_FLAG_NAME); - private String getProjectFeatureFlagUriString(String featureFlagName) { - return PROJECT_FEATURE_FLAG_TEMPLATE.expand(PROJECT_ID, featureFlagName).toString(); + assertThat(flag, is(new ProjectFeatureFlag(FEATURE_FLAG_NAME, true))); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index 663f9734f..cb3ed22ab 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -142,4 +142,37 @@ public void testCreateProjectFeatureFlag() throws Exception { assertThat(result, is(flag)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullKeyThenGetProjectFeatureFlagShouldThrow() throws Exception { + service.getProjectFeatureFlag(project, null); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullProjectThenGetProjectFeatureFlagShouldThrow() throws Exception { + service.getProjectFeatureFlag(null, FLAG_NAME); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenEmptyResponseThenGetProjectFeatureFlagShouldThrow() throws Exception { + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)).thenReturn(null); + service.getProjectFeatureFlag(project, FLAG_NAME); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenGetProjectFeatureFlagShouldThrow() throws Exception { + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)) + .thenThrow(new RestClientException("")); + service.getProjectFeatureFlag(project, FLAG_NAME); + } + + @Test + public void testGetProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag flag = new ProjectFeatureFlag(FLAG_NAME, true); + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)).thenReturn(flag); + + final ProjectFeatureFlag result = service.getProjectFeatureFlag(project, FLAG_NAME); + + assertThat(result, is(flag)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index 15d2dd20f..0d6a7395b 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -86,13 +86,6 @@ public void validateProject() throws Exception { assertThat(results.getResults(), is(notNullValue())); } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void getProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); - checkFeatureFlag(featureFlag, true); - } - @Test(groups = "project", dependsOnMethods = "getProjectFeatureFlag") public void updateProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = @@ -117,7 +110,7 @@ public void deleteProjectFeatureFlag() throws Exception { gd.getProjectService().deleteFeatureFlag(featureFlag); try { - gd.getProjectService().getFeatureFlag(project, featureFlag.getName()); + gd.getFeatureFlagService().getProjectFeatureFlag(project, featureFlag.getName()); fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); } catch (GoodDataRestException e) { assertThat(e.getStatusCode(), is(HttpStatus.NOT_FOUND.value())); From aca1ac9d40193ca80cddea8f70fe68689c002e37 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 8 Oct 2015 18:53:13 +0200 Subject: [PATCH 0320/1191] Move updateProjectFeatureFlag to FeatureFlagService Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- .../featureflag/FeatureFlagService.java | 19 +++++++++++ .../com/gooddata/project/ProjectService.java | 2 ++ .../featureflag/FeatureFlagServiceAT.java | 16 +++++++++ .../featureflag/FeatureFlagServiceIT.java | 25 ++++++++++++++ .../featureflag/FeatureFlagServiceTest.java | 34 +++++++++++++++++++ .../gooddata/project/ProjectServiceAT.java | 22 ------------ 6 files changed, 96 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index fd03298ff..2cb3f542b 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -132,6 +132,25 @@ public ProjectFeatureFlag createProjectFeatureFlag(final Project project, final } } + /** + * Updates existing project's feature flag. + * Note that it doesn't make sense to update any other property than {@link ProjectFeatureFlag#enabled}. + * + * @param flag feature flag to be updated, cannot be null and it has to contain URI + * @return updated feature flag + */ + public ProjectFeatureFlag updateProjectFeatureFlag(final ProjectFeatureFlag flag) { + notNull(flag, "flag"); + notEmpty(flag.getUri(), "flag.uri"); + + try { + restTemplate.put(flag.getUri(), flag); + return getProjectFeatureFlag(flag.getUri()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to update feature flag: " + flag, e); + } + } + String getProjectFeatureFlagUri(final Project project, final String flagName) { return PROJECT_FEATURE_FLAG_TEMPLATE.expand(project.getId(), flagName).toString(); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 964450dd3..e3d9a6ae8 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -453,7 +453,9 @@ public ProjectFeatureFlag getFeatureFlag(final Project project, final String fea * * @param featureFlag updated feature flag * @return updated feature flag + * @deprecated use {@link FeatureFlagService#updateProjectFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} */ + @Deprecated @SuppressWarnings("deprecation") public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag) { notNull(featureFlag, "featureFlag"); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index c68827d25..21d93a27d 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -53,6 +53,22 @@ public void getProjectFeatureFlag() throws Exception { checkProjectFeatureFlag(featureFlag, true); } + @Test(groups = "featureFlag", dependsOnMethods = "getProjectFeatureFlag") + public void updateProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = gd.getFeatureFlagService().getProjectFeatureFlag(project, + PROJECT_FEATURE_FLAG); + + // disable (update) feature flag + featureFlag.setEnabled(false); + final ProjectFeatureFlag disabledFlag = gd.getFeatureFlagService().updateProjectFeatureFlag(featureFlag); + checkProjectFeatureFlag(disabledFlag, false); + + // enable again + featureFlag.setEnabled(true); + final ProjectFeatureFlag enabledFlag = gd.getFeatureFlagService().updateProjectFeatureFlag(featureFlag); + checkProjectFeatureFlag(enabledFlag, true); + } + private void checkProjectFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { assertThat(featureFlag, is(notNullValue())); assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 9767b688a..a951d3b9a 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -108,4 +108,29 @@ public void getProjectFeatureFlagShouldReturnProjectFeatureFlag() throws Excepti assertThat(flag, is(new ProjectFeatureFlag(FEATURE_FLAG_NAME, true))); } + @Test + public void updateProjectFeatureFlagShouldUpdateAndReturnUpdatedProjectFeatureFlag() throws Exception { + final String projectFeatureFlagUriString = service.getProjectFeatureFlagUri(project, FEATURE_FLAG_NAME); + + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(PROJECT_FEATURE_FLAG_URI_STRING) + .respond() + .withStatus(200); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(projectFeatureFlagUriString) + .respond() + .withBody(readStringFromResource("/featureflag/projectFeatureFlag.json")) + .withStatus(200); + + final ProjectFeatureFlag flag = MAPPER + .readValue(readFromResource("/featureflag/projectFeatureFlag.json"), ProjectFeatureFlag.class); + final ProjectFeatureFlag featureFlag = service.updateProjectFeatureFlag(flag); + + assertThat(featureFlag, is(notNullValue())); + assertThat(featureFlag.getName(), is(FEATURE_FLAG_NAME)); + assertThat(featureFlag.isEnabled(), is(true)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index cb3ed22ab..639da3911 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class FeatureFlagServiceTest { @@ -175,4 +176,37 @@ public void testGetProjectFeatureFlag() throws Exception { assertThat(result, is(flag)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullFlagThenUpdateProjectFeatureFlagShouldThrow() throws Exception { + service.updateProjectFeatureFlag(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenEmptyResponseThenUpdateProjectFeatureFlagShouldThrow() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)).thenReturn(null); + service.updateProjectFeatureFlag(projectFeatureFlag); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenUpdateProjectFeatureFlagShouldThrow() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)) + .thenThrow(new RestClientException("")); + service.updateProjectFeatureFlag(projectFeatureFlag); + } + + @Test + public void testUpdateProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag newFlag = new ProjectFeatureFlag(FLAG_NAME, true); + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + when(restTemplate.getForObject(PROJECT_FEATURE_FLAG_URI, ProjectFeatureFlag.class)) + .thenReturn(newFlag); + + final ProjectFeatureFlag result = service.updateProjectFeatureFlag(projectFeatureFlag); + + verify(restTemplate).put(PROJECT_FEATURE_FLAG_URI, projectFeatureFlag); + assertThat(result, is(newFlag)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index 0d6a7395b..70c751815 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -86,22 +86,6 @@ public void validateProject() throws Exception { assertThat(results.getResults(), is(notNullValue())); } - @Test(groups = "project", dependsOnMethods = "getProjectFeatureFlag") - public void updateProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().getFeatureFlag(project, PROJECT_FEATURE_FLAG); - - // disable (update) feature flag - featureFlag.setEnabled(false); - final ProjectFeatureFlag disabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); - checkFeatureFlag(disabledFlag, false); - - // enable again - featureFlag.setEnabled(true); - final ProjectFeatureFlag enabledFlag = gd.getProjectService().updateFeatureFlag(featureFlag); - checkFeatureFlag(enabledFlag, true); - } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") public void deleteProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = @@ -117,10 +101,4 @@ public void deleteProjectFeatureFlag() throws Exception { } } - private void checkFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { - assertThat(featureFlag, is(notNullValue())); - assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); - assertThat(featureFlag.getEnabled(), is(expectedValue)); - } - } From 0581642794441ee6a143dbe7a0631634d99c2d89 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 9 Oct 2015 10:07:54 +0200 Subject: [PATCH 0321/1191] Move deleteProjectFeatureFlag to FeatureFlagService Lets move support of feature flags of all scopes to its own service in its own package. Also fix naming conventions and use helper return objects instead of lists. --- .../featureflag/FeatureFlagService.java | 16 ++++++++++++++ .../com/gooddata/project/ProjectService.java | 2 ++ .../featureflag/FeatureFlagServiceAT.java | 21 +++++++++++++++++++ .../featureflag/FeatureFlagServiceIT.java | 13 ++++++++++++ .../featureflag/FeatureFlagServiceTest.java | 20 ++++++++++++++++++ .../gooddata/project/ProjectServiceAT.java | 20 +----------------- 6 files changed, 73 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 2cb3f542b..1f72f7fe7 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -151,6 +151,22 @@ public ProjectFeatureFlag updateProjectFeatureFlag(final ProjectFeatureFlag flag } } + /** + * Deletes existing project feature flag. + * + * @param flag existing project feature flag with links set properly, cannot be null + */ + public void deleteFeatureFlag(final ProjectFeatureFlag flag) { + notNull(flag, "flag"); + notEmpty(flag.getUri(), "flag URI"); + + try { + restTemplate.delete(flag.getUri()); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to delete feature flag=" + flag, e); + } + } + String getProjectFeatureFlagUri(final Project project, final String flagName) { return PROJECT_FEATURE_FLAG_TEMPLATE.expand(project.getId(), flagName).toString(); diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index e3d9a6ae8..e27e86934 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -473,7 +473,9 @@ public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag * Deletes existing project feature flag. * * @param featureFlag existing project feature flag with links set properly, cannot be null + * @deprecated use {@link FeatureFlagService#deleteFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} */ + @Deprecated @SuppressWarnings("deprecation") public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { notNull(featureFlag, "featureFlag"); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 21d93a27d..64e7676df 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -5,12 +5,16 @@ package com.gooddata.featureflag; import com.gooddata.AbstractGoodDataAT; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import org.springframework.http.HttpStatus; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.hasItems; +import static org.testng.AssertJUnit.fail; /** * Feature flag acceptance tests. @@ -69,6 +73,23 @@ public void updateProjectFeatureFlag() throws Exception { checkProjectFeatureFlag(enabledFlag, true); } + @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") + public void deleteProjectFeatureFlag() throws Exception { + final ProjectFeatureFlag featureFlag = + gd.getFeatureFlagService().createProjectFeatureFlag(project, + new ProjectFeatureFlag("temporaryFeatureFlag")); + + gd.getFeatureFlagService().deleteFeatureFlag(featureFlag); + + try { + gd.getFeatureFlagService().getProjectFeatureFlag(project, featureFlag.getName()); + fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); + } catch (GoodDataException e) { + assertThat(((GoodDataRestException)e.getCause()).getStatusCode(), is(HttpStatus.NOT_FOUND.value())); + } + } + + private void checkProjectFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { assertThat(featureFlag, is(notNullValue())); assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index a951d3b9a..47342e760 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -133,4 +133,17 @@ public void updateProjectFeatureFlagShouldUpdateAndReturnUpdatedProjectFeatureFl assertThat(featureFlag.isEnabled(), is(true)); } + @Test + public void deleteProjectFeatureFlagShouldRemoveIt() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(PROJECT_FEATURE_FLAG_URI_STRING) + .respond() + .withStatus(200); + + final ProjectFeatureFlag flag = MAPPER + .readValue(readFromResource("/featureflag/projectFeatureFlag.json"), ProjectFeatureFlag.class); + service.deleteFeatureFlag(flag); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index 639da3911..de3f415ea 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -209,4 +210,23 @@ public void testUpdateProjectFeatureFlag() throws Exception { assertThat(result, is(newFlag)); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullFlagThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + service.deleteFeatureFlag(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + doThrow(new RestClientException("")).when(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); + service.deleteFeatureFlag(projectFeatureFlag); + } + + @Test + public void testDeleteProjectFeatureFlag() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + service.deleteFeatureFlag(projectFeatureFlag); + verify(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index 70c751815..e446aa420 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -1,9 +1,7 @@ package com.gooddata.project; import com.gooddata.AbstractGoodDataAT; -import com.gooddata.GoodDataRestException; import com.gooddata.collections.PageRequest; -import org.springframework.http.HttpStatus; import org.testng.annotations.Test; import java.util.ArrayList; @@ -19,14 +17,13 @@ import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; -import static org.testng.AssertJUnit.fail; /** * Project acceptance tests. */ public class ProjectServiceAT extends AbstractGoodDataAT { - private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; + private final String projectToken; public ProjectServiceAT() { projectToken = getProperty("projectToken"); @@ -86,19 +83,4 @@ public void validateProject() throws Exception { assertThat(results.getResults(), is(notNullValue())); } - @Test(groups = "project", dependsOnMethods = "createProjectFeatureFlag") - public void deleteProjectFeatureFlag() throws Exception { - final ProjectFeatureFlag featureFlag = - gd.getProjectService().createFeatureFlag(project, new ProjectFeatureFlag("temporaryFeatureFlag")); - - gd.getProjectService().deleteFeatureFlag(featureFlag); - - try { - gd.getFeatureFlagService().getProjectFeatureFlag(project, featureFlag.getName()); - fail("Feature flag has not been deleted properly. HTTP status NOT FOUND expected."); - } catch (GoodDataRestException e) { - assertThat(e.getStatusCode(), is(HttpStatus.NOT_FOUND.value())); - } - } - } From 908f73c03efdb038a7452ccbb42894ba68dcd7e6 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Sun, 6 Mar 2016 10:21:46 +0100 Subject: [PATCH 0322/1191] Add list* convention into CONTRIBUTING.md --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index dd421bf91..03e7cf3d1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,8 @@ is specific enough. * `get*()` when searching form single object (throw exception when no or multiple objects are found, never return `null`) * `find*()` when searching for multiple objects (collection of objects, never return `null`) - * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` + * `list*()` when listing whole or paged collection of objects (return collection or collection wrapped by DTO) + * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` * Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. * If it is possible write **acceptance tests** to be run with the real backend. * Update [documentation](https://github.com/martiner/gooddata-java/wiki/Code-Examples) with usage examples. From dcf52e7a3ad28a7dad201446c04dbbbca48141eb Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 3 Mar 2016 14:23:30 +0100 Subject: [PATCH 0323/1191] introduce support for dataLoadingColumn --- .../com/gooddata/md/DataLoadingColumn.java | 174 ++++++++++++++++++ .../gooddata/md/DataLoadingColumnTest.java | 44 +++++ src/test/resources/md/dataLoadingColumn.json | 34 ++++ 3 files changed, 252 insertions(+) create mode 100644 src/main/java/com/gooddata/md/DataLoadingColumn.java create mode 100644 src/test/java/com/gooddata/md/DataLoadingColumnTest.java create mode 100644 src/test/resources/md/dataLoadingColumn.json diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java new file mode 100644 index 000000000..ff901c8b8 --- /dev/null +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -0,0 +1,174 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.gdc.UriResponse; +import com.gooddata.util.BooleanIntegerDeserializer; + +/** + * Represents datasets' loading column. + * Deserialization only. + */ +@JsonTypeName("dataLoadingColumn") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class DataLoadingColumn extends AbstractObj implements Queryable { + + private static final String INT = "INT"; + private static final String VARCHAR = "VARCHAR"; + + private final Content content; + + @JsonCreator + private DataLoadingColumn(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + public UriResponse getColumnUri() { + return content.getColumnUri(); + } + + public String getName() { + return content.getColumnName(); + } + + public String getType() { + return content.getColumnType(); + } + + /** + * @return true when the type is not null and equal to VARCHAR, false otherwise + */ + public boolean hasTypeVarchar() { + return VARCHAR.equals(getType()); + } + + /** + * @return true when the type is not null and equal to INT, false otherwise + */ + public boolean hasTypeInt() { + return INT.equals(getType()); + } + + public Integer getLength() { + return content.getColumnLength(); + } + + public Integer getPrecision() { + return content.getColumnPrecision(); + } + + public boolean isUnique() { + return content.isColumnUnique(); + } + + public boolean isNullable() { + return content.isColumnNull(); + } + + public String getSynchronizeType() { + return content.getColumnSynchronize() != null ? content.getColumnSynchronize().getType() : null; + } + + public Integer getSynchronizeLength() { + return content.getColumnSynchronize() != null ? content.getColumnSynchronize().getLength() : null; + } + + public Integer getSynchronizePrecision() { + return content.getColumnSynchronize() != null ? content.getColumnSynchronize().getPrecision() : null; + } + + private static class Content { + + private final UriResponse columnUri; + private final String columnName; + private final String columnType; + private final Integer columnLength; + private final Integer columnPrecision; + private final boolean columnUnique; + private final boolean columnNull; + private final ColumnSynchronize columnSynchronize; + + private Content(@JsonProperty("column") UriResponse columnUri, @JsonProperty("columnName") String columnName, @JsonProperty("type") String columnType, + @JsonProperty("length") Integer columnLength, @JsonProperty("precision") Integer columnPrecision, + @JsonProperty("columnUnique") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean columnUnique, + @JsonProperty("columnNull") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean columnNull, + @JsonProperty("columnSynchronize") ColumnSynchronize columnSynchronize) { + this.columnUri = columnUri; + this.columnName = columnName; + this.columnType = columnType; + this.columnLength = columnLength; + this.columnPrecision = columnPrecision; + this.columnUnique = columnUnique; + this.columnNull = columnNull; + this.columnSynchronize = columnSynchronize; + } + + public UriResponse getColumnUri() { + return columnUri; + } + + public String getColumnName() { + return columnName; + } + + public String getColumnType() { + return columnType; + } + + public Integer getColumnLength() { + return columnLength; + } + + public Integer getColumnPrecision() { + return columnPrecision; + } + + public boolean isColumnUnique() { + return columnUnique; + } + + public boolean isColumnNull() { + return columnNull; + } + + public ColumnSynchronize getColumnSynchronize() { + return columnSynchronize; + } + } + + private static class ColumnSynchronize { + private final String type; + private final Integer length; + private final Integer precision; + + @JsonCreator + private ColumnSynchronize(@JsonProperty("columnType") String type, @JsonProperty("columnLength") Integer length, + @JsonProperty("precision") Integer precision) { + this.type = type; + this.length = length; + this.precision = precision; + } + + public String getType() { + return type; + } + + public Integer getLength() { + return length; + } + + public Integer getPrecision() { + return precision; + } + } +} diff --git a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java new file mode 100644 index 000000000..c48bf30f3 --- /dev/null +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +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 com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class DataLoadingColumnTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/dataLoadingColumn.json"); + final DataLoadingColumn column = new ObjectMapper().readValue(stream, DataLoadingColumn.class); + assertThat(column, is(notNullValue())); + + assertThat(column.getColumnUri(), is(notNullValue())); + assertThat(column.getColumnUri().getUri(), is("/gdc/md/PROJECT_ID/obj/COLUMN_ID")); + + assertThat(column.getType(), is("INT")); + assertThat(column.hasTypeInt(), is(true)); + assertThat(column.hasTypeVarchar(), is(false)); + + assertThat(column.getName(), is("COLUMN_NAME")); + assertThat(column.getLength(), is(128)); + assertThat(column.getPrecision(), is(nullValue())); + assertThat(column.isUnique(), is(false)); + assertThat(column.isNullable(), is(true)); + + assertThat(column.getSynchronizeType(), is("INT")); + assertThat(column.getSynchronizeLength(), is(128)); + assertThat(column.getSynchronizePrecision(), is(0)); + } + + +} \ No newline at end of file diff --git a/src/test/resources/md/dataLoadingColumn.json b/src/test/resources/md/dataLoadingColumn.json new file mode 100644 index 000000000..5da9b05b9 --- /dev/null +++ b/src/test/resources/md/dataLoadingColumn.json @@ -0,0 +1,34 @@ +{ + "dataLoadingColumn" : { + "content" : { + "columnName" : "COLUMN_NAME", + "columnUnique" : 0, + "columnPrecision" : null, + "columnNull" : 1, + "columnType" : "INT", + "columnLength" : 128, + "column" : { + "uri" : "/gdc/md/PROJECT_ID/obj/COLUMN_ID" + }, + "columnSynchronize" : { + "columnType" : "INT", + "columnLength" : 128, + "precision" : 0 + } + }, + "meta" : { + "author" : "/gdc/account/profile/PROFILE_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DATA_LOADING_COLUMN_ID", + "tags" : "", + "created" : "2016-02-29 13:24:37", + "identifier" : "IDENTIFIER", + "deprecated" : "0", + "summary" : "", + "isProduction" : 1, + "title" : "TITLE", + "category" : "dataLoadingColumn", + "updated" : "2016-03-03 13:14:04", + "contributor" : "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file From ed6d66cb464a738a0242358d78281c504f6f1783 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 7 Mar 2016 13:47:25 +0100 Subject: [PATCH 0324/1191] align version of gooddata-http-client in README with reality --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d44556eec..165909268 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info ### Dependencies The *GoodData Java SDK* uses: -* the [GoodData HTTP client](https://github.com/gooddata/gooddata-http-client) version 0.8.2 or later +* 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 *Spring Framework* version 3.x * the *Jackson JSON Processor* version 2.7.0 (*GoodData Java SDK* version 0.x requires version 1.9) From 6c6c8f35e161a090d59b396e063f3f5e4400fdf6 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Mon, 7 Mar 2016 22:02:16 +0100 Subject: [PATCH 0325/1191] Introduce ProjectDashboard md object containing dashboard tab basic info --- .../com/gooddata/md/ProjectDashboard.java | 93 +++++++++++++++ .../com/gooddata/md/ProjectDashboardTest.java | 29 +++++ src/test/resources/md/projectDashboard.json | 110 ++++++++++++++++++ 3 files changed, 232 insertions(+) create mode 100644 src/main/java/com/gooddata/md/ProjectDashboard.java create mode 100644 src/test/java/com/gooddata/md/ProjectDashboardTest.java create mode 100644 src/test/resources/md/projectDashboard.json diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/src/main/java/com/gooddata/md/ProjectDashboard.java new file mode 100644 index 000000000..f9917de9e --- /dev/null +++ b/src/main/java/com/gooddata/md/ProjectDashboard.java @@ -0,0 +1,93 @@ +package com.gooddata.md; + +import static com.gooddata.util.Validate.notNull; + +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 java.util.Collection; +import java.util.Objects; + +/** + * Project Dashboard of GoodData project.
+ * Deserialization only. This object is not complete representation of real 'projectDashboard' object. + * It contains only dashboard tabs basic definitions (identifier and name). + */ +@JsonTypeName("projectDashboard") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ProjectDashboard extends AbstractObj implements Queryable { + + private final Content content; + + private ProjectDashboard(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = notNull(content, "content"); + } + + @JsonIgnore + public Collection getTabs() { + return content.tabs; + } + + /** + * Returns dashboard tab with the given tab name. + * If tab with such name doesn't exist, returns {@code null}. + * + * @param name tab name + * @return + *

    + *
  • dashboard tab with the given name
  • + *
  • {@code null} if tab doesn't exist
  • + *
+ */ + @JsonIgnore + public Tab getTabByName(String name) { + for (Tab tab : getTabs()) { + if (Objects.equals(tab.title, name)) { + return tab; + } + } + return null; + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + private static class Content { + + private final Collection tabs; + + @JsonCreator + private Content(@JsonProperty("tabs") Collection tabs) { + this.tabs = tabs; + } + } + + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class Tab { + + private final String identifier; + private final String title; + + @JsonCreator + private Tab(@JsonProperty("identifier") String identifier, @JsonProperty("title") String title) { + this.identifier = identifier; + this.title = title; + } + + public String getIdentifier() { + return identifier; + } + + public String getTitle() { + return title; + } + } +} diff --git a/src/test/java/com/gooddata/md/ProjectDashboardTest.java b/src/test/java/com/gooddata/md/ProjectDashboardTest.java new file mode 100644 index 000000000..a4612d520 --- /dev/null +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -0,0 +1,29 @@ +package com.gooddata.md; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.Matchers.nullValue; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import org.testng.annotations.Test; + +public class ProjectDashboardTest { + + @Test + public void testDeserialization() throws Exception { + final ProjectDashboard dashboard = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/projectDashboard.json"), ProjectDashboard.class); + + assertThat(dashboard.getUri(), is("/gdc/md/PROJECT_ID/obj/12345")); + + assertThat(dashboard.getTabs(), notNullValue()); + assertThat(dashboard.getTabs().size(), is(2)); + + final ProjectDashboard.Tab tab1 = dashboard.getTabByName("Tab 1"); + assertThat(tab1, notNullValue()); + assertThat(tab1.getIdentifier(), is("tab1abc")); + + assertThat(dashboard.getTabByName("Undefined"), nullValue()); + } +} \ No newline at end of file diff --git a/src/test/resources/md/projectDashboard.json b/src/test/resources/md/projectDashboard.json new file mode 100644 index 000000000..b401a991e --- /dev/null +++ b/src/test/resources/md/projectDashboard.json @@ -0,0 +1,110 @@ +{ + "projectDashboard": { + "content": { + "tabs": [ + { + "identifier": "tab1abc", + "title": "Tab 1", + "items": [ + { + "iframeItem": { + "positionX": 481, + "sizeY": 400, + "sizeX": 440, + "url": "iFrameUrl", + "positionY": 1813 + } + }, + { + "reportItem": { + "obj": "/gdc/md/PROJECT_ID/obj/375872", + "sizeY": 60, + "sizeX": 250, + "style": { + "displayTitle": 1, + "background": { + "opacity": 0 + } + }, + "visualization": { + "grid": { + "columnWidths": [] + }, + "oneNumber": { + "labels": { + "description": "" + } + } + }, + "positionY": 265, + "filters": [ + "reportFilterItem" + ], + "positionX": 29 + } + }, + { + "textItem": { + "positionX": 817, + "sizeY": 30, + "sizeX": 110, + "text": "Some text", + "style": { + "displayTitle": 1, + "background": { + "opacity": 0 + } + }, + "positionY": 20, + "textSize": "big" + } + }, + { + "filterItem": { + "positionX": 20, + "parentFilters": [], + "sizeY": 40, + "sizeX": 170, + "positionY": 80, + "id": "filterInTab123", + "contentId": "somefiltercontentid" + } + } + ] + }, + { + "identifier": "tab2def", + "title": "Tab 2" + } + ], + "filters": [ + { + "filterItemContent": { + "obj": "/gdc/md/PROJECT_ID/obj/1304", + "multiple": 1, + "type": "list", + "label": null, + "id": "filterId1" + } + } + ], + "rememberFilters": 1 + }, + "meta": { + "locked": 1, + "author": "/gdc/account/profile/USER_ID", + "uri": "/gdc/md/PROJECT_ID/obj/12345", + "tags": "", + "created": "2016-03-07 21:56:33", + "identifier": "dashboard123abc", + "deprecated": "0", + "summary": "", + "sharedWithSomeone": 0, + "isProduction": 1, + "title": "Some Project Dashboard", + "category": "projectDashboard", + "updated": "2016-03-07 21:56:33", + "contributor": "/gdc/account/profile/USER_ID" + } + } +} From 9ab09415b451e5393da3e745aed4e41d96c9961f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Feb 2016 20:39:59 +0100 Subject: [PATCH 0326/1191] (de)serialize attribute.sort properly --- .../java/com/gooddata/md/AttributeSort.java | 84 +++++++++++++++++++ .../java/com/gooddata/md/NestedAttribute.java | 36 +++++++- .../com/gooddata/md/AttributeSortTest.java | 43 ++++++++++ .../java/com/gooddata/md/AttributeTest.java | 13 +++ src/test/resources/md/attribute-sortDf.json | 71 ++++++++++++++++ src/test/resources/md/attributeSort.json | 5 ++ 6 files changed, 248 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gooddata/md/AttributeSort.java create mode 100644 src/test/java/com/gooddata/md/AttributeSortTest.java create mode 100644 src/test/resources/md/attribute-sortDf.json create mode 100644 src/test/resources/md/attributeSort.json diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/src/main/java/com/gooddata/md/AttributeSort.java new file mode 100644 index 000000000..f21a07714 --- /dev/null +++ b/src/main/java/com/gooddata/md/AttributeSort.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.io.IOException; + +/** + * 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 { + + static String PK = "pk"; + static String BY_USED_DF = "byUsedDF"; + + private final String value; + private final boolean linkType; + + AttributeSort(String value) { + this(value, false); + } + + AttributeSort(String value, boolean linkType) { + this.value = notEmpty(value, "value"); + this.linkType = linkType; + } + + String getValue() { + return value; + } + + boolean isLinkType() { + return linkType; + } + + static class Deserializer extends JsonDeserializer { + + @Override + public AttributeSort deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + final JsonNode root = p.readValueAsTree(); + notNull(root, "jsonNode"); + if (root.isTextual()) { + return new AttributeSort(root.textValue()); + } else if (root.isObject()) { + return new AttributeSort(root.findValue("uri").textValue(), true); + } else { + throw ctxt.mappingException("Only textual or object node expected but %s node found", + root.getNodeType().name()); + } + } + } + + static class Serializer extends JsonSerializer { + @Override + public void serialize(AttributeSort value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value.linkType) { + gen.writeStartObject(); + gen.writeFieldName("df"); + gen.writeStartObject(); + gen.writeStringField("uri", value.getValue()); + gen.writeEndObject(); + gen.writeEndObject(); + } else { + gen.writeString(value.getValue()); + } + } + } +} diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 539f5ffc4..0ead0366d 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -67,9 +67,37 @@ public String getDirection() { return content.getDirection(); } + /** + * @see {@link #isSortedByLinkedDf()}, {@link #isSortedByUsedDf()} and {@link #isSortedByPk()} + * @return sort setting - pk, byUsedDF or uri linking some display form, null if not set + */ @JsonIgnore public String getSort() { - return content.getSort(); + return content.getSort() != null ? content.getSort().getValue() : null; + } + + /** + * @return true when the sort is set and it is a link to display form, false otherwise + */ + @JsonIgnore + public boolean isSortedByLinkedDf() { + return content.getSort() != null && content.getSort().isLinkType(); + } + + /** + * @return true when the sort is set to byUsedDF (used display form), false otherwise + */ + @JsonIgnore + public boolean isSortedByUsedDf() { + return content.getSort() != null && AttributeSort.BY_USED_DF.equals(content.getSort().getValue()); + } + + /** + * @return true when the sort is set to pk (primary key), false otherwise + */ + @JsonIgnore + public boolean isSortedByPk() { + return content.getSort() != null && AttributeSort.PK.equals(content.getSort().getValue()); } @JsonIgnore @@ -114,7 +142,7 @@ protected static class Content { private final Collection displayForms; private final String dimension; private final String direction; - private final String sort; + private final AttributeSort sort; private final String type; private final Collection rel; private final Collection compositeAttribute; @@ -127,7 +155,7 @@ protected static class Content { @JsonCreator protected Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension, - @JsonProperty("direction") String direction, @JsonProperty("sort") String sort, @JsonProperty("type") String type, + @JsonProperty("direction") String direction, @JsonProperty("sort") AttributeSort sort, @JsonProperty("type") String type, @JsonProperty("rel") Collection rel, @JsonProperty("compositeAttribute") Collection compositeAttribute, @JsonProperty("compositeAttributePk") Collection compositeAttributePk, @JsonProperty("drillDownStepAttributeDF") String drillDownStepAttributeDF, @JsonProperty("linkAttributeDF") String linkAttributeDF, @@ -169,7 +197,7 @@ public String getDirection() { return direction; } - public String getSort() { + public AttributeSort getSort() { return sort; } diff --git a/src/test/java/com/gooddata/md/AttributeSortTest.java b/src/test/java/com/gooddata/md/AttributeSortTest.java new file mode 100644 index 000000000..4f2fbfc80 --- /dev/null +++ b/src/test/java/com/gooddata/md/AttributeSortTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.JsonMatchers; +import org.testng.annotations.Test; + +public class AttributeSortTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void testSerializePlain() throws Exception { + final AttributeSort attributeSort = new AttributeSort("pk"); + assertThat(attributeSort, net.javacrumbs.jsonunit.JsonMatchers.jsonEquals("pk")); + } + + @Test + public void testDeserializePlain() throws Exception { + final AttributeSort attributeSort = MAPPER.readValue("\"pk\"", AttributeSort.class); + assertThat(attributeSort, is(notNullValue())); + assertThat(attributeSort.getValue(), is("pk")); + } + + @Test + public void testSerializeLink() throws Exception { + final AttributeSort attributeSort = new AttributeSort("/gdc/md/PROJECT_ID/obj/1806", true); + assertThat(attributeSort, JsonMatchers.serializesToJson("/md/attributeSort.json")); + } + + @Test + public void testDeserializeLink() throws Exception { + final AttributeSort attributeSort = MAPPER.readValue(getClass().getResourceAsStream("/md/attributeSort.json"), AttributeSort.class); + assertThat(attributeSort, is(notNullValue())); + assertThat(attributeSort.getValue(), is("/gdc/md/PROJECT_ID/obj/1806")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index cf0a58859..5af17be3a 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -59,6 +59,9 @@ public void shouldDeserialize() throws Exception { assertThat(attribute.getDirection(), is("asc")); assertThat(attribute.getSort(), is("pk")); + assertThat(attribute.isSortedByPk(), is(true)); + assertThat(attribute.isSortedByUsedDf(), is(false)); + assertThat(attribute.isSortedByLinkedDf(), is(false)); assertThat(attribute.getType(), is("GDC.time.date")); assertThat(attribute.getLinkedDisplayFormLink(), is("/gdc/md/PROJECT_ID/obj/DF_LINK")); assertThat(attribute.getCompositeAttribute(), hasSize(0)); @@ -83,4 +86,14 @@ public void shouldSerializeSameAsDeserializationInput() throws Exception { assertThat(attribute, serializesToJson("/md/attribute-inputOrig.json")); } + @Test + public void shouldDeserializeAttributeWithSort() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attribute-sortDf.json"); + final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + + assertThat(attribute.getSort(), is("/gdc/md/PROJECT_ID/obj/1806")); + assertThat(attribute.isSortedByLinkedDf(), is(true)); + assertThat(attribute.isSortedByUsedDf(), is(false)); + assertThat(attribute.isSortedByPk(), is(false)); + } } diff --git a/src/test/resources/md/attribute-sortDf.json b/src/test/resources/md/attribute-sortDf.json new file mode 100644 index 000000000..67b7e8af9 --- /dev/null +++ b/src/test/resources/md/attribute-sortDf.json @@ -0,0 +1,71 @@ +{ + "attribute" : { + "content" : { + "pk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/PK_ID", + "type" : "col" + } + ], + "direction" : "asc", + "sort": { + "df": { + "uri": "/gdc/md/PROJECT_ID/obj/1806" + } + }, + "type" : "GDC.time.date", + "rel" : [], + "compositeAttribute" : [], + "compositeAttributePk" : [], + "drillDownStepAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_DRILL_DOWN", + "linkAttributeDF" : "/gdc/md/PROJECT_ID/obj/DF_LINK", + "folders" : [], + "grain" : [], + "displayForms" : [ + { + "content" : { + "formOf" : "/gdc/md/PROJECT_ID/obj/DF_FORM_OF_ID", + "expression" : "[/gdc/md/PROJECT_ID/obj/DF_EXPRESSION_ID]", + "ldmexpression" : "[/gdc/md/PROJECT_ID/obj/DF_LDM_EXPRESSION_ID]" + }, + "links" : { + "elements" : "/gdc/md/PROJECT_ID/obj/DF_ID/elements" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id.name", + "deprecated" : "0", + "summary" : "", + "title" : "Person Name", + "category" : "attributeDisplayForm", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID" + } + } + ], + "fk" : [ + { + "data" : "/gdc/md/PROJECT_ID/obj/FK_ID", + "type" : "col" + } + ], + "dimension": "/gdc/md/PROJECT_ID/obj/DIM_ID" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/28", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id", + "deprecated" : "0", + "summary" : "", + "title" : "Person ID", + "category" : "attribute", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/attributeSort.json b/src/test/resources/md/attributeSort.json new file mode 100644 index 000000000..0701bef58 --- /dev/null +++ b/src/test/resources/md/attributeSort.json @@ -0,0 +1,5 @@ +{ + "df" : { + "uri" : "/gdc/md/PROJECT_ID/obj/1806" + } +} \ No newline at end of file From b4d491f18d6f7815509a83b1f6a73aa5f1532265 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 8 Mar 2016 16:18:26 +0100 Subject: [PATCH 0327/1191] build: add Oracle JDK 8 and JavaDocs to Travis build --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 7ddadf158..ad0e8370c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,9 @@ language: java install: true -script: mvn verify coveralls:report -Pcoverage +script: mvn verify javadoc:javadoc coveralls:report -Pcoverage jdk: - openjdk7 + - oraclejdk8 branches: only: - master From a33c1306aab7805a40ed6a155066cf32eea03192 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 8 Mar 2016 16:50:58 +0100 Subject: [PATCH 0328/1191] Fix javadocs --- .../java/com/gooddata/featureflag/FeatureFlagService.java | 2 +- src/main/java/com/gooddata/featureflag/FeatureFlags.java | 4 +--- .../java/com/gooddata/featureflag/ProjectFeatureFlags.java | 4 +--- src/main/java/com/gooddata/gdc/FeatureFlags.java | 1 + src/main/java/com/gooddata/md/NestedAttribute.java | 4 +++- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 1f72f7fe7..29034a6f4 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -107,7 +107,7 @@ public ProjectFeatureFlag getProjectFeatureFlag(final Project project, final Str /** * Creates new feature flag for given project. - *

+ *

* Usually, it doesn't make sense to create feature flag that is disabled because * this is the same as having no feature flag at all. * diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index 3eba66bea..eb25d66a2 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -35,15 +35,13 @@ protected void addFlag(final String name, final boolean enabled) { /** * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class + * @return list of feature flags */ @Deprecated public List getFeatureFlags() { return featureFlags; } - /** - * {@inheritDoc Iterable#iterator} - */ @Override public Iterator iterator() { return featureFlags.iterator(); diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java index 64ebff02d..33861277b 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java @@ -31,9 +31,6 @@ public class ProjectFeatureFlags implements Iterable { } } - /** - *{@inheritDoc Iterable#iterator} - */ @Override public Iterator iterator() { return items.iterator(); @@ -57,6 +54,7 @@ public boolean isEnabled(final String flagName) { /** * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class + * @return list of project feature flags */ @Deprecated public List getItems() { diff --git a/src/main/java/com/gooddata/gdc/FeatureFlags.java b/src/main/java/com/gooddata/gdc/FeatureFlags.java index 2cce6c703..b67883b7e 100644 --- a/src/main/java/com/gooddata/gdc/FeatureFlags.java +++ b/src/main/java/com/gooddata/gdc/FeatureFlags.java @@ -38,6 +38,7 @@ protected void addFlag(final String name, final boolean enabled) { /** * @deprecated use {@link com.gooddata.featureflag.FeatureFlags#isEnabled(String)} method or its {@link Iterable} feature + * @return list of feature flags */ @Deprecated public List getFeatureFlags() { diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 0ead0366d..2bba4f208 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -68,8 +68,10 @@ public String getDirection() { } /** - * @see {@link #isSortedByLinkedDf()}, {@link #isSortedByUsedDf()} and {@link #isSortedByPk()} * @return sort setting - pk, byUsedDF or uri linking some display form, null if not set + * @see #isSortedByLinkedDf() + * @see #isSortedByUsedDf() + * @see #isSortedByPk() */ @JsonIgnore public String getSort() { From db97f2ce9a3b54fd13fefa4c8eed0890996cba70 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 8 Mar 2016 17:08:26 +0100 Subject: [PATCH 0329/1191] [maven-release-plugin] prepare release gooddata-java-1.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 890c4f6a5..d87d7b0cc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.3.2-SNAPSHOT + 1.4.0 ${project.artifactId} GoodData Java SDK From 82ad64e1d6b58af6cd0ce9b630ce648b1aac44a7 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 8 Mar 2016 17:08:27 +0100 Subject: [PATCH 0330/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d87d7b0cc..a473a1531 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.4.0 + 1.4.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From dda65da62e384ce9c448a350cc45730d9f4dfaf1 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 8 Mar 2016 17:26:21 +0100 Subject: [PATCH 0331/1191] Bump version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 165909268..863a4902c 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.3.1 + 1.4.0 ``` From 0d50042da2f0bf2996367ec4cb3715b8f2d44ca6 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 9 Mar 2016 17:47:09 +0100 Subject: [PATCH 0332/1191] Remove extra comments from pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index a473a1531..11601facc 100644 --- a/pom.xml +++ b/pom.xml @@ -148,7 +148,6 @@ - org.sonatype.plugins nexus-staging-maven-plugin 1.6.6 @@ -156,7 +155,6 @@ sonatype-nexus-staging https://oss.sonatype.org/ - true From 736932feed46e56ecfacff8ee510a60eff5dabbb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 9 Mar 2016 23:30:21 +0100 Subject: [PATCH 0333/1191] chg: update coveralls version Hopefully it would bring more readable error messages --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 890c4f6a5..f7b0c30d0 100644 --- a/pom.xml +++ b/pom.xml @@ -202,7 +202,7 @@ org.eluder.coveralls coveralls-maven-plugin - 3.0.1 + 4.1.0 org.jacoco From 5ed523093eb0777716b1f3ea22a437e07cbb57d0 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 10 Mar 2016 13:41:10 +0100 Subject: [PATCH 0334/1191] introduce physical data model md objects --- src/main/java/com/gooddata/md/Column.java | 117 ++++++++++++++++++ src/main/java/com/gooddata/md/Table.java | 92 ++++++++++++++ .../java/com/gooddata/md/TableDataLoad.java | 80 ++++++++++++ src/test/java/com/gooddata/md/ColumnTest.java | 34 +++++ .../com/gooddata/md/TableDataLoadTest.java | 30 +++++ src/test/java/com/gooddata/md/TableTest.java | 32 +++++ src/test/resources/md/column.json | 23 ++++ src/test/resources/md/table.json | 26 ++++ src/test/resources/md/tableDataLoad.json | 22 ++++ 9 files changed, 456 insertions(+) create mode 100644 src/main/java/com/gooddata/md/Column.java create mode 100644 src/main/java/com/gooddata/md/Table.java create mode 100644 src/main/java/com/gooddata/md/TableDataLoad.java create mode 100644 src/test/java/com/gooddata/md/ColumnTest.java create mode 100644 src/test/java/com/gooddata/md/TableDataLoadTest.java create mode 100644 src/test/java/com/gooddata/md/TableTest.java create mode 100644 src/test/resources/md/column.json create mode 100644 src/test/resources/md/table.json create mode 100644 src/test/resources/md/tableDataLoad.json diff --git a/src/main/java/com/gooddata/md/Column.java b/src/main/java/com/gooddata/md/Column.java new file mode 100644 index 000000000..892d28c15 --- /dev/null +++ b/src/main/java/com/gooddata/md/Column.java @@ -0,0 +1,117 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +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; + +/** + * Represents physical data model column. Doesn't implement all fields right now. + * Deserialization only. + */ +@JsonTypeName("column") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public class Column extends AbstractObj implements Queryable { + + public static final String TYPE_PK = "pk"; + public static final String TYPE_INPUT_PK = "inputpk"; + public static final String TYPE_FK = "fk"; + public static final String TYPE_FACT = "fact"; + public static final String TYPE_DISPLAY_FORM = "displayForm"; + + private final Content content; + + private Column(@JsonProperty("meta") Meta meta, @JsonProperty("content")Content content) { + super(meta); + this.content = content; + } + + /** + * @return uri of physical {@link Table} + */ + public String getTableUri() { + return content.getTable(); + } + + /** + * @return type of column, one of pk,inputpk,fk,fact,displayForm or null + */ + public String getType() { + return content.getColumnType(); + } + + /** + * @return name of the column in DB + */ + public String getDBName() { + return content.getColumnDBName(); + } + + /** + * @return true when type is pk, false otherwise + */ + public boolean isPk() { + return TYPE_PK.equals(getType()); + } + + /** + * @return true when type is inputpk, false otherwise + */ + public boolean isInputPk() { + return TYPE_INPUT_PK.equals(getType()); + } + + /** + * @return true when type is fk, false otherwise + */ + public boolean isFk() { + return TYPE_FK.equals(getType()); + } + + /** + * @return true when type is fact, false otherwise + */ + public boolean isFact() { + return TYPE_FACT.equals(getType()); + } + + /** + * @return true when type is pk, false otherwise + */ + public boolean isDisplayForm() { + return TYPE_DISPLAY_FORM.equals(getType()); + } + + + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Content { + private final String table; + private final String columnDBName; + private final String columnType; + + @JsonCreator + private Content(@JsonProperty("table") String table, @JsonProperty("columnDBName") String columnDBName, + @JsonProperty("columnType") String columnType) { + this.table = table; + this.columnDBName = columnDBName; + this.columnType = columnType; + } + + public String getTable() { + return table; + } + + public String getColumnDBName() { + return columnDBName; + } + + public String getColumnType() { + return columnType; + } + } +} diff --git a/src/main/java/com/gooddata/md/Table.java b/src/main/java/com/gooddata/md/Table.java new file mode 100644 index 000000000..c0eb80f86 --- /dev/null +++ b/src/main/java/com/gooddata/md/Table.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +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 java.util.Collection; + +/** + * Represents physical data model table. + * Deserialization only. + */ +@JsonTypeName("table") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public class Table extends AbstractObj implements Queryable { + + private final Content content; + + @JsonCreator + private Table(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + /** + * @return name of the table in DB + */ + public String getDBName() { + return content.getTableDBName(); + } + + /** + * @return collection of {@link TableDataLoad}'s uris, can return null + */ + public Collection getDataLoads() { + return content.getTableDataLoads(); + } + + /** + * @return table weight, can return null + */ + public Integer getWeight() { + return content.getWeight(); + } + + /** + * @return uri of active {@link TableDataLoad}, can return null + */ + public String getActiveDataLoad() { + return content.getActiveDataLoad(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Content { + + private final String tableDBName; + private final String activeDataLoad; + private final Collection tableDataLoads; + private final Integer weight; + + @JsonCreator + private Content(@JsonProperty("tableDBName") String tableDBName, @JsonProperty("activeDataLoad") String activeDataLoad, + @JsonProperty("tableDataLoad") Collection tableDataLoads, @JsonProperty("weight") Integer weight) { + this.tableDBName = tableDBName; + this.activeDataLoad = activeDataLoad; + this.tableDataLoads = tableDataLoads; + this.weight = weight; + } + + public String getTableDBName() { + return tableDBName; + } + + public String getActiveDataLoad() { + return activeDataLoad; + } + + public Collection getTableDataLoads() { + return tableDataLoads; + } + + public Integer getWeight() { + return weight; + } + } +} diff --git a/src/main/java/com/gooddata/md/TableDataLoad.java b/src/main/java/com/gooddata/md/TableDataLoad.java new file mode 100644 index 000000000..d36d13fdf --- /dev/null +++ b/src/main/java/com/gooddata/md/TableDataLoad.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +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; + +/** + * Represents data load of physical table. + * Deserialization only. + */ +@JsonTypeName("tableDataLoad") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +public class TableDataLoad extends AbstractObj implements Queryable { + + public static final String TYPE_FULL = "full"; + public static final String TYPE_INCREMENTAL = "incremental"; + + private final Content content; + + @JsonCreator + private TableDataLoad(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { + super(meta); + this.content = content; + } + + /** + * @return location of load data source + */ + public String getDataSourceLocation() { + return content.getDataSourceLocation(); + } + + /** + * @return true if the type is full, false otherwise + */ + public boolean isFull() { + return TYPE_FULL.equals(getType()); + } + + /** + * @return true if the type is incremental, false otherwise + */ + public boolean isIncremental() { + return TYPE_INCREMENTAL.equals(getType()); + } + + /** + * @return type of the load, one of full,incremental + */ + public String getType() { + return content.getTypeOfLoad(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Content { + + private final String dataSourceLocation; + private final String typeOfLoad; + + @JsonCreator + private Content(@JsonProperty("dataSourceLocation") String dataSourceLocation, @JsonProperty("typeOfLoad") String typeOfLoad) { + this.dataSourceLocation = dataSourceLocation; + this.typeOfLoad = typeOfLoad; + } + + public String getDataSourceLocation() { + return dataSourceLocation; + } + + public String getTypeOfLoad() { + return typeOfLoad; + } + } +} diff --git a/src/test/java/com/gooddata/md/ColumnTest.java b/src/test/java/com/gooddata/md/ColumnTest.java new file mode 100644 index 000000000..a30c234ab --- /dev/null +++ b/src/test/java/com/gooddata/md/ColumnTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class ColumnTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/column.json"); + final Column column = new ObjectMapper().readValue(stream, Column.class); + assertThat(column, is(notNullValue())); + + assertThat(column.getTableUri(), is("/gdc/md/PROJECT_ID/obj/9538")); + assertThat(column.getType(), is("pk")); + assertThat(column.getDBName(), is("id")); + assertThat(column.isPk(), is(true)); + assertThat(column.isInputPk(), is(false)); + assertThat(column.isFk(), is(false)); + assertThat(column.isFact(), is(false)); + assertThat(column.isDisplayForm(), is(false)); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/TableDataLoadTest.java b/src/test/java/com/gooddata/md/TableDataLoadTest.java new file mode 100644 index 000000000..9a3045d3d --- /dev/null +++ b/src/test/java/com/gooddata/md/TableDataLoadTest.java @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class TableDataLoadTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/tableDataLoad.json"); + final TableDataLoad load = new ObjectMapper().readValue(stream, TableDataLoad.class); + assertThat(load, is(notNullValue())); + + assertThat(load.getDataSourceLocation(), is("d_zendesktickets_vehicleview_aaavxfdfgqamowg")); + assertThat(load.getType(), is("incremental")); + assertThat(load.isFull(), is(false)); + assertThat(load.isIncremental(), is(true)); + } + +} \ 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 new file mode 100644 index 000000000..6760a2e16 --- /dev/null +++ b/src/test/java/com/gooddata/md/TableTest.java @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md; + +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class TableTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/table.json"); + final Table table = new ObjectMapper().readValue(stream, Table.class); + assertThat(table, is(notNullValue())); + + assertThat(table.getDBName(), is("d_zendesktickets_vehicleview")); + assertThat(table.getActiveDataLoad(), is("/gdc/md/PROJECT_ID/obj/625412")); + assertThat(table.getDataLoads(), hasItems( + "/gdc/md/PROJECT_ID/obj/625283", + "/gdc/md/PROJECT_ID/obj/625412")); + } + +} \ No newline at end of file diff --git a/src/test/resources/md/column.json b/src/test/resources/md/column.json new file mode 100644 index 000000000..3a1743c79 --- /dev/null +++ b/src/test/resources/md/column.json @@ -0,0 +1,23 @@ +{ + "column" : { + "content" : { + "columnType" : "pk", + "table" : "/gdc/md/PROJECT_ID/obj/9538", + "columnDBName" : "id" + }, + "meta" : { + "author" : "/gdc/account/profile/PROFILE_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/9539", + "tags" : "", + "created" : "2012-08-10 13:06:43", + "identifier" : "col.d_zendesktickets_vehicleview.id", + "deprecated" : "0", + "summary" : "", + "isProduction" : 1, + "title" : "col.d_zendesktickets_vehicleview.id", + "category" : "column", + "updated" : "2012-08-10 13:06:43", + "contributor" : "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/table.json b/src/test/resources/md/table.json new file mode 100644 index 000000000..3fa1c9e26 --- /dev/null +++ b/src/test/resources/md/table.json @@ -0,0 +1,26 @@ +{ + "table": { + "content": { + "tableDataLoad": [ + "/gdc/md/PROJECT_ID/obj/625283", + "/gdc/md/PROJECT_ID/obj/625412" + ], + "activeDataLoad": "/gdc/md/PROJECT_ID/obj/625412", + "tableDBName": "d_zendesktickets_vehicleview" + }, + "meta": { + "author": "/gdc/account/profile/PROFILE_ID", + "uri": "/gdc/md/PROJECT_ID/obj/9538", + "tags": "", + "created": "2012-08-10 13:06:43", + "identifier": "tab.d_zendesktickets_vehicleview", + "deprecated": "0", + "summary": "", + "isProduction": 1, + "title": "tab.d_zendesktickets_vehicleview", + "category": "table", + "updated": "2016-03-10 10:02:08", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file diff --git a/src/test/resources/md/tableDataLoad.json b/src/test/resources/md/tableDataLoad.json new file mode 100644 index 000000000..72883cf03 --- /dev/null +++ b/src/test/resources/md/tableDataLoad.json @@ -0,0 +1,22 @@ +{ + "tableDataLoad" : { + "content" : { + "typeOfLoad" : "incremental", + "dataSourceLocation" : "d_zendesktickets_vehicleview_aaavxfdfgqamowg" + }, + "meta" : { + "author" : "/gdc/account/profile/PROFILE_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/625283", + "tags" : "", + "created" : "2016-03-10 06:53:21", + "identifier" : "atk7vrmubLP1", + "deprecated" : "0", + "summary" : "d_zendesktickets_vehicleview_aaavxfdfgqamowg", + "isProduction" : 1, + "title" : "d_zendesktickets_vehicleview_aaavxfdfgqamowg", + "category" : "tableDataLoad", + "updated" : "2016-03-10 08:06:38", + "contributor" : "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file From c9c04ca160990f4185904272096d4f9e03996b91 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 12 Feb 2016 13:00:46 +0100 Subject: [PATCH 0335/1191] Add support to async etl/pull2 resource --- .../com/gooddata/dataset/BatchFailStatus.java | 54 ----------- .../com/gooddata/dataset/DatasetService.java | 87 +++-------------- .../java/com/gooddata/dataset/FailPart.java | 48 ---------- .../java/com/gooddata/dataset/FailStatus.java | 74 -------------- src/main/java/com/gooddata/dataset/Pull.java | 8 +- .../java/com/gooddata/dataset/PullTask.java | 38 ++++++-- .../com/gooddata/dataset/PullTaskStatus.java | 38 -------- .../java/com/gooddata/dataset/TaskState.java | 4 +- .../gooddata/dataset/BatchFailStatusTest.java | 43 --------- .../gooddata/dataset/DatasetServiceAT.java | 4 +- .../gooddata/dataset/DatasetServiceIT.java | 96 ++----------------- .../com/gooddata/dataset/FailStatusTest.java | 47 --------- .../gooddata/dataset/PullTaskStatusTest.java | 20 ---- .../com/gooddata/dataset/PullTaskTest.java | 2 +- .../resources/dataset/batchFailStatus1.json | 33 ------- .../resources/dataset/batchFailStatus2.json | 9 -- src/test/resources/dataset/failStatus.json | 10 -- .../resources/dataset/failStatusComplex.json | 69 ------------- src/test/resources/dataset/pullTask.json | 6 +- .../resources/dataset/pullTaskStatus.json | 3 - .../dataset/pullTaskStatusError.json | 18 +++- .../resources/dataset/pullTaskStatusOk.json | 7 +- .../dataset/pullTaskStatusRunning.json | 6 ++ 23 files changed, 92 insertions(+), 632 deletions(-) delete mode 100644 src/main/java/com/gooddata/dataset/BatchFailStatus.java delete mode 100644 src/main/java/com/gooddata/dataset/FailPart.java delete mode 100644 src/main/java/com/gooddata/dataset/FailStatus.java delete mode 100644 src/main/java/com/gooddata/dataset/PullTaskStatus.java delete mode 100644 src/test/java/com/gooddata/dataset/BatchFailStatusTest.java delete mode 100644 src/test/java/com/gooddata/dataset/FailStatusTest.java delete mode 100644 src/test/java/com/gooddata/dataset/PullTaskStatusTest.java delete mode 100755 src/test/resources/dataset/batchFailStatus1.json delete mode 100644 src/test/resources/dataset/batchFailStatus2.json delete mode 100644 src/test/resources/dataset/failStatus.json delete mode 100644 src/test/resources/dataset/failStatusComplex.json delete mode 100644 src/test/resources/dataset/pullTaskStatus.json create mode 100644 src/test/resources/dataset/pullTaskStatusRunning.json diff --git a/src/main/java/com/gooddata/dataset/BatchFailStatus.java b/src/main/java/com/gooddata/dataset/BatchFailStatus.java deleted file mode 100644 index 924c9cad6..000000000 --- a/src/main/java/com/gooddata/dataset/BatchFailStatus.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.dataset; - -import com.fasterxml.jackson.annotation.JsonCreator; -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; -import com.gooddata.util.GDDateTimeDeserializer; -import com.gooddata.util.GDDateTimeSerializer; - -import org.joda.time.DateTime; - -import java.util.List; - -/** - * Batch fail status of dataset load. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class BatchFailStatus { - - private final List failStatuses; - private final List messages; - private final String status; - private final DateTime date; - - @JsonCreator - private BatchFailStatus(@JsonProperty("uploads") List failStatuses, @JsonProperty("messages") List messages, - @JsonProperty("status") String status, @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date) { - this.failStatuses = failStatuses; - this.messages = messages; - this.status = status; - this.date = date; - } - - public List getFailStatuses() { - return failStatuses; - } - - public List getMessages() { - return messages; - } - - public String getStatus() { - return status; - } - - @JsonSerialize(using = GDDateTimeSerializer.class) - public DateTime getDate() { - return date; - } -} diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 9332208b4..4424625e8 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -9,7 +9,6 @@ import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.SimplePollHandler; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; import com.gooddata.gdc.TaskStatus; @@ -44,7 +43,7 @@ public class DatasetService extends AbstractService { private static final String MANIFEST_FILE_NAME = "upload_info.json"; - private static final String STATUS_FILE_NAME = "upload_status.json"; + private static final String ETL_PULL_DEFAULT_ERROR_MESSAGE = "ETL Pull failed with status %s"; private final DataStoreService dataStoreService; @@ -102,7 +101,7 @@ public FutureResult loadDataset(final Project project, final DatasetManife final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); - return pullLoad(project, dirPath, manifest.getDataSet(), false); + return pullLoad(project, dirPath, manifest.getDataSet()); } catch (IOException e) { throw new DatasetException("Unable to serialize manifest", manifest.getDataSet(), e); } catch (DataStoreException | GoodDataRestException | RestClientException e) { @@ -157,7 +156,7 @@ public FutureResult loadDatasets(final Project project, final Collection datasets) } } - private FutureResult pullLoad(Project project, final Path dirPath, final String dataset, boolean isBatchUpload) { - return pullLoad(project, dirPath, singletonList(dataset), isBatchUpload); + private FutureResult pullLoad(Project project, final Path dirPath, final String dataset) { + return pullLoad(project, dirPath, singletonList(dataset)); } - private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets, final boolean isBatchUpload) { + private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets) { final PullTask pullTask = restTemplate .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); - return new PollResult<>(this, new SimplePollHandler(pullTask.getUri(), Void.class) { + + return new PollResult<>(this, new AbstractPollHandler(pullTask.getPollUri(), TaskStatus.class, Void.class) { @Override - public boolean isFinished(ClientHttpResponse response) throws IOException { - final PullTaskStatus status = extractData(response, PullTaskStatus.class); - final boolean finished = status.isFinished(); - if (finished && !status.isSuccess()) { - final String message = getErrorMessage(status, dirPath, isBatchUpload); + public void handlePollResult(TaskStatus pollResult) { + if (!pollResult.isSuccess()) { + final String message = isEmpty(pollResult.getMessages()) + ? String.format(ETL_PULL_DEFAULT_ERROR_MESSAGE, pollResult.getStatus()) + : pollResult.getMessages().toString(); throw new DatasetException(message, datasets); } - return finished; + setResult(null); } @Override @@ -213,65 +213,6 @@ protected void onFinish() { } } }); - - } - - private String getErrorMessage(final PullTaskStatus status, final Path dirPath, boolean isBatchUpload) { - String message = "status: " + status.getStatus(); - try { - Path statusFile = dirPath.resolve(STATUS_FILE_NAME); - if (isBatchUpload) { - final BatchFailStatus batchFailStatus = download(statusFile, BatchFailStatus.class); - message = getBatchFailStatusErrorMsg(dirPath, message, batchFailStatus); - } else { - final FailStatus failStatus = download(statusFile, FailStatus.class); - message = getFailStatusErrorMsg(dirPath, message, failStatus); - } - } catch (IOException | DataStoreException ignored) { - // todo log? - } - return message; - } - - private String getBatchFailStatusErrorMsg(final Path dirPath, final String defaultMessage, final BatchFailStatus batchFailStatus) { - if (batchFailStatus == null || batchFailStatus.getFailStatuses() == null) { - return defaultMessage; - } - final List messages = new ArrayList<>(); - for (FailStatus failStatus : batchFailStatus.getFailStatuses()) { - messages.add(getFailStatusErrorMsg(dirPath, defaultMessage, failStatus)); - } - return messages.isEmpty() ? defaultMessage : messages.toString(); - } - - private String getFailStatusErrorMsg(final Path dirPath, final String defaultMessage, final FailStatus failStatus) { - if (failStatus == null) { - return defaultMessage; - } - final List errorParts = failStatus.getErrorParts(); - if (errorParts.isEmpty()){ - return (failStatus.getError() != null) ? failStatus.getError().getFormattedMessage() : defaultMessage; - } - final List errors = new ArrayList<>(); - for (FailPart part : errorParts) { - if (part.getLogName() != null) { - try { - final String[] msg = download(dirPath.resolve(part.getLogName()), String[].class); - errors.addAll(asList(msg)); - } catch (IOException | DataStoreException e) { - if (part.getError() != null) { - errors.add(part.getError().getFormattedMessage()); - } - } - } - } - return errors.toString(); - } - - private T download(final Path path, final Class type) throws IOException { - try (final InputStream input = dataStoreService.download(path.toString())) { - return mapper.readValue(input, type); - } } /** diff --git a/src/main/java/com/gooddata/dataset/FailPart.java b/src/main/java/com/gooddata/dataset/FailPart.java deleted file mode 100644 index b5fb688b5..000000000 --- a/src/main/java/com/gooddata/dataset/FailPart.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gooddata.dataset; - -import com.gooddata.gdc.ErrorStructure; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * Describe status of uploaded parts - */ -public class FailPart { - - private final String logName; - private final String fileName; - private final String status; - private final String tableName; - private final ErrorStructure error; - - @JsonCreator - private FailPart(@JsonProperty("logName") String logName, @JsonProperty("fileName") String fileName, - @JsonProperty("status") String status, @JsonProperty("tableName") String tableName, - @JsonProperty("error") ErrorStructure error) { - this.logName = logName; - this.fileName = fileName; - this.status = status; - this.tableName = tableName; - this.error = error; - } - - public String getLogName() { - return logName; - } - - public String getFileName() { - return fileName; - } - - public String getStatus() { - return status; - } - - public String getTableName() { - return tableName; - } - - public ErrorStructure getError() { - return error; - } -} diff --git a/src/main/java/com/gooddata/dataset/FailStatus.java b/src/main/java/com/gooddata/dataset/FailStatus.java deleted file mode 100644 index 9f503f768..000000000 --- a/src/main/java/com/gooddata/dataset/FailStatus.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.gooddata.dataset; - -import com.gooddata.gdc.ErrorStructure; -import com.gooddata.util.GDDateTimeDeserializer; -import com.gooddata.util.GDDateTimeSerializer; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -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; -import org.joda.time.DateTime; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * Fail status of dataset load. - * Deserialization only. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class FailStatus { - - private final String status; - private final DateTime date; - private final ErrorStructure error; - private final List parts; - - @JsonCreator - private FailStatus(@JsonProperty("status") String status, - @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date, - @JsonProperty("error") ErrorStructure error, @JsonProperty("parts") List parts) { - this.status = status; - this.date = date; - this.error = error; - this.parts = parts; - } - - public String getStatus() { - return status; - } - - @JsonSerialize(using = GDDateTimeSerializer.class) - public DateTime getDate() { - return date; - } - - public ErrorStructure getError() { - return error; - } - - /** - * - * @return or null - */ - public List getParts() { - return parts; - } - - @JsonIgnore - public List getErrorParts() { - if (parts == null) { - return Collections.emptyList(); - } - final List result = new ArrayList<>(parts.size()); - for (FailPart part: parts) { - if ("ERROR".equals(part.getStatus())) { - result.add(part); - } - } - return result; - } -} diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index 64c3a14f1..bb3629e9f 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -5,15 +5,17 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.web.util.UriTemplate; /** - * ETL Pull DTO (for internal use). + * ETL Pull input DTO (for internal use). * Serialization only. */ @JsonInclude(JsonInclude.Include.NON_NULL) -public class Pull { +class Pull { - public static final String URI = "/gdc/md/{projectId}/etl/pull"; + public static final String URI = "/gdc/md/{projectId}/etl/pull2"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); @JsonProperty("pullIntegration") private final String remoteDir; diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index f11bb11c3..b69787f8f 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -3,31 +3,51 @@ */ package com.gooddata.dataset; +import static com.gooddata.util.Validate.notEmpty; +import static org.apache.commons.lang.Validate.notNull; + 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 org.springframework.web.util.UriTemplate; /** - * ETL Pull task (for internal use). + * Asynchronous ETL Pull 2 task (for internal use). * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("pullTask") +@JsonTypeName("pull2Task") @JsonIgnoreProperties(ignoreUnknown = true) -public class PullTask { +class PullTask { - public static final String URI = "/gdc/md/{projectId}/etl/task/{taskId}"; + public static final String URI = "/gdc/md/{projectId}/tasks/task/{taskId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); - private final String uri; + private final Links links; @JsonCreator - private PullTask(@JsonProperty("uri") String uri) { - this.uri = uri; + private PullTask(@JsonProperty("links") Links links) { + notNull(links, "links cannot be null!"); + + this.links = links; + } + + public String getPollUri() { + return links.uri; } - public String getUri() { - return uri; + @JsonIgnoreProperties(ignoreUnknown = true) + private static class Links { + + private final String uri; + + @JsonCreator + private Links(@JsonProperty("poll") String uri) { + notEmpty(uri, "uri"); + + this.uri = uri; + } } } diff --git a/src/main/java/com/gooddata/dataset/PullTaskStatus.java b/src/main/java/com/gooddata/dataset/PullTaskStatus.java deleted file mode 100644 index bafcd69b4..000000000 --- a/src/main/java/com/gooddata/dataset/PullTaskStatus.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.dataset; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; - -/** - * ETL Pull task status (for internal use). - * Deserialization only. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class PullTaskStatus { - - private static final String OK = "OK"; - private static final String ERROR = "ERROR"; - private static final String WARNING = "WARNING"; - private final String status; - - @JsonCreator - private PullTaskStatus(@JsonProperty("taskStatus") String status) { - this.status = status; - } - - public String getStatus() { - return status; - } - - public boolean isSuccess() { - return OK.equals(status); - } - - public boolean isFinished() { - return OK.equals(status) || ERROR.equals(status) || WARNING.equals(status); - } -} diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java index 8b3c21f40..02b734850 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -12,14 +12,14 @@ import com.fasterxml.jackson.annotation.JsonTypeName; /** - * ETL Pull task status (for internal use). + * Update Project Data task status (for internal use). * Deserialization only. */ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonTypeName("taskState") @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class TaskState { +class TaskState { private static final String OK = "OK"; private static final String ERROR = "ERROR"; diff --git a/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java b/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java deleted file mode 100644 index 705397fa0..000000000 --- a/src/test/java/com/gooddata/dataset/BatchFailStatusTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.dataset; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.hamcrest.Matchers; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.testng.annotations.Test; - -import java.io.IOException; -import java.io.InputStream; - -public class BatchFailStatusTest { - @Test - public void testParser() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/batchFailStatus1.json"); - final BatchFailStatus value = new ObjectMapper().readValue(stream, BatchFailStatus.class); - assertThat(value, is(notNullValue())); - assertThat(value.getStatus(),is("ERROR")); - assertThat(value.getMessages(),is(Matchers.empty())); - assertThat(value.getDate(),is(new DateTime(2016,2,1,10,12,9, DateTimeZone.UTC))); - assertThat(value.getFailStatuses(),hasSize(2)); - } - - @Test - public void testParser2() throws IOException { - final InputStream stream = getClass().getResourceAsStream("/dataset/batchFailStatus2.json"); - final BatchFailStatus value = new ObjectMapper().readValue(stream, BatchFailStatus.class); - assertThat(value,is(notNullValue())); - assertThat(value.getStatus(),is("ERROR")); - assertThat(value.getMessages(),containsInAnyOrder("test1","test2")); - assertThat(value.getDate(),is(new DateTime(2016,1,1,10,11,15, DateTimeZone.UTC))); - assertThat(value.getFailStatuses(),is(Matchers.empty())); - } -} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index 42dde60c4..c875dbb43 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -48,7 +48,7 @@ public void loadDatasetFail(){ datasetService.loadDataset(project, manifest, getClass().getResourceAsStream("/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 corespond on line 3 in dataset.person.csv]"))); } } @@ -65,7 +65,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, 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 corespond on line 3 in dataset.person.csv]"))); } } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 1e43fac44..1b6b9d7af 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -16,7 +16,6 @@ import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -54,7 +53,7 @@ public void setUp() throws Exception { .respond() .withStatus(200); onRequest() - .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/pull") + .havingPathEqualTo("/gdc/md/PROJECT_ID/etl/pull2") .havingMethodEqualTo("POST") .respond() .withStatus(201) @@ -64,10 +63,10 @@ public void setUp() throws Exception { @Test public void shouldLoadDataset() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .havingPathEqualTo("/gdc/md/PROJECT/tasks/task/ID/status") .respond() .withStatus(202) - .withBody(readFromResource("/dataset/pullTask.json")) + .withBody(readFromResource("/dataset/pullTaskStatusRunning.json")) .thenRespond() .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); @@ -79,10 +78,10 @@ public void shouldLoadDataset() throws Exception { @Test public void shouldLoadDatasets() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .havingPathEqualTo("/gdc/md/PROJECT/tasks/task/ID/status") .respond() .withStatus(202) - .withBody(readFromResource("/dataset/pullTask.json")) + .withBody(readFromResource("/dataset/pullTaskStatusRunning.json")) .thenRespond() .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); @@ -98,7 +97,7 @@ public void shouldLoadDatasets() throws Exception { @Test(expectedExceptions = DatasetException.class, expectedExceptionsMessageRegExp = ".*dataset.person.*Unable to load.*") public void shouldFailPolling() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .havingPathEqualTo("/gdc/md/PROJECT/tasks/task/ID/status") .respond() .withStatus(400); @@ -109,7 +108,7 @@ public void shouldFailPolling() throws Exception { @Test public void shouldFailLoading() throws Exception { onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") + .havingPathEqualTo("/gdc/md/PROJECT/tasks/task/ID/status") .respond() .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusError.json")); @@ -118,36 +117,7 @@ public void shouldFailLoading() throws Exception { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: status: ERROR")); - } - } - - @Test - public void shouldReadErrorMessages() throws Exception { - onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/pullTaskStatusError.json")); - onRequest() - .havingPath(containsString("upload_status.json")) - .havingMethodEqualTo("GET") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/failStatusComplex.json")); - onRequest() - .havingPath(containsString("d_adstpch_querynum.csv.log")) - .havingMethodEqualTo("GET") - .respond() - .withStatus(200) - .withBody(MAPPER.writeValueAsString(new String[]{"Very error indeed"})); - - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); - try { - gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); - fail("Exception should be thrown"); - } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: [Very error indeed, 1 errors occured during csv import]")); + assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: [status: ERROR. Missing field [attr.person.age]]")); } } @@ -280,54 +250,4 @@ public void shouldFailUpdateProjectData() throws IOException { gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); } - - @Test - public void shouldReadBatchErrorMessages() throws Exception { - onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/pullTaskStatusError.json")); - onRequest() - .havingPath(containsString("upload_status.json")) - .havingMethodEqualTo("GET") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/batchFailStatus1.json")); - - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); - final InputStream source = new ByteArrayInputStream(new byte[]{}); - manifest.setSource(source); - try { - gd.getDatasetService().loadDatasets(project, manifest).get(); - fail("Exception should be thrown"); - } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: [Manifest consist of columns that are not in single CSV file dataset.stats.csv: f_competitors.nm_name., Manifest consist of columns that are not in single CSV file dataset.stats.csv: f_competitors.nm_name.]")); - } - } - - @Test - public void shouldReadBatchErrorMessagesNoFailStatuses() throws Exception { - onRequest() - .havingPathEqualTo("/gdc/md/PROJECT/etl/task/ID") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/pullTaskStatusError.json")); - onRequest() - .havingPath(containsString("upload_status.json")) - .havingMethodEqualTo("GET") - .respond() - .withStatus(200) - .withBody(readFromResource("/dataset/batchFailStatus2.json")); - - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); - final InputStream source = new ByteArrayInputStream(new byte[]{}); - manifest.setSource(source); - try { - gd.getDatasetService().loadDatasets(project, manifest).get(); - fail("Exception should be thrown"); - } catch (DatasetException e) { - assertThat(e.getMessage(), is("Load datasets [dataset.person] failed: status: ERROR")); - } - } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/FailStatusTest.java b/src/test/java/com/gooddata/dataset/FailStatusTest.java deleted file mode 100644 index f9ce811a4..000000000 --- a/src/test/java/com/gooddata/dataset/FailStatusTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gooddata.dataset; - -import com.gooddata.gdc.ErrorStructure; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.testng.annotations.Test; - -import java.io.InputStream; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; - -public class FailStatusTest { - - @Test - public void testDeserialize() throws Exception { - - final InputStream stream = getClass().getResourceAsStream("/dataset/failStatus.json"); - final FailStatus value = new ObjectMapper().readValue(stream, FailStatus.class); - - assertThat(value, is(notNullValue())); - assertThat(value.getStatus(), is("ERROR")); - assertThat(value.getDate(), is(new DateTime(2014, 4, 21, 0, 11, 34, DateTimeZone.UTC))); - - final ErrorStructure error = value.getError(); - assertThat(error, is(notNullValue())); - } - - @Test - public void testDeserializeComplex() throws Exception { - - final InputStream stream = getClass().getResourceAsStream("/dataset/failStatusComplex.json"); - final FailStatus value = new ObjectMapper().readValue(stream, FailStatus.class); - - assertThat(value, is(notNullValue())); - assertThat(value.getStatus(), is("ERROR")); - assertThat(value.getDate(), is(new DateTime(2014, 11, 11, 22, 25, 11, DateTimeZone.UTC))); - - final ErrorStructure error = value.getError(); - assertThat(error, is(notNullValue())); - - assertThat(value.getErrorParts(), hasSize(2)); - } -} diff --git a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java b/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java deleted file mode 100644 index 5ebc3aafd..000000000 --- a/src/test/java/com/gooddata/dataset/PullTaskStatusTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gooddata.dataset; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; - -public class PullTaskStatusTest { - - @Test - public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/pullTaskStatus.json"); - final PullTaskStatus taskStatus = new ObjectMapper().readValue(stream, PullTaskStatus.class); - - assertThat(taskStatus.getStatus(), is("WARNING")); - } -} diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index d4c3761e1..2c9058fc1 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -15,6 +15,6 @@ public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataset/pullTask.json"); final PullTask task = new ObjectMapper().readValue(stream, PullTask.class); - assertThat(task.getUri(), is("/gdc/md/PROJECT/etl/task/ID")); + assertThat(task.getPollUri(), is("/gdc/md/PROJECT/tasks/task/ID/status")); } } diff --git a/src/test/resources/dataset/batchFailStatus1.json b/src/test/resources/dataset/batchFailStatus1.json deleted file mode 100755 index cb135ab94..000000000 --- a/src/test/resources/dataset/batchFailStatus1.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "uploads" : [ - { - "date" : "2016-02-01 10:12:09", - "status" : "ERROR", - "error" : { - "parameters" : [ - "dataset.stats.csv", - "f_competitors.nm_name" - ], - "component" : "GDC::SliToDli", - "errorClass" : "GDC::Exception::User", - "message" : "Manifest consist of columns that are not in single CSV file %s: %s." - } - }, - { - "date" : "2016-02-01 10:12:09", - "status" : "ERROR", - "error" : { - "parameters" : [ - "dataset.stats.csv", - "f_competitors.nm_name" - ], - "component" : "GDC::SliToDli", - "errorClass" : "GDC::Exception::User", - "message" : "Manifest consist of columns that are not in single CSV file %s: %s." - } - } - ], - "messages" : [], - "status" : "ERROR", - "date" : "2016-02-01 10:12:09" -} \ No newline at end of file diff --git a/src/test/resources/dataset/batchFailStatus2.json b/src/test/resources/dataset/batchFailStatus2.json deleted file mode 100644 index e789a3157..000000000 --- a/src/test/resources/dataset/batchFailStatus2.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "uploads": [], - "messages": [ - "test1", - "test2" - ], - "status": "ERROR", - "date": "2016-01-01 10:11:15" -} \ No newline at end of file diff --git a/src/test/resources/dataset/failStatus.json b/src/test/resources/dataset/failStatus.json deleted file mode 100644 index 9b59d7b30..000000000 --- a/src/test/resources/dataset/failStatus.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "status" : "ERROR", - "date" : "2014-04-21 00:11:34", - "error" : { - "parameters" : [], - "component" : "GDC::SliToDli", - "errorClass" : "GDC::Exception::User", - "message" : "Manifest consist of columns that aren't in a single CSV file: f_person.nm_name" - } -} diff --git a/src/test/resources/dataset/failStatusComplex.json b/src/test/resources/dataset/failStatusComplex.json deleted file mode 100644 index 38d6a67f3..000000000 --- a/src/test/resources/dataset/failStatusComplex.json +++ /dev/null @@ -1,69 +0,0 @@ - -{ - "status" : "ERROR", - "date" : "2014-11-11 22:25:11", - "parts" : [ - { - "fileName" : "f_adstpch.csv", - "status" : "OK", - "tableName" : "f_adstpch_aajqnzc4m1apxf8" - }, - { - "fileName" : "d_adstpch_name.csv", - "status" : "OK", - "tableName" : "d_adstpch_name_aajrnzc4m1apxf8" - }, - { - "logName" : "d_adstpch_querynum.csv.log", - "fileName" : "d_adstpch_querynum.csv", - "status" : "ERROR", - "error" : { - "parameters" : [ - 1 - ], - "component" : "GDC::DB2::ETL", - "errorClass" : "GDC::Exception::User", - "message" : "%s errors occured during csv import" - }, - "tableName" : "d_adstpch_querynum_aajsnzc4m1apxf8" - }, - { - "fileName" : "d_adstpch_jdbcuri.csv", - "status" : "OK", - "tableName" : "d_adstpch_jdbcuri_aajtnzc4m1apxf8" - }, - { - "fileName" : "d_adstpch_parallel.csv", - "status" : "OK", - "tableName" : "d_adstpch_parallel_aajunzc4m1apxf8" - }, - { - "logName" : "d_adstpch_repeat.csv.log", - "fileName" : "d_adstpch_repeat.csv", - "status" : "ERROR", - "error" : { - "parameters" : [ - 1 - ], - "component" : "GDC::DB2::ETL", - "errorClass" : "GDC::Exception::User", - "message" : "%s errors occured during csv import" - }, - "tableName" : "d_adstpch_repeat_aajvnzc4m1apxf8" - }, - { - "fileName" : "d_adstpch_size.csv", - "status" : "OK", - "tableName" : "d_adstpch_size_aajwnzc4m1apxf8" - } - ], - "error" : { - "parameters" : [ - 2, - 7 - ], - "component" : "GDC::DB2::ETL", - "errorClass" : "GDC::Exception::User", - "message" : "%d of %d parts failed" - } -} diff --git a/src/test/resources/dataset/pullTask.json b/src/test/resources/dataset/pullTask.json index da0f26196..08ee53a81 100644 --- a/src/test/resources/dataset/pullTask.json +++ b/src/test/resources/dataset/pullTask.json @@ -1,5 +1,7 @@ { - "pullTask" : { - "uri" : "/gdc/md/PROJECT/etl/task/ID" + "pull2Task" : { + "links" : { + "poll": "/gdc/md/PROJECT/tasks/task/ID/status" + } } } diff --git a/src/test/resources/dataset/pullTaskStatus.json b/src/test/resources/dataset/pullTaskStatus.json deleted file mode 100644 index 49ff8265b..000000000 --- a/src/test/resources/dataset/pullTaskStatus.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "taskStatus" : "WARNING" -} diff --git a/src/test/resources/dataset/pullTaskStatusError.json b/src/test/resources/dataset/pullTaskStatusError.json index 24f0679bd..964f7d9cd 100644 --- a/src/test/resources/dataset/pullTaskStatusError.json +++ b/src/test/resources/dataset/pullTaskStatusError.json @@ -1,3 +1,17 @@ { - "taskStatus" : "ERROR" -} + "wTaskStatus": { + "messages": [ + { + "error": { + "parameters": ["ERROR", "[attr.person.age]"], + "requestId": "REQUEST_ID", + "component": "GDC::ETL::PULL2", + "errorClass": "GDC::Exception::EtlFailed", + "message": "status: %s. Missing field %s" + } + } + ], + "poll": "/gdc/md/PROJECT_ID/tasks/task/ID/status", + "status": "ERROR" + } +} \ No newline at end of file diff --git a/src/test/resources/dataset/pullTaskStatusOk.json b/src/test/resources/dataset/pullTaskStatusOk.json index 2333f8b6b..24e561efd 100644 --- a/src/test/resources/dataset/pullTaskStatusOk.json +++ b/src/test/resources/dataset/pullTaskStatusOk.json @@ -1,3 +1,6 @@ { - "taskStatus" : "OK" -} + "wTaskStatus": { + "poll": "/gdc/md/PROJECT_ID/task/tasks/ID/status", + "status": "OK" + } +} \ No newline at end of file diff --git a/src/test/resources/dataset/pullTaskStatusRunning.json b/src/test/resources/dataset/pullTaskStatusRunning.json new file mode 100644 index 000000000..cfebe7487 --- /dev/null +++ b/src/test/resources/dataset/pullTaskStatusRunning.json @@ -0,0 +1,6 @@ +{ + "wTaskStatus": { + "poll": "/gdc/md/PROJECT_ID/task/tasks/ID/status", + "status": "RUNNING" + } +} \ No newline at end of file From 2f42358e5096b3bc7883de2b3c1e83c883c9c523 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 14 Mar 2016 08:56:49 +0100 Subject: [PATCH 0336/1191] deserialize metric with folder close: #289 --- src/main/java/com/gooddata/md/Fact.java | 4 + src/main/java/com/gooddata/md/Metric.java | 19 +++- .../java/com/gooddata/md/NestedAttribute.java | 4 + src/test/java/com/gooddata/md/MetricTest.java | 8 ++ src/test/resources/md/metric-folder.json | 95 +++++++++++++++++++ 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/md/metric-folder.json diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 886195312..f9c7f2757 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -42,6 +42,10 @@ public Collection getExpressions() { return content.getExpression(); } + /** + * URIs of folders containing this object + * @return collection of URIs or null + */ @JsonIgnore public Collection getFolders() { return content.getFolders(); diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index c7cb40a98..e0a25522d 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -10,6 +10,8 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import java.util.Collection; + /** * Metric */ @@ -46,6 +48,15 @@ public MaqlAst getMaqlAst() { return content.getMaqlAst(); } + /** + * URIs of folders containing this object + * @return collection of URIs or null + */ + @JsonIgnore + public Collection getFolders() { + return content.getFolders(); + } + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { @@ -57,15 +68,18 @@ private static class Content { @JsonProperty("tree") private MaqlAst maqlAst; + private final Collection folders; @JsonCreator - public Content(@JsonProperty("expression") String expression) { + public Content(@JsonProperty("expression") String expression, @JsonProperty("folders") Collection folders) { this.expression = expression; + this.folders = folders; } public Content(final String expression, final String format) { this.expression = expression; this.format = format; + this.folders = null; } public String getExpression() { @@ -88,5 +102,8 @@ public MaqlAst getMaqlAst() { return maqlAst; } + public Collection getFolders() { + return folders; + } } } diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 2bba4f208..d8835db97 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -127,6 +127,10 @@ public String getLinkedDisplayFormLink() { return content.getLinkedDisplayFormLink(); } + /** + * URIs of folders containing this object + * @return collection of URIs or null + */ @JsonIgnore public Collection getFolders() { return content.getFolders(); diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 84d4b24c5..ba63fd291 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; public class MetricTest { @@ -26,6 +27,13 @@ public void testDeserialization() throws Exception { assertThat(metric.getMaqlAst().getContent().length, is(1)); } + @Test + public void shouldDeserializeFolder() throws Exception { + final Metric metric = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/metric-folder.json"), Metric.class); + assertThat(metric.getFolders(), contains("/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/51430")); + } + @Test public void testSerialization() throws Exception { final Metric metric = new Metric("Person Name", "SELECT SUM([/gdc/md/PROJECT_ID/obj/EXPR_ID])", "FORMAT"); diff --git a/src/test/resources/md/metric-folder.json b/src/test/resources/md/metric-folder.json new file mode 100644 index 000000000..dd6548c8e --- /dev/null +++ b/src/test/resources/md/metric-folder.json @@ -0,0 +1,95 @@ +{ + "metric": { + "content": { + "folders": [ + "/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/51430" + ], + "format": "$#,##0.00", + "tree": { + "content": [ + { + "content": [ + { + "value": "SUM", + "content": [ + { + "value": "/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1144", + "position": { + "column": 12, + "line": 2 + }, + "type": "fact object" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "function" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "expression" + }, + { + "content": [ + { + "content": [ + { + "value": "/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1147", + "position": { + "column": 71, + "line": 2 + }, + "type": "fact object" + }, + { + "value": "/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1275", + "position": { + "column": 123, + "line": 2 + }, + "type": "metric object" + } + ], + "position": { + "column": 122, + "line": 2 + }, + "type": "=" + } + ], + "position": { + "column": 65, + "line": 2 + }, + "type": "where" + } + ], + "position": { + "column": 1, + "line": 2 + }, + "type": "metric" + }, + "expression": "SELECT SUM([/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1144]) where [/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1147]=[/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1275]" + }, + "meta": { + "author": "/gdc/account/profile/876ec68f5630b38de65852ed5d6236ff", + "uri": "/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/1279", + "tags": "", + "created": "2016-03-14 04:35:30", + "identifier": "ah1EuQxwaCqs", + "deprecated": "0", + "summary": "A sum of all deals, regardless of stage or status.", + "isProduction": 1, + "title": "Amount", + "category": "metric", + "updated": "2016-03-14 04:35:30", + "contributor": "/gdc/account/profile/876ec68f5630b38de65852ed5d6236ff" + } + } +} From c7bb047913b1068219032df298564933b44fff34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Tos=CC=8Covsky=CC=81?= Date: Fri, 11 Mar 2016 16:23:47 +0100 Subject: [PATCH 0337/1191] Metric.MaqlAst.content is serialized as 'absent' instead of null Fix the problem when Metric is created and later updated by MetadataService. In case that Metric is created the Metric.MaqlAst.content might be null in some cases which leads to failed call (400 MD server response) during update. --- src/main/java/com/gooddata/md/MaqlAst.java | 3 ++- src/test/java/com/gooddata/JsonMatchers.java | 23 ++++++++++--------- src/test/java/com/gooddata/md/MetricTest.java | 17 +++++++++++--- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java index 745beed1a..49462cc55 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -4,12 +4,13 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; /** * MAQL AST representation */ +@JsonInclude(JsonInclude.Include.NON_NULL) public class MaqlAst { private final String type; diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index 0206e1060..a45fee411 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -1,21 +1,22 @@ package com.gooddata; -import net.javacrumbs.jsonunit.core.Configuration; -import net.javacrumbs.jsonunit.core.internal.Diff; -import com.fasterxml.jackson.databind.ObjectMapper; +import static java.lang.String.format; +import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER; +import static net.javacrumbs.jsonunit.core.internal.Diff.create; + +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Paths; + import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Factory; import org.hamcrest.Matcher; -import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Paths; +import com.fasterxml.jackson.databind.ObjectMapper; -import static java.lang.String.format; -import static net.javacrumbs.jsonunit.core.Option.IGNORING_ARRAY_ORDER; -import static net.javacrumbs.jsonunit.core.Option.TREATING_NULL_AS_ABSENT; -import static net.javacrumbs.jsonunit.core.internal.Diff.create; +import net.javacrumbs.jsonunit.core.Configuration; +import net.javacrumbs.jsonunit.core.internal.Diff; /** * Contains Hamcrest matchers to be used with Hamcrest assertThat and other tools. @@ -81,7 +82,7 @@ public boolean matches(final Object actual) { } this.expectedJsonString = expectedJsonString; - final Diff diff = create(expectedJsonString, actual, "fullJson", "", Configuration.empty().withOptions(TREATING_NULL_AS_ABSENT, IGNORING_ARRAY_ORDER)); + final Diff diff = create(expectedJsonString, actual, "fullJson", "", Configuration.empty().withOptions(IGNORING_ARRAY_ORDER)); if (!diff.similar()) { differences = diff.differences(); } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 84d4b24c5..b49f9bda9 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -3,14 +3,17 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - import static com.gooddata.JsonMatchers.serializesToJson; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonNodeAbsent; 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 org.testng.annotations.Test; + +import com.fasterxml.jackson.databind.ObjectMapper; + public class MetricTest { @Test @@ -24,6 +27,12 @@ public void testDeserialization() throws Exception { assertThat(metric.getMaqlAst().getPosition().getColumn(), is(1)); assertThat(metric.getMaqlAst().getType(), is("metric")); assertThat(metric.getMaqlAst().getContent().length, is(1)); + assertThat(metric.getMaqlAst().getContent()[0].getContent().length, is(1)); + assertThat(metric.getMaqlAst().getContent()[0].getContent()[0].getValue(), is("AVG")); + assertThat(metric.getMaqlAst().getContent()[0].getContent()[0].getContent().length, is(1)); + assertThat(metric.getMaqlAst().getContent()[0].getContent()[0].getContent()[0].getValue(), + is("/gdc/md/PROJECT_ID/obj/EXPR_ID")); + assertThat(metric.getMaqlAst().getContent()[0].getContent()[0].getContent()[0].getContent(), nullValue()); } @Test @@ -36,6 +45,8 @@ public void testSerialization() throws Exception { public void fullJsonShouldStayTheSameAfterDeserializationAndSerializationBack() throws Exception { final Metric metric = new ObjectMapper() .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + + assertThat(metric, jsonNodeAbsent("metric.content.tree.content[0].content[0].content[0].content")); assertThat(metric, serializesToJson("/md/metric-out.json")); } } \ No newline at end of file From a4baac294292aeae6d08cd29aec01fbe338d1afe Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 14 Mar 2016 10:51:24 +0100 Subject: [PATCH 0338/1191] Remove projectToken from ProjectServiceAT --- src/test/java/com/gooddata/project/ProjectServiceAT.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index e446aa420..a881186c7 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -23,8 +23,6 @@ */ public class ProjectServiceAT extends AbstractGoodDataAT { - private final String projectToken; - public ProjectServiceAT() { projectToken = getProperty("projectToken"); } From f62990b6c3283fe124130cf785414952fc95d227 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 14 Mar 2016 14:06:57 +0100 Subject: [PATCH 0339/1191] Modify FeatureFlagServiceAT To cope with eventual consistency of API --- .../featureflag/FeatureFlagServiceAT.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 64e7676df..4330ca014 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -11,9 +11,7 @@ import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.*; import static org.testng.AssertJUnit.fail; /** @@ -22,22 +20,25 @@ public class FeatureFlagServiceAT extends AbstractGoodDataAT { private static final String PROJECT_FEATURE_FLAG = "testFeatureFlag"; + private static final String SECOND_FEATURE_FLAG = "mostRecentFeatureFlag"; @Test(groups = "featureFlag", dependsOnGroups = "project") public void createProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = gd.getFeatureFlagService() .createProjectFeatureFlag(project, new ProjectFeatureFlag(PROJECT_FEATURE_FLAG)); - checkProjectFeatureFlag(featureFlag, true); + final ProjectFeatureFlag secondFeatureFlag = gd.getFeatureFlagService() + .createProjectFeatureFlag(project, new ProjectFeatureFlag(SECOND_FEATURE_FLAG, false)); + + checkProjectFeatureFlag(featureFlag, PROJECT_FEATURE_FLAG, true); + checkProjectFeatureFlag(secondFeatureFlag, SECOND_FEATURE_FLAG, false); } @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") public void listProjectFeatureFlags() throws Exception { - gd.getFeatureFlagService().createProjectFeatureFlag(project, new ProjectFeatureFlag("mostRecentFeatureFlag")); - final ProjectFeatureFlags flags = gd.getFeatureFlagService().listProjectFeatureFlags(project); assertThat(flags, hasItems( - new ProjectFeatureFlag("mostRecentFeatureFlag", true), + new ProjectFeatureFlag(SECOND_FEATURE_FLAG, false), new ProjectFeatureFlag(PROJECT_FEATURE_FLAG, true))); } @@ -46,15 +47,15 @@ public void listFeatureFlags() throws Exception { final FeatureFlags flags = gd.getFeatureFlagService().listFeatureFlags(project); assertThat(flags, hasItems( - new com.gooddata.featureflag.FeatureFlag("mostRecentFeatureFlag", true), - new com.gooddata.featureflag.FeatureFlag(PROJECT_FEATURE_FLAG, true))); + new FeatureFlag(SECOND_FEATURE_FLAG, false), + new FeatureFlag(PROJECT_FEATURE_FLAG, true))); } @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") public void getProjectFeatureFlag() throws Exception { final ProjectFeatureFlag featureFlag = gd.getFeatureFlagService().getProjectFeatureFlag(project, PROJECT_FEATURE_FLAG); - checkProjectFeatureFlag(featureFlag, true); + checkProjectFeatureFlag(featureFlag, PROJECT_FEATURE_FLAG, true); } @Test(groups = "featureFlag", dependsOnMethods = "getProjectFeatureFlag") @@ -65,12 +66,14 @@ public void updateProjectFeatureFlag() throws Exception { // disable (update) feature flag featureFlag.setEnabled(false); final ProjectFeatureFlag disabledFlag = gd.getFeatureFlagService().updateProjectFeatureFlag(featureFlag); - checkProjectFeatureFlag(disabledFlag, false); + // can not check value because of eventual consistency of this API + // checkProjectFeatureFlag(disabledFlag, false); // enable again featureFlag.setEnabled(true); final ProjectFeatureFlag enabledFlag = gd.getFeatureFlagService().updateProjectFeatureFlag(featureFlag); - checkProjectFeatureFlag(enabledFlag, true); + // can not check value because of eventual consistency of this API + // checkProjectFeatureFlag(enabledFlag, true); } @Test(groups = "featureFlag", dependsOnMethods = "createProjectFeatureFlag") @@ -90,9 +93,10 @@ public void deleteProjectFeatureFlag() throws Exception { } - private void checkProjectFeatureFlag(ProjectFeatureFlag featureFlag, boolean expectedValue) { + private void checkProjectFeatureFlag(final ProjectFeatureFlag featureFlag, final String expectedName, + final boolean expectedValue) { assertThat(featureFlag, is(notNullValue())); - assertThat(featureFlag.getName(), is(PROJECT_FEATURE_FLAG)); + assertThat(featureFlag.getName(), is(expectedName)); assertThat(featureFlag.isEnabled(), is(expectedValue)); } From 25ff90e793ce497236337d3692c798cf517a6803 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 14 Mar 2016 14:26:22 +0100 Subject: [PATCH 0340/1191] [maven-release-plugin] prepare release gooddata-java-1.5.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 18cf05512..f6ff0b155 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.4.1-SNAPSHOT + 1.5.0 ${project.artifactId} GoodData Java SDK From 3b6dc7b838bb1b4a4aaf5b595bfd30b893c77e33 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 14 Mar 2016 14:26:22 +0100 Subject: [PATCH 0341/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f6ff0b155..5271c7041 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.0 + 1.5.1-SNAPSHOT ${project.artifactId} GoodData Java SDK From 69110a0f6ed627ca004a390206f5468d944ab403 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 14 Mar 2016 14:40:02 +0100 Subject: [PATCH 0342/1191] Bump version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 863a4902c..777a2fcda 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.4.0 + 1.5.0 ``` From 5fc138a7eebe30a6ac56476104f7793879d49705 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 14 Mar 2016 16:12:08 +0100 Subject: [PATCH 0343/1191] Use createAndGet when creating metadata object This saves one REST API call and closes: #112 --- src/main/java/com/gooddata/md/MetadataService.java | 6 +++--- src/main/java/com/gooddata/md/Obj.java | 1 + .../java/com/gooddata/md/MetadataServiceIT.java | 14 ++------------ .../java/com/gooddata/md/MetadataServiceTest.java | 8 ++++---- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 165564c64..47fcd38b4 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -52,9 +52,9 @@ public T createObj(Project project, T obj) { notNull(project, "project"); notNull(obj, "obj"); - final UriResponse response; + final T response; try { - response = restTemplate.postForObject(Obj.URI, obj, UriResponse.class, project.getId()); + response = restTemplate.postForObject(Obj.CREATE_URI, obj, (Class)obj.getClass(), project.getId()); } catch (GoodDataRestException | RestClientException e) { throw new ObjCreateException(obj, e); } @@ -62,7 +62,7 @@ public T createObj(Project project, T obj) { if (response == null) { throw new ObjCreateException("empty response from API call", obj); } - return getObjByUri(response.getUri(), (Class) obj.getClass()); + return response; } /** diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index ac9f098d4..814dbcd4d 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -8,6 +8,7 @@ public interface Obj { String URI = "/gdc/md/{projectId}/obj"; + String CREATE_URI = URI + "?createAndGet=true"; String OBJ_URI = URI + "/{objId}"; UriTemplate OBJ_TEMPLATE = new UriTemplate(OBJ_URI); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 56ac2aa5d..6b788a774 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -149,12 +149,7 @@ public void shouldCreateObj() throws Exception { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(OBJ_URI) - .respond() - .withStatus(200) - .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(SPECIFIC_OBJ_URI) + .havingParameterEqualTo("createAndGet", "true") .respond() .withStatus(200) .withBody(readFromResource("/md/metric.json")); @@ -219,12 +214,7 @@ public void shouldCreateMailScheduleObj() throws Exception { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(OBJ_URI) - .respond() - .withStatus(200) - .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(SPECIFIC_OBJ_URI) + .havingParameterEqualTo("createAndGet", "true") .respond() .withStatus(200) .withBody(readFromResource("/md/scheduledMail.json")); diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index f93e8ff76..15405d8ce 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -8,6 +8,7 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; +import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.http.HttpStatus; @@ -28,6 +29,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -80,11 +82,9 @@ public void testCreateObjRestClientException() throws Exception { public void testCreateObj() throws Exception { final Obj obj = mock(Obj.class); final Obj resultObj = mock(Obj.class); - final UriResponse uriResp = mock(UriResponse.class); - when(restTemplate.postForObject(Obj.URI, obj, UriResponse.class, PROJECT_ID)).thenReturn(uriResp); - when(uriResp.getUri()).thenReturn(URI); - when(restTemplate.getForObject(URI, obj.getClass())).thenReturn(resultObj); + when(restTemplate.postForObject(eq(Obj.CREATE_URI), eq(obj), Matchers.>any(), eq(PROJECT_ID))) + .thenReturn(resultObj); final Obj result = service.createObj(project, obj); assertThat(result, is(notNullValue())); From 076cdb766ac80f7a90de5c1e1b503401c1a9e368 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 16 Mar 2016 15:30:43 +0100 Subject: [PATCH 0344/1191] introduce BooleanDeserializer Unify BooleanStringDeserializer (boolean values "0" and "1") and BooleanIntegerDeserializer (integer values 0 and 1). The main reason is md/obj resource which returns integer boolean representation upon POST request but string boolean representation on GET. Relates #112 --- .../com/gooddata/dataset/DatasetManifest.java | 4 +- .../com/gooddata/md/AttributeDisplayForm.java | 4 +- .../com/gooddata/md/DataLoadingColumn.java | 6 +-- src/main/java/com/gooddata/md/Dataset.java | 4 +- src/main/java/com/gooddata/md/Entry.java | 6 +-- src/main/java/com/gooddata/md/InUseMany.java | 4 +- src/main/java/com/gooddata/md/Meta.java | 10 ++--- .../java/com/gooddata/project/Project.java | 13 +++--- .../project/ProjectValidationResults.java | 6 +-- src/main/java/com/gooddata/project/Role.java | 4 +- ...rializer.java => BooleanDeserializer.java} | 8 ++-- .../util/BooleanStringDeserializer.java | 29 ------------- .../com/gooddata/md/MetadataServiceIT.java | 2 +- ...Test.java => BooleanDeserializerTest.java} | 31 ++++++++++---- .../gooddata/util/BooleanIntegerClass.java | 2 +- .../com/gooddata/util/BooleanStringClass.java | 2 +- .../util/BooleanStringDeserializerTest.java | 41 ------------------- src/test/resources/md/metric-created.json | 21 ++++++++++ 18 files changed, 83 insertions(+), 114 deletions(-) rename src/main/java/com/gooddata/util/{BooleanIntegerDeserializer.java => BooleanDeserializer.java} (69%) delete mode 100644 src/main/java/com/gooddata/util/BooleanStringDeserializer.java rename src/test/java/com/gooddata/util/{BooleanIntegerDeserializerTest.java => BooleanDeserializerTest.java} (51%) delete mode 100644 src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java create mode 100644 src/test/resources/md/metric-created.json diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 5b80c9135..6455e35f9 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -4,7 +4,7 @@ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanIntegerSerializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -138,7 +138,7 @@ public static class Part { Part(@JsonProperty("mode") String uploadMode, @JsonProperty("columnName") String columnName, @JsonProperty("populates") List populates, - @JsonProperty("referenceKey") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean referenceKey, + @JsonProperty("referenceKey") @JsonDeserialize(using = BooleanDeserializer.class) Boolean referenceKey, @JsonProperty("constraints") Map constraints) { this.uploadMode = uploadMode; this.columnName = columnName; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 0463befb3..d870861d4 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,7 +1,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanIntegerSerializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -45,7 +45,7 @@ private static class Content extends DisplayForm.Content { private final boolean isDefault; private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression") String expression, - @JsonProperty("default") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean isDefault, + @JsonProperty("default") @JsonDeserialize(using = BooleanDeserializer.class) Boolean isDefault, @JsonProperty("ldmexpression") String ldmExpression, @JsonProperty("type") String type) { super(formOf, expression, ldmExpression, type); diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index ff901c8b8..e34ec64cb 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -11,7 +11,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.gooddata.gdc.UriResponse; -import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanDeserializer; /** * Represents datasets' loading column. @@ -100,8 +100,8 @@ private static class Content { private Content(@JsonProperty("column") UriResponse columnUri, @JsonProperty("columnName") String columnName, @JsonProperty("type") String columnType, @JsonProperty("length") Integer columnLength, @JsonProperty("precision") Integer columnPrecision, - @JsonProperty("columnUnique") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean columnUnique, - @JsonProperty("columnNull") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean columnNull, + @JsonProperty("columnUnique") @JsonDeserialize(using = BooleanDeserializer.class) boolean columnUnique, + @JsonProperty("columnNull") @JsonDeserialize(using = BooleanDeserializer.class) boolean columnNull, @JsonProperty("columnSynchronize") ColumnSynchronize columnSynchronize) { this.columnUri = columnUri; this.columnName = columnName; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 121ce111c..a957d7a99 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -5,7 +5,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -105,7 +105,7 @@ private Content(@JsonProperty("ties") List ties, @JsonProperty("facts") List facts, @JsonProperty("dataLoadingColumns") List dataLoadingColumns, @JsonProperty("attributes") List attributes, - @JsonProperty("hasUploadConfiguration") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean hasUploadConfiguration) { + @JsonProperty("hasUploadConfiguration") @JsonDeserialize(using = BooleanDeserializer.class) Boolean hasUploadConfiguration) { this.ties = ties; this.mode = mode; this.facts = facts; diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 735bf69e5..77f8b3f3b 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -38,13 +38,13 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("category") String category, @JsonProperty("author") String author, @JsonProperty("contributor") String contributor, - @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean deprecated, + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanDeserializer.class) Boolean deprecated, @JsonProperty("identifier") String identifier, @JsonProperty("tags") String tags, @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, - @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean locked, - @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean unlisted) { + @JsonProperty("locked") @JsonDeserialize(using = BooleanDeserializer.class) Boolean locked, + @JsonProperty("unlisted") @JsonDeserialize(using = BooleanDeserializer.class) Boolean unlisted) { this.link = link; this.title = title; this.summary = summary; diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 15e39f334..1794508cd 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -1,7 +1,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -39,7 +39,7 @@ class InUseMany { @JsonCreator InUseMany(@JsonProperty("uris") Collection uris, - @JsonProperty("nearest") @JsonDeserialize(using = BooleanStringDeserializer.class) boolean nearest, + @JsonProperty("nearest") @JsonDeserialize(using = BooleanDeserializer.class) boolean nearest, @JsonProperty("types") Set types) { this.uris = notEmpty(uris, "uris"); diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 60ecfa291..fb713fa11 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -160,7 +160,7 @@ public Boolean isDeprecated() { } @JsonProperty("deprecated") - @JsonDeserialize(using = BooleanStringDeserializer.class) + @JsonDeserialize(using = BooleanDeserializer.class) public void setDeprecated(Boolean deprecated) { this.deprecated = deprecated; } @@ -184,7 +184,7 @@ public Boolean isProduction() { } @JsonProperty("isProduction") - @JsonDeserialize(using = BooleanIntegerDeserializer.class) + @JsonDeserialize(using = BooleanDeserializer.class) public void setProduction(final Boolean production) { this.production = production; } @@ -200,7 +200,7 @@ public Boolean isLocked() { } @JsonProperty("locked") - @JsonDeserialize(using = BooleanIntegerDeserializer.class) + @JsonDeserialize(using = BooleanDeserializer.class) public void setLocked(Boolean locked) { this.locked = locked; } @@ -216,7 +216,7 @@ public Boolean isUnlisted() { } @JsonProperty("unlisted") - @JsonDeserialize(using = BooleanIntegerDeserializer.class) + @JsonDeserialize(using = BooleanDeserializer.class) public void setUnlisted(Boolean unlisted) { this.unlisted = unlisted; } @@ -232,7 +232,7 @@ public Boolean isSharedWithSomeone() { } @JsonProperty("sharedWithSomeone") - @JsonDeserialize(using = BooleanIntegerDeserializer.class) + @JsonDeserialize(using = BooleanDeserializer.class) public void setSharedWithSomeone(final Boolean sharedWithSomeone) { this.sharedWithSomeone = sharedWithSomeone; } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 5325ed02a..1f2c13483 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -5,8 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; -import com.gooddata.util.BooleanIntegerDeserializer; -import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.GDDateTimeDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -486,11 +485,11 @@ private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("tags") String tags, @JsonProperty("uri") String uri, @JsonProperty("identifier") String identifier, - @JsonProperty("deprecated") @JsonDeserialize(using = BooleanStringDeserializer.class) Boolean deprecated, - @JsonProperty("isProduction") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean production, - @JsonProperty("locked") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean locked, - @JsonProperty("unlisted") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean unlisted, - @JsonProperty("sharedWithSomeone") @JsonDeserialize(using = BooleanIntegerDeserializer.class) Boolean sharedWithSomeone) { + @JsonProperty("deprecated") @JsonDeserialize(using = BooleanDeserializer.class) Boolean deprecated, + @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) { super(author, contributor, created, updated, summary, title, category, tags, uri, identifier, deprecated, production, locked, unlisted, sharedWithSomeone); diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java index 240a6c4df..5a96adf5a 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -1,6 +1,6 @@ package com.gooddata.project; -import com.gooddata.util.BooleanIntegerDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -28,8 +28,8 @@ public class ProjectValidationResults { private final List results = new LinkedList<>(); @JsonCreator - private ProjectValidationResults(@JsonProperty("error_found") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean error, - @JsonProperty("fatal_error_found") @JsonDeserialize(using = BooleanIntegerDeserializer.class) boolean fatalError, + private ProjectValidationResults(@JsonProperty("error_found") @JsonDeserialize(using = BooleanDeserializer.class) boolean error, + @JsonProperty("fatal_error_found") @JsonDeserialize(using = BooleanDeserializer.class) boolean fatalError, @JsonProperty("results") List resultItems) { this.error = error; this.fatalError = fatalError; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index 272d0d8d3..c3664e59c 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.md.Meta; -import com.gooddata.util.BooleanStringDeserializer; +import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanStringSerializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -34,7 +34,7 @@ public class Role { private static final String SELF_LINK = "self"; - @JsonDeserialize(contentUsing = BooleanStringDeserializer.class) + @JsonDeserialize(contentUsing = BooleanDeserializer.class) @JsonSerialize(contentUsing = BooleanStringSerializer.class) private final Map permissions; diff --git a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java b/src/main/java/com/gooddata/util/BooleanDeserializer.java similarity index 69% rename from src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java rename to src/main/java/com/gooddata/util/BooleanDeserializer.java index 6195cea69..4465b233e 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanDeserializer.java @@ -11,9 +11,9 @@ import java.io.IOException; /** - * Deserializes Integer 1 or 0 as boolean + * Deserializes String or Integer 1 or 0 as boolean */ -public class BooleanIntegerDeserializer extends JsonDeserializer { +public class BooleanDeserializer extends JsonDeserializer { private static final Integer ONE = 1; @@ -23,8 +23,10 @@ public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOE notNull(root, "jsonNode"); if (root.isInt()) { return ONE.equals(root.numberValue()); + } else if (root.isTextual()) { + return "1".equals(root.textValue()); } else { - throw new JsonMappingException("Expected int value: " + root.asText(), jp.getCurrentLocation()); + throw new JsonMappingException("Unknown value of type: " + root.getNodeType(), jp.getCurrentLocation()); } } diff --git a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java b/src/main/java/com/gooddata/util/BooleanStringDeserializer.java deleted file mode 100644 index 34ea28358..000000000 --- a/src/main/java/com/gooddata/util/BooleanStringDeserializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gooddata.util; - -import static com.gooddata.util.Validate.notNull; - -import com.fasterxml.jackson.databind.JsonNode; -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 java.io.IOException; - -/** - * Deserializes String "1" or "0" as boolean - */ -public class BooleanStringDeserializer extends JsonDeserializer { - - @Override - public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { - final JsonNode root = jp.readValueAsTree(); - notNull(root, "jsonNode"); - if (root.isTextual()) { - return "1".equals(root.textValue()); - } else { - throw new JsonMappingException("Expected textual value: " + root.asText(), jp.getCurrentLocation()); - } - } - -} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 6b788a774..dd247032a 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -152,7 +152,7 @@ public void shouldCreateObj() throws Exception { .havingParameterEqualTo("createAndGet", "true") .respond() .withStatus(200) - .withBody(readFromResource("/md/metric.json")); + .withBody(readFromResource("/md/metric-created.json")); final Obj result = gd.getMetadataService().createObj(project, metricInput); diff --git a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java similarity index 51% rename from src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java rename to src/test/java/com/gooddata/util/BooleanDeserializerTest.java index 311368d31..47a392eb6 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java @@ -1,19 +1,18 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -public class BooleanIntegerDeserializerTest { +public class BooleanDeserializerTest { private static final ObjectMapper MAPPER = new ObjectMapper(); @Test - public void shouldDeserializeTrue() throws Exception { + public void shouldDeserializeIntegerTrue() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); final JsonNode node = MAPPER.readTree(json); @@ -24,7 +23,7 @@ public void shouldDeserializeTrue() throws Exception { } @Test - public void shouldDeserializeFalse() throws Exception { + public void shouldDeserializeIntegerFalse() throws Exception { final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); final JsonNode node = MAPPER.readTree(json); @@ -34,8 +33,26 @@ public void shouldDeserializeFalse() throws Exception { assertThat(moo.isFoo(), is(false)); } - @Test(expectedExceptions = JsonMappingException.class) - public void shouldThrowOnDeserializingString() throws Exception { - MAPPER.readValue("{\"foo\":\"1\"}", BooleanIntegerClass.class); + @Test + public void shouldDeserializeStringTrue() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").textValue(), is("1")); + + final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + assertThat(moo.isFoo(), is(true)); } + + @Test + public void shouldDeserializeStringFalse() throws Exception { + final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); + + final JsonNode node = MAPPER.readTree(json); + assertThat(node.path("foo").textValue(), is("0")); + + final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + assertThat(moo.isFoo(), is(false)); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanIntegerClass.java b/src/test/java/com/gooddata/util/BooleanIntegerClass.java index 1f6acaa2a..b485c6cbb 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerClass.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerClass.java @@ -9,7 +9,7 @@ public class BooleanIntegerClass { private final boolean foo; @JsonCreator - public BooleanIntegerClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanIntegerDeserializer.class) final boolean foo) { + public BooleanIntegerClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanDeserializer.class) final boolean foo) { this.foo = foo; } diff --git a/src/test/java/com/gooddata/util/BooleanStringClass.java b/src/test/java/com/gooddata/util/BooleanStringClass.java index d7b322ebf..8104c59bc 100644 --- a/src/test/java/com/gooddata/util/BooleanStringClass.java +++ b/src/test/java/com/gooddata/util/BooleanStringClass.java @@ -9,7 +9,7 @@ public class BooleanStringClass { private final boolean foo; @JsonCreator - public BooleanStringClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanStringDeserializer.class) final boolean foo) { + public BooleanStringClass(@JsonProperty("foo") @JsonDeserialize(using = BooleanDeserializer.class) final boolean foo) { this.foo = foo; } diff --git a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java deleted file mode 100644 index a45d0ddd7..000000000 --- a/src/test/java/com/gooddata/util/BooleanStringDeserializerTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gooddata.util; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -public class BooleanStringDeserializerTest { - - private static final ObjectMapper MAPPER = new ObjectMapper(); - - @Test - public void shouldDeserializeTrue() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); - - final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").textValue(), is("1")); - - final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); - assertThat(moo.isFoo(), is(true)); - } - - @Test - public void shouldDeserializeFalse() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); - - final JsonNode node = MAPPER.readTree(json); - assertThat(node.path("foo").textValue(), is("0")); - - final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); - assertThat(moo.isFoo(), is(false)); - } - - @Test(expectedExceptions = JsonMappingException.class) - public void shouldThrowOnDeserializingInt() throws Exception { - MAPPER.readValue("{\"foo\":0}", BooleanStringClass.class); - } -} \ No newline at end of file diff --git a/src/test/resources/md/metric-created.json b/src/test/resources/md/metric-created.json new file mode 100644 index 000000000..90cd68f9f --- /dev/null +++ b/src/test/resources/md/metric-created.json @@ -0,0 +1,21 @@ +{ + "metric" : { + "content" : { + "expression" : "[/gdc/md/PROJECT_ID/obj/EXPR_ID]", + "format" : "FORMAT" + }, + "meta" : { + "author" : "/gdc/account/profile/USER_ID", + "uri" : "/gdc/md/PROJECT_ID/obj/DF_ID", + "tags" : "", + "created" : "2014-04-11 13:45:56", + "identifier" : "attr.person.id.name", + "deprecated" : 0, + "summary" : "", + "title" : "Person Name", + "category" : "attributeDisplayForm", + "updated" : "2014-04-11 13:45:56", + "contributor" : "/gdc/account/profile/USER_ID" + } + } +} From 77d71949c71cbd435a3637ec85cba22677572a47 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 4 Apr 2016 07:57:36 +0200 Subject: [PATCH 0345/1191] Add @SafeVarargs to MetadataService.usedBy methods It's necessary to make those methods final and that's not backward compatible. --- src/main/java/com/gooddata/md/MetadataService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 165564c64..a18e48ba4 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -306,7 +306,8 @@ public Collection findUris(Project project, * 'table'...) * @return objects using given objects. */ - public Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { notNull(obj, "obj"); return usedBy(project, obj.getUri(), nearest, types); } @@ -321,7 +322,8 @@ public Collection usedBy(Project project, Obj obj, boolean nearest, Class * @return objects using given objects. * @see #usedBy(Project, Collection, boolean, Class[]) */ - public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, String uri, boolean nearest, Class... types) { notNull(uri, "uri"); notNull(project, "project"); @@ -339,7 +341,8 @@ public Collection usedBy(Project project, String uri, boolean nearest, Cl * @return objects usages * @see #usedBy(Project, String, boolean, Class[]) */ - public Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { notNull(uris, "uris"); notNull(project, "project"); From 68baa2b5563a2a7d89af19d1fb3e0aa70e95ce80 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 8 Apr 2016 00:49:20 +0200 Subject: [PATCH 0346/1191] replace noopRequestCallback with null value --- src/main/java/com/gooddata/AbstractService.java | 11 +---------- .../gooddata/dataload/processes/ProcessService.java | 4 ++-- src/main/java/com/gooddata/report/ReportService.java | 2 +- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index a949989ea..8d728411c 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -10,11 +10,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.FileCopyUtils; import org.springframework.web.client.HttpMessageConverterExtractor; -import org.springframework.web.client.RequestCallback; import org.springframework.web.client.ResponseExtractor; import org.springframework.web.client.RestTemplate; @@ -24,7 +22,6 @@ import java.io.OutputStream; import java.util.concurrent.TimeUnit; - /** * Parent for GoodData services providing helpers for REST API calls and polling. */ @@ -36,12 +33,6 @@ public abstract class AbstractService { protected final ObjectMapper mapper = new ObjectMapper(); - protected final RequestCallback noopRequestCallback = new RequestCallback() { - @Override - public void doWithRequest(final ClientHttpRequest request) throws IOException { - } - }; - private final ResponseExtractor reusableResponseExtractor = new ResponseExtractor() { @Override public ClientHttpResponse extractData(final ClientHttpResponse response) throws IOException { @@ -83,7 +74,7 @@ final

boolean pollOnce(final PollHandler handler) { notNull(handler, "handler"); final ClientHttpResponse response; try { - response = restTemplate.execute(handler.getPollingUri(), GET, noopRequestCallback, reusableResponseExtractor); + response = restTemplate.execute(handler.getPollingUri(), GET, null, reusableResponseExtractor); } catch (GoodDataRestException e) { handler.handlePollException(e); throw new GoodDataException("Handler " + handler.getClass().getName() + " didn't handle exception", e); diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 208c72118..9fbccf5b3 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -186,7 +186,7 @@ public void getProcessSource(DataloadProcess process, OutputStream outputStream) notNull(outputStream, "outputStream"); try { restTemplate.execute(process.getSourceLink(), HttpMethod.GET, - noopRequestCallback, new OutputStreamResponseExtractor(outputStream)); + null, new OutputStreamResponseExtractor(outputStream)); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to get process source " + process.getSourceLink(), e); } @@ -202,7 +202,7 @@ public void getExecutionLog(ProcessExecutionDetail executionDetail, OutputStream notNull(outputStream, "outputStream"); try { restTemplate.execute(executionDetail.getLogLink(), HttpMethod.GET, - noopRequestCallback, new OutputStreamResponseExtractor(outputStream)); + null, new OutputStreamResponseExtractor(outputStream)); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to get process execution log " + executionDetail.getLogLink(), e); } diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index a45169d6b..06ef1e607 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -94,7 +94,7 @@ public void handlePollException(final GoodDataRestException e) { @Override protected void onFinish() { try { - restTemplate.execute(uri, GET, noopRequestCallback, new OutputStreamResponseExtractor(output)); + restTemplate.execute(uri, GET, null, new OutputStreamResponseExtractor(output)); } catch (GoodDataException | RestClientException e) { throw new ReportException("Unable to export report", e); } From 2c922704036e3fb2d9f4b8f715010573e72d5b3d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sat, 9 Apr 2016 00:42:33 +0200 Subject: [PATCH 0347/1191] fix: git links --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5271c7041..ad7439402 100644 --- a/pom.xml +++ b/pom.xml @@ -21,8 +21,8 @@ - git@github.com:martiner/java.git - scm:git:git@github.com:martiner/java.git + git@github.com:martiner/gooddata-java.git + scm:git:git@github.com:martiner/gooddata-java.git scm:git:${basedir} From 499de638914ff3777c17cf9629ffe09e8c963b81 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 11 Apr 2016 19:26:31 +0200 Subject: [PATCH 0348/1191] Add AboutLinks to unify Gdc and Datasets links --- .../java/com/gooddata/dataset/Dataset.java | 29 ++---- .../com/gooddata/dataset/DatasetService.java | 30 ++++-- .../java/com/gooddata/dataset/Datasets.java | 36 ++----- .../java/com/gooddata/gdc/AboutLinks.java | 94 +++++++++++++++++++ src/main/java/com/gooddata/gdc/Gdc.java | 76 ++------------- .../java/com/gooddata/gdc/GdcService.java | 6 ++ .../gooddata/dataset/DatasetServiceIT.java | 23 ++++- .../gooddata/dataset/DatasetServiceTest.java | 43 ++++++++- .../com/gooddata/dataset/DatasetsTest.java | 15 ++- .../java/com/gooddata/gdc/AboutLinksTest.java | 41 ++++++++ src/test/resources/dataset/datasets.json | 2 +- 11 files changed, 254 insertions(+), 141 deletions(-) create mode 100644 src/main/java/com/gooddata/gdc/AboutLinks.java create mode 100644 src/test/java/com/gooddata/gdc/AboutLinksTest.java diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java index daab0dd44..fe0806f82 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -3,33 +3,20 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.gdc.AboutLinks; +import com.gooddata.gdc.AboutLinks.Link; /** - * Dataset + * Dataset link + * @deprecated use {@link Link} instead */ +@Deprecated @JsonIgnoreProperties(ignoreUnknown = true) -public class Dataset { - private final String identifier; - private final String link; - private final String title; +public class Dataset extends Link { @JsonCreator - public Dataset(@JsonProperty("identifier") String identifier, @JsonProperty("link") String link, + public Dataset(@JsonProperty("identifier") String identifier, @JsonProperty("link") String uri, @JsonProperty("title") String title) { - this.identifier = identifier; - this.link = link; - this.title = title; - } - - public String getIdentifier() { - return identifier; - } - - public String getLink() { - return link; - } - - public String getTitle() { - return title; + super(identifier, uri, title, null, null); } } diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 4424625e8..c2e68305d 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -9,10 +9,8 @@ import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.gdc.DataStoreException; -import com.gooddata.gdc.DataStoreService; -import com.gooddata.gdc.TaskStatus; -import com.gooddata.gdc.UriResponse; +import com.gooddata.gdc.*; +import com.gooddata.gdc.AboutLinks.Link; import com.gooddata.project.Project; import org.apache.commons.lang.RandomStringUtils; import org.springframework.http.client.ClientHttpResponse; @@ -24,9 +22,7 @@ import java.io.InputStream; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -216,12 +212,28 @@ protected void onFinish() { } /** - * Lists datasets in project. Returns empty list in case there are no datasets. + * Lists datasets (links) in project. Returns empty list in case there are no datasets. * * @param project project to list datasets in - * @return collection of datasets in project or empty list + * @return collection of dataset links or empty list + * @deprecated use {@link #listDatasetLinks(Project)} instead */ + @Deprecated public Collection listDatasets(Project project) { + final HashSet datasets = new HashSet<>(); + for (final Link link : listDatasetLinks(project)) { + datasets.add(new Dataset(link.getIdentifier(), link.getUri(), link.getTitle())); + } + return datasets; + } + + /** + * Lists datasets (links) in project. Returns empty list in case there are no datasets. + * + * @param project project to list datasets in + * @return collection of dataset links or empty list + */ + public Collection listDatasetLinks(final Project project) { notNull(project, "project"); try { final Datasets result = restTemplate.getForObject(Datasets.URI, Datasets.class, project.getId()); diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java index 433c7971c..126ac8f62 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -3,50 +3,26 @@ */ package com.gooddata.dataset; -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.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.annotation.*; +import com.gooddata.gdc.AboutLinks; -import java.util.Collection; import java.util.List; /** - * Datasets + * Dataset links */ @JsonTypeName("about") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -// todo this is almost copy of Gdc -public class Datasets { +class Datasets extends AboutLinks { public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; - private final String category; - private final String summary; - private final List links; - @JsonCreator public Datasets(@JsonProperty("category") String category, @JsonProperty("summary") String summary, - @JsonProperty("links") List links) { - this.category = category; - this.summary = summary; - this.links = links; - } - - public String getCategory() { - return category; - } - - public String getSummary() { - return summary; - } - - public Collection getLinks() { - return links; + @JsonProperty("links") List links) { + super(category, summary, null, links); } } diff --git a/src/main/java/com/gooddata/gdc/AboutLinks.java b/src/main/java/com/gooddata/gdc/AboutLinks.java new file mode 100644 index 000000000..c3e62439f --- /dev/null +++ b/src/main/java/com/gooddata/gdc/AboutLinks.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import com.fasterxml.jackson.annotation.*; + +import java.util.Collection; +import java.util.List; + +/** + * Collection of links with "about" metadata. + * Deserialization only. + */ +@JsonTypeName("about") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class AboutLinks { + + private final String category; + private final String summary; + private final String instance; + private final List links; + + @JsonCreator + public AboutLinks(@JsonProperty("category") String category, @JsonProperty("summary") String summary, + @JsonProperty("instance") String instance, @JsonProperty("links") List links) { + this.category = category; + this.summary = summary; + this.instance = instance; + this.links = links; + } + + public String getCategory() { + return category; + } + + public String getSummary() { + return summary; + } + + public String getInstance() { + return instance; + } + + public Collection getLinks() { + return links; + } + + /** + * Link with metadata. + * Deserialization only. + */ + @JsonIgnoreProperties(ignoreUnknown = true) + public static class Link { + private final String identifier; + private final String uri; + private final String title; + private final String category; + private final String summary; + + @JsonCreator + public Link(@JsonProperty("identifier") String identifier, @JsonProperty("link") String uri, + @JsonProperty("title") String title, @JsonProperty("category") String category, + @JsonProperty("summary") String summary) { + this.identifier = identifier; + this.uri = uri; + this.title = title; + this.category = category; + this.summary = summary; + } + + public String getIdentifier() { + return identifier; + } + + public String getUri() { + return uri; + } + + public String getTitle() { + return title; + } + + public String getCategory() { + return category; + } + + public String getSummary() { + return summary; + } + } +} diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index cabaa2b34..3f83476fd 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -10,28 +10,24 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.gdc.AboutLinks.Link; import java.util.List; /** - * GoodData API root response (aka "about" or "home") + * GoodData API root links (aka "about" or "home"). + * Deserialization only. */ -@JsonTypeName("about") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class Gdc { +public class Gdc extends AboutLinks { /** * URI of GoodData API root */ public static final String URI = "/gdc"; - private final List links; - @JsonCreator public Gdc(@JsonProperty("links") List links) { - this.links = links; + super(null, null, null, links); } /** @@ -172,7 +168,7 @@ public String getUserStagingLink() { */ @JsonIgnore private Link getLink(LinkCategory category) { - for (Link link : links) { + for (Link link : getLinks()) { if (category.value.equals(link.getCategory())) { return link; } @@ -180,66 +176,10 @@ private Link getLink(LinkCategory category) { return null; } - /** - * GoodData API root link - */ - @JsonIgnoreProperties(ignoreUnknown = true) - private static class Link { - private final String category; - private final String link; - private final String summary; - private final String title; - - @JsonCreator - public Link(@JsonProperty("category") String category, @JsonProperty("link") String link, - @JsonProperty("summary") String summary, @JsonProperty("title") String title) { - this.category = category; - this.link = link; - this.summary = summary; - this.title = title; - } - - /** - * Get link category - * - * @return link category - */ - public String getCategory() { - return category; - } - - /** - * Get link URI - * - * @return link URI - */ - public String getUri() { - return link; - } - - /** - * Get link summary - * - * @return link summary - */ - public String getSummary() { - return summary; - } - - /** - * Get link title - * - * @return link title - */ - public String getTitle() { - return title; - } - } - /** * GoodData API root link category enum */ - private static enum LinkCategory { + private enum LinkCategory { /** * GoodData API root */ @@ -295,7 +235,7 @@ private static enum LinkCategory { private final String value; - private LinkCategory(final String value) { + LinkCategory(final String value) { this.value = value; } } diff --git a/src/main/java/com/gooddata/gdc/GdcService.java b/src/main/java/com/gooddata/gdc/GdcService.java index cc1555b2e..e256c90d4 100644 --- a/src/main/java/com/gooddata/gdc/GdcService.java +++ b/src/main/java/com/gooddata/gdc/GdcService.java @@ -9,6 +9,7 @@ import org.springframework.web.client.RestTemplate; /** + * Service to work with GoodData API root. */ public class GdcService extends AbstractService { @@ -16,6 +17,11 @@ public GdcService(RestTemplate restTemplate) { super(restTemplate); } + /** + * Obtains GoodData API root links. + * + * @return GoodData API root links + */ public Gdc getGdc() { try { return restTemplate.getForObject(Gdc.URI, Gdc.class); diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 1b6b9d7af..7609f187b 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -2,6 +2,7 @@ import com.gooddata.AbstractGoodDataIT; import com.gooddata.GoodDataException; +import com.gooddata.gdc.AboutLinks.Link; import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; import org.testng.annotations.BeforeClass; @@ -16,10 +17,7 @@ import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; +import static org.hamcrest.Matchers.*; import static org.testng.Assert.fail; public class DatasetServiceIT extends AbstractGoodDataIT { @@ -145,6 +143,23 @@ public void shouldListDatasets() throws Exception { final Collection datasets = gd.getDatasetService().listDatasets(project); assertThat(datasets, hasSize(1)); + assertThat(datasets.iterator().next().getUri(), + is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); + } + + @Test + public void shouldListDatasetLinks() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface") + .respond() + .withBody(readFromResource("/dataset/datasets.json")) + ; + + final Collection datasets = gd.getDatasetService().listDatasetLinks(project); + assertThat(datasets, hasSize(1)); + assertThat(datasets.iterator().next().getUri(), + is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); } @Test diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index f09a0754a..32b816cbb 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -5,6 +5,7 @@ import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.AboutLinks.Link; import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; @@ -20,6 +21,7 @@ import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; @@ -41,7 +43,7 @@ public class DatasetServiceTest { @Mock private Project project; @Mock - private Dataset dataset; + private Link datasetLink; @Mock private DatasetManifest manifest; @Mock @@ -152,13 +154,13 @@ public void testListDatasetsWithNullProject() throws Exception { @Test(expectedExceptions = GoodDataException.class) public void testListDatasetsWithNullResponse() throws Exception { - when(restTemplate.getForObject(Datasets.URI, Dataset.class, PROJECT_ID)).thenReturn(null); + when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenReturn(null); service.listDatasets(project); } @Test(expectedExceptions = GoodDataException.class) public void testListDatasetsWithRestClientError() throws Exception { - when(restTemplate.getForObject(Datasets.URI, Dataset.class, PROJECT_ID)).thenThrow(new RestClientException("")); + when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenThrow(new RestClientException("")); service.listDatasets(project); } @@ -166,10 +168,41 @@ public void testListDatasetsWithRestClientError() throws Exception { public void testListDatasetsWithEmptyResponse() throws Exception { final Datasets datasets = mock(Datasets.class); when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); - when(datasets.getLinks()).thenReturn(asList(dataset)); + when(datasets.getLinks()).thenReturn(asList(datasetLink)); + when(datasetLink.getIdentifier()).thenReturn("ID"); final Collection result = service.listDatasets(project); assertThat(result, hasSize(1)); - assertThat(result, contains(dataset)); + final Dataset dataset = result.iterator().next(); + assertThat(dataset, is(notNullValue())); + assertThat(dataset.getIdentifier(), is("ID")); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testListDatasetLinksWithNullProject() throws Exception { + service.listDatasetLinks(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListDatasetLinksWithNullResponse() throws Exception { + when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenReturn(null); + service.listDatasetLinks(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListDatasetLinksWithRestClientError() throws Exception { + when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenThrow(new RestClientException("")); + service.listDatasetLinks(project); + } + + @Test + public void testListDatasetLinksWithEmptyResponse() throws Exception { + final Datasets datasets = mock(Datasets.class); + when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); + when(datasets.getLinks()).thenReturn(asList(datasetLink)); + + final Collection result = service.listDatasetLinks(project); + assertThat(result, hasSize(1)); + assertThat(result, contains(datasetLink)); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index b87eb7926..cfb2bdda7 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -1,6 +1,7 @@ package com.gooddata.dataset; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.gdc.AboutLinks.Link; import org.testng.annotations.Test; import java.io.InputStream; @@ -8,22 +9,30 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; public class DatasetsTest { + @Test public void deserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataset/datasets.json"); final Datasets datasets = new ObjectMapper().readValue(stream, Datasets.class); assertThat(datasets, is(notNullValue())); + assertThat(datasets.getCategory(), is("singleloadinterface")); + assertThat(datasets.getInstance(), is("MD::LDM::SingleLoadInterface")); + assertThat(datasets.getSummary(), is("single loading interfaces")); - final Collection links = datasets.getLinks(); + final Collection links = datasets.getLinks(); assertThat(links, is(notNullValue())); assertThat(links, hasSize(1)); - final Dataset link = links.iterator().next(); + final Link link = links.iterator().next(); assertThat(link, is(notNullValue())); assertThat(link.getIdentifier(), is("dataset.person")); + assertThat(link.getUri(), is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); + assertThat(link.getCategory(), is("dataset-singleloadinterface")); + assertThat(link.getTitle(), is("Person")); + assertThat(link.getSummary(), is("dataset single data loading interface specifications")); } } diff --git a/src/test/java/com/gooddata/gdc/AboutLinksTest.java b/src/test/java/com/gooddata/gdc/AboutLinksTest.java new file mode 100644 index 000000000..15d6458cb --- /dev/null +++ b/src/test/java/com/gooddata/gdc/AboutLinksTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collection; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; + +public class AboutLinksTest { + + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); + final AboutLinks aboutLinks = new ObjectMapper().readValue(stream, AboutLinks.class); + assertThat(aboutLinks, is(notNullValue())); + assertThat(aboutLinks.getCategory(), is("singleloadinterface")); + assertThat(aboutLinks.getInstance(), is("MD::LDM::SingleLoadInterface")); + assertThat(aboutLinks.getSummary(), is("single loading interfaces")); + + final Collection links = aboutLinks.getLinks(); + assertThat(links, is(notNullValue())); + assertThat(links, hasSize(1)); + + final AboutLinks.Link link = links.iterator().next(); + assertThat(link, is(notNullValue())); + assertThat(link.getIdentifier(), is("dataset.person")); + assertThat(link.getUri(), is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); + assertThat(link.getCategory(), is("dataset-singleloadinterface")); + assertThat(link.getTitle(), is("Person")); + assertThat(link.getSummary(), is("dataset single data loading interface specifications")); + } + +} \ No newline at end of file diff --git a/src/test/resources/dataset/datasets.json b/src/test/resources/dataset/datasets.json index aa368d6d1..4827ae04a 100644 --- a/src/test/resources/dataset/datasets.json +++ b/src/test/resources/dataset/datasets.json @@ -5,7 +5,7 @@ "instance": "MD::LDM::SingleLoadInterface", "links": [ { - "link": "/gdc/md/vra1wg1m6r0gzl8i8r8y3h1bk0kkzkpo/ldm/singleloadinterface/dataset.person", + "link": "/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person", "identifier": "dataset.person", "summary": "dataset single data loading interface specifications", "category": "dataset-singleloadinterface", From 6559d723408b6b62eb7a9fd4a211d65919a87ecb Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 15 Apr 2016 09:15:32 +0200 Subject: [PATCH 0349/1191] Rename deleteProjectFeatureFlag To have consistent naming with the rest. --- .../featureflag/FeatureFlagService.java | 23 ++++++++++++----- .../com/gooddata/project/ProjectService.java | 2 +- .../featureflag/FeatureFlagServiceAT.java | 2 +- .../featureflag/FeatureFlagServiceIT.java | 2 +- .../featureflag/FeatureFlagServiceTest.java | 25 ++++++++++++++++--- 5 files changed, 42 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 29034a6f4..1f63beff8 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -124,16 +124,16 @@ public ProjectFeatureFlag createProjectFeatureFlag(final Project project, final try { final URI featureFlagUri = restTemplate.postForLocation(featureFlagsUri, flag); if (featureFlagUri == null) { - throw new GoodDataException("URI of new flag can't be null"); + throw new GoodDataException("URI of new project feature flag can't be null"); } return getProjectFeatureFlag(featureFlagUri.toString()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to create feature flag: " + flag, e); + throw new GoodDataException("Unable to create project feature flag: " + flag, e); } } /** - * Updates existing project's feature flag. + * Updates existing project feature flag. * Note that it doesn't make sense to update any other property than {@link ProjectFeatureFlag#enabled}. * * @param flag feature flag to be updated, cannot be null and it has to contain URI @@ -147,7 +147,7 @@ public ProjectFeatureFlag updateProjectFeatureFlag(final ProjectFeatureFlag flag restTemplate.put(flag.getUri(), flag); return getProjectFeatureFlag(flag.getUri()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to update feature flag: " + flag, e); + throw new GoodDataException("Unable to update project feature flag: " + flag, e); } } @@ -155,15 +155,26 @@ public ProjectFeatureFlag updateProjectFeatureFlag(final ProjectFeatureFlag flag * Deletes existing project feature flag. * * @param flag existing project feature flag with links set properly, cannot be null + * @deprecated use {@link #deleteProjectFeatureFlag(ProjectFeatureFlag)} instead */ + @Deprecated public void deleteFeatureFlag(final ProjectFeatureFlag flag) { + deleteProjectFeatureFlag(flag); + } + + /** + * Deletes existing project feature flag. + * + * @param flag existing project feature flag with links set properly, cannot be null + */ + public void deleteProjectFeatureFlag(final ProjectFeatureFlag flag) { notNull(flag, "flag"); notEmpty(flag.getUri(), "flag URI"); try { restTemplate.delete(flag.getUri()); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to delete feature flag=" + flag, e); + throw new GoodDataException("Unable to delete project feature flag: " + flag, e); } } @@ -175,7 +186,7 @@ String getProjectFeatureFlagUri(final Project project, final String flagName) { private ProjectFeatureFlag getProjectFeatureFlag(final String flagUri) { final ProjectFeatureFlag result = restTemplate.getForObject(flagUri, ProjectFeatureFlag.class); if (result == null) { - throw new GoodDataException("flag cannot be retrieved"); + throw new GoodDataException("Project feature flag cannot be retrieved from URI " + flagUri); } return result; } diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index e27e86934..8b04be135 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -473,7 +473,7 @@ public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag * Deletes existing project feature flag. * * @param featureFlag existing project feature flag with links set properly, cannot be null - * @deprecated use {@link FeatureFlagService#deleteFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} + * @deprecated use {@link FeatureFlagService#deleteProjectFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} */ @Deprecated @SuppressWarnings("deprecation") diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 4330ca014..989d7e8d2 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -82,7 +82,7 @@ public void deleteProjectFeatureFlag() throws Exception { gd.getFeatureFlagService().createProjectFeatureFlag(project, new ProjectFeatureFlag("temporaryFeatureFlag")); - gd.getFeatureFlagService().deleteFeatureFlag(featureFlag); + gd.getFeatureFlagService().deleteProjectFeatureFlag(featureFlag); try { gd.getFeatureFlagService().getProjectFeatureFlag(project, featureFlag.getName()); diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 47342e760..9e466e600 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -143,7 +143,7 @@ public void deleteProjectFeatureFlagShouldRemoveIt() throws Exception { final ProjectFeatureFlag flag = MAPPER .readValue(readFromResource("/featureflag/projectFeatureFlag.json"), ProjectFeatureFlag.class); - service.deleteFeatureFlag(flag); + service.deleteProjectFeatureFlag(flag); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index de3f415ea..8719ebcab 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -211,22 +211,41 @@ public void testUpdateProjectFeatureFlag() throws Exception { } @Test(expectedExceptions = IllegalArgumentException.class) - public void whenNullFlagThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + public void whenNullFlagThenDeleteFeatureFlagShouldThrow() throws Exception { service.deleteFeatureFlag(null); } @Test(expectedExceptions = GoodDataException.class) - public void whenClientErrorResponseThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + public void whenClientErrorResponseThenDeleteFeatureFlagShouldThrow() throws Exception { when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); doThrow(new RestClientException("")).when(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); service.deleteFeatureFlag(projectFeatureFlag); } @Test - public void testDeleteProjectFeatureFlag() throws Exception { + public void testDeleteFeatureFlag() throws Exception { when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); service.deleteFeatureFlag(projectFeatureFlag); verify(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); } + @Test(expectedExceptions = IllegalArgumentException.class) + public void whenNullFlagThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + service.deleteProjectFeatureFlag(null); + } + + @Test(expectedExceptions = GoodDataException.class) + public void whenClientErrorResponseThenDeleteProjectFeatureFlagShouldThrow() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + doThrow(new RestClientException("")).when(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); + service.deleteProjectFeatureFlag(projectFeatureFlag); + } + + @Test + public void testDeleteProjectFeatureFlag() throws Exception { + when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); + service.deleteProjectFeatureFlag(projectFeatureFlag); + verify(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); + } + } \ No newline at end of file From dcb1f13482e6f36465ead48c2b55c8cc78469327 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Sun, 17 Apr 2016 22:01:01 +0200 Subject: [PATCH 0350/1191] add url to pom.xml --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index ad7439402..6308c8a9d 100644 --- a/pom.xml +++ b/pom.xml @@ -7,6 +7,7 @@ 1.5.1-SNAPSHOT ${project.artifactId} GoodData Java SDK + https://github.com/martiner/gooddata-java org.sonatype.oss From a33fad5369f908f70b7d472323a0d5989b9a9d85 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 18 Apr 2016 08:17:45 +0200 Subject: [PATCH 0351/1191] fix: deserialize ColumnSynchronize.precision correctly from "columnPrecision" --- src/main/java/com/gooddata/md/DataLoadingColumn.java | 2 +- src/test/resources/md/dataLoadingColumn.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index e34ec64cb..af32f9f79 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -153,7 +153,7 @@ private static class ColumnSynchronize { @JsonCreator private ColumnSynchronize(@JsonProperty("columnType") String type, @JsonProperty("columnLength") Integer length, - @JsonProperty("precision") Integer precision) { + @JsonProperty("columnPrecision") Integer precision) { this.type = type; this.length = length; this.precision = precision; diff --git a/src/test/resources/md/dataLoadingColumn.json b/src/test/resources/md/dataLoadingColumn.json index 5da9b05b9..d292b98a1 100644 --- a/src/test/resources/md/dataLoadingColumn.json +++ b/src/test/resources/md/dataLoadingColumn.json @@ -13,7 +13,7 @@ "columnSynchronize" : { "columnType" : "INT", "columnLength" : 128, - "precision" : 0 + "columnPrecision" : 0 } }, "meta" : { From d6d9adbd6a886c3813993968795f1cff48a96bac Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 19 May 2016 10:10:27 +0200 Subject: [PATCH 0352/1191] Revert "Add @SafeVarargs to MetadataService.usedBy methods" --- src/main/java/com/gooddata/md/MetadataService.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 93f73d455..47fcd38b4 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -306,8 +306,7 @@ public Collection findUris(Project project, * 'table'...) * @return objects using given objects. */ - @SafeVarargs - public final Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { + public Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { notNull(obj, "obj"); return usedBy(project, obj.getUri(), nearest, types); } @@ -322,8 +321,7 @@ public final Collection usedBy(Project project, Obj obj, boolean nearest, * @return objects using given objects. * @see #usedBy(Project, Collection, boolean, Class[]) */ - @SafeVarargs - public final Collection usedBy(Project project, String uri, boolean nearest, Class... types) { + public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { notNull(uri, "uri"); notNull(project, "project"); @@ -341,8 +339,7 @@ public final Collection usedBy(Project project, String uri, boolean neare * @return objects usages * @see #usedBy(Project, String, boolean, Class[]) */ - @SafeVarargs - public final Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { + public Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { notNull(uris, "uris"); notNull(project, "project"); From 23302019a73d4063c9571e65eb8f312d3add6267 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 4 Apr 2016 07:57:36 +0200 Subject: [PATCH 0353/1191] Add @SafeVarargs to MetadataService.usedBy methods It's necessary to make those methods final and that's not backward compatible. --- src/main/java/com/gooddata/md/MetadataService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 47fcd38b4..93f73d455 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -306,7 +306,8 @@ public Collection findUris(Project project, * 'table'...) * @return objects using given objects. */ - public Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { notNull(obj, "obj"); return usedBy(project, obj.getUri(), nearest, types); } @@ -321,7 +322,8 @@ public Collection usedBy(Project project, Obj obj, boolean nearest, Class * @return objects using given objects. * @see #usedBy(Project, Collection, boolean, Class[]) */ - public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, String uri, boolean nearest, Class... types) { notNull(uri, "uri"); notNull(project, "project"); @@ -339,7 +341,8 @@ public Collection usedBy(Project project, String uri, boolean nearest, Cl * @return objects usages * @see #usedBy(Project, String, boolean, Class[]) */ - public Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { + @SafeVarargs + public final Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { notNull(uris, "uris"); notNull(project, "project"); From 5bc1a4f9f80a8c77ddc550ad013887901f6b30d8 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 19 May 2016 11:16:44 +0200 Subject: [PATCH 0354/1191] [maven-release-plugin] prepare release gooddata-java-1.5.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6308c8a9d..f9e1924c4 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.1-SNAPSHOT + 1.5.1 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 11927c35a1c0b84ced3b7bd404cb7a9b0a5fe8b5 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 19 May 2016 11:16:44 +0200 Subject: [PATCH 0355/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f9e1924c4..c291e6226 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.1 + 1.5.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 14ed5bcfdf02f6fa825da51bf552dafd82c03f28 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 19 May 2016 11:23:48 +0200 Subject: [PATCH 0356/1191] Bump version in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 777a2fcda..f1f35e0ca 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.5.0 + 1.5.1 ``` From 1d16bd8f88782a77b6c008dc4d85beee0d7e9d83 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 14 Jul 2016 08:59:04 +0200 Subject: [PATCH 0357/1191] bump version to 2.0.0.RC --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f1f35e0ca..2b358b13b 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.5.1 + 2.0.0.RC ``` diff --git a/pom.xml b/pom.xml index c291e6226..f6edd8073 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.2-SNAPSHOT + 2.0.0.RC-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From aa83a5d609140131b2e1635f2e7b1819a4e6698e Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 14 Jul 2016 13:57:06 +0200 Subject: [PATCH 0358/1191] build release candidate branches in travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ad0e8370c..aa60e061a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,4 +7,5 @@ jdk: branches: only: - master + - /\D\.0\.0-RC/ sudo: false From dc8fdc9f1801db7cf379b2542a814b3fc5596d28 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 14 Jul 2016 14:52:26 +0200 Subject: [PATCH 0359/1191] fix: match the numbered release candidate branch properly --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index aa60e061a..3f65c6ac0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,5 +7,5 @@ jdk: branches: only: - master - - /\D\.0\.0-RC/ + - /\d\.0\.0-RC/ sudo: false From c27bf413451f8be8ee925df9c6990985c4fa8cf9 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 20 May 2016 14:07:59 +0200 Subject: [PATCH 0360/1191] remove deprecated featureflag handling in ProjectService --- .../java/com/gooddata/gdc/FeatureFlag.java | 57 ------- .../java/com/gooddata/gdc/FeatureFlags.java | 67 -------- .../gooddata/project/ProjectFeatureFlag.java | 137 --------------- .../gooddata/project/ProjectFeatureFlags.java | 39 ----- .../com/gooddata/project/ProjectService.java | 156 ------------------ .../featureflag/FeatureFlagsTest.java | 4 +- .../featureflag/ProjectFeatureFlagsTest.java | 4 +- .../com/gooddata/gdc/FeatureFlagsTest.java | 29 ---- .../project/ProjectFeatureFlagTest.java | 45 ----- .../project/ProjectFeatureFlagsTest.java | 49 ------ .../gooddata/project/ProjectServiceIT.java | 143 ---------------- .../gooddata/project/ProjectServiceTest.java | 39 ----- src/test/resources/gdc/featureFlags.json | 6 - src/test/resources/project/feature-flag.json | 9 - src/test/resources/project/feature-flags.json | 29 ---- 15 files changed, 4 insertions(+), 809 deletions(-) delete mode 100644 src/main/java/com/gooddata/gdc/FeatureFlag.java delete mode 100644 src/main/java/com/gooddata/gdc/FeatureFlags.java delete mode 100644 src/main/java/com/gooddata/project/ProjectFeatureFlag.java delete mode 100644 src/main/java/com/gooddata/project/ProjectFeatureFlags.java delete mode 100644 src/test/java/com/gooddata/gdc/FeatureFlagsTest.java delete mode 100644 src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java delete mode 100644 src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java delete mode 100644 src/test/resources/gdc/featureFlags.json delete mode 100644 src/test/resources/project/feature-flag.json delete mode 100644 src/test/resources/project/feature-flags.json diff --git a/src/main/java/com/gooddata/gdc/FeatureFlag.java b/src/main/java/com/gooddata/gdc/FeatureFlag.java deleted file mode 100644 index 4ce05d17a..000000000 --- a/src/main/java/com/gooddata/gdc/FeatureFlag.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.gdc; - -import static com.gooddata.util.Validate.notNull; - -/** - * Feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform. - * It can be used in various scopes (per project, per project group, per user, global etc.). - * - * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.FeatureFlag} instead - */ -@Deprecated -@SuppressWarnings("deprecation") -public class FeatureFlag { - - private final String name; - private boolean enabled; - - public FeatureFlag(final String name, final boolean enabled) { - this.name = notNull(name, "name cannot be null"); - this.enabled = enabled; - } - - public String getName() { - return name; - } - - public boolean getEnabled() { - return enabled; - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final FeatureFlag that = (FeatureFlag) o; - - if (enabled != that.enabled) return false; - return !(name != null ? !name.equals(that.name) : that.name != null); - - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + (enabled ? 1 : 0); - return result; - } - - @Override - public String toString() { - return "{name='" + name + '\'' + ", enabled=" + enabled + "}"; - } -} diff --git a/src/main/java/com/gooddata/gdc/FeatureFlags.java b/src/main/java/com/gooddata/gdc/FeatureFlags.java deleted file mode 100644 index b67883b7e..000000000 --- a/src/main/java/com/gooddata/gdc/FeatureFlags.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.gdc; - -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonTypeInfo; -import com.fasterxml.jackson.annotation.JsonTypeName; -import org.springframework.web.util.UriTemplate; - -import java.util.ArrayList; -import java.util.List; - -import static org.springframework.util.Assert.notNull; - -/** - * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.FeatureFlags} instead - */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("featureFlags") -@JsonIgnoreProperties(ignoreUnknown = true) -@Deprecated -@SuppressWarnings("deprecation") -public class FeatureFlags { - - public static final String AGGREGATED_FEATURE_FLAGS_URI = "/gdc/internal/projects/{projectId}/featureFlags"; - public static final UriTemplate AGGREGATED_FEATURE_FLAGS_TEMPLATE = new UriTemplate(AGGREGATED_FEATURE_FLAGS_URI); - - private final List featureFlags = new ArrayList<>(); - - /* protected helper method for JSON deserialization */ - @JsonAnySetter - protected void addFlag(final String name, final boolean enabled) { - notNull(name); - featureFlags.add(new FeatureFlag(name, enabled)); - } - - /** - * @deprecated use {@link com.gooddata.featureflag.FeatureFlags#isEnabled(String)} method or its {@link Iterable} feature - * @return list of feature flags - */ - @Deprecated - public List getFeatureFlags() { - return featureFlags; - } - - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - final FeatureFlags that = (FeatureFlags) o; - - return !(featureFlags != null ? !featureFlags.equals(that.featureFlags) : that.featureFlags != null); - } - - @Override - public int hashCode() { - return featureFlags != null ? featureFlags.hashCode() : 0; - } - - @Override - public String toString() { - return "FeatureFlags{" + featureFlags + "}"; - } -} diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java b/src/main/java/com/gooddata/project/ProjectFeatureFlag.java deleted file mode 100644 index fb3ffac8c..000000000 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlag.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.gooddata.project; - -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 org.springframework.web.util.UriTemplate; - -import static com.gooddata.util.Validate.notNull; - -/** - * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform - * on per project basis. - * - * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.ProjectFeatureFlags} instead - */ -@JsonTypeName("featureFlag") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Deprecated -public class ProjectFeatureFlag { - - public static final String FEATURE_FLAG_URI = ProjectFeatureFlags.FEATURE_FLAGS_URI + "/{featureFlag}"; - public static final UriTemplate FEATURE_FLAG_TEMPLATE = new UriTemplate(FEATURE_FLAG_URI); - - private final String name; - private boolean enabled; - - @JsonIgnore - private Links links; - - /** - * Creates new project feature flag which is by default enabled (true). - * - * @param name unique name of feature flag - */ - public ProjectFeatureFlag(String name) { - this(name, true, null); - } - - /** - * Creates new project feature flag with given value. - * - * @param name unique name of feature flag - * @param enabled true (flag enabled) or false (flag disabled) - */ - public ProjectFeatureFlag(String name, boolean enabled) { - this(name, enabled, null); - } - - @JsonCreator - ProjectFeatureFlag(@JsonProperty("key") String name, - @JsonProperty("value") boolean enabled, - @JsonProperty("links") Links links) { - this.name = name; - this.enabled = enabled; - this.links = links; - } - - @JsonProperty("key") - public String getName() { - return name; - } - - @JsonProperty("value") - public boolean getEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - @JsonIgnore - public String getUri() { - notNull(links, "links cannot be null if you want to get feature flag uri!"); - return links.getSelf(); - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - final ProjectFeatureFlag that = (ProjectFeatureFlag) o; - - if (enabled != that.enabled) { - return false; - } - return !(name != null ? !name.equals(that.name) : that.name != null); - - } - - @Override - public int hashCode() { - int result = name != null ? name.hashCode() : 0; - result = 31 * result + (enabled ? 1 : 0); - return result; - } - - @Override - public String toString() { - return "FeatureFlag{" + - "name='" + name + '\'' + - ", enabled=" + enabled + - ", links=" + links + - '}'; - } - - @JsonIgnoreProperties(ignoreUnknown = true) - static class Links { - private final String self; - @JsonCreator - public Links(@JsonProperty("self") String self) { - this.self = self; - } - - public String getSelf() { - return self; - } - - @Override - public String toString() { - return "Links{" + - "self='" + self + '\'' + - '}'; - } - } -} diff --git a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java b/src/main/java/com/gooddata/project/ProjectFeatureFlags.java deleted file mode 100644 index 8e617df0a..000000000 --- a/src/main/java/com/gooddata/project/ProjectFeatureFlags.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gooddata.project; - -import static org.springframework.util.CollectionUtils.isEmpty; - -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 org.springframework.web.util.UriTemplate; - -import java.util.ArrayList; -import java.util.List; - -/** - * @deprecated use {@link com.gooddata.featureflag.FeatureFlagService} and {@link com.gooddata.featureflag.ProjectFeatureFlags} instead - */ -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonTypeName("featureFlags") -@JsonIgnoreProperties(ignoreUnknown = true) -@Deprecated -public class ProjectFeatureFlags { - - public static final String FEATURE_FLAGS_URI = Project.URI + "/projectFeatureFlags"; - public static final UriTemplate FEATURE_FLAGS_TEMPLATE = new UriTemplate(FEATURE_FLAGS_URI); - - private final List items = new ArrayList<>(); - - @JsonCreator - ProjectFeatureFlags(@JsonProperty("items") List items) { - if (!isEmpty(items)) { - this.items.addAll(items); - } - } - - public List getItems() { - return items; - } -} diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 8b04be135..5f38c4896 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -13,10 +13,7 @@ import com.gooddata.account.AccountService; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; -import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.gdc.AsyncTask; -import com.gooddata.gdc.FeatureFlag; -import com.gooddata.gdc.FeatureFlags; import com.gooddata.gdc.UriResponse; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; @@ -31,9 +28,6 @@ import java.util.List; import java.util.Set; -import static com.gooddata.gdc.FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE; -import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; -import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.asList; @@ -347,154 +341,4 @@ public Role getRoleByUri(String uri) { throw new GoodDataException("Unable to get role " + uri, e); } } - - /** - * Lists aggregated feature flags for given project and current user (aggregates global, project group, project and user feature flags). - * It doesn't matter whether feature flag is enabled or not, it'll be included in all cases. - * - * @param project project, cannot be null - * @return list of aggregated feature flags for given project and current user - * @deprecated use {@link FeatureFlagService#listFeatureFlags(Project)} instead - */ - @Deprecated - @SuppressWarnings("deprecation") - public List listAggregatedFeatureFlags(final Project project) { - notNull(project, "project"); - try { - final FeatureFlags featureFlags = - restTemplate.getForObject(AGGREGATED_FEATURE_FLAGS_TEMPLATE.expand(project.getId()), - FeatureFlags.class); - - if (featureFlags == null) { - throw new GoodDataException("empty response from API call"); - } - - return featureFlags.getFeatureFlags(); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to list aggregated feature flags for project ID=" + project.getId(), e); - } - } - - /** - * Lists all project feature flags (only project scoped flags, use {@link FeatureFlagService#listFeatureFlags(Project)} - * for aggregated flags from all scopes). - * It doesn't matter whether feature flag is enabled or not, it'll be included in all cases. - * - * @param project project, cannot be null - * @return list of all feature flags for given project - * @deprecated use {@link FeatureFlagService#listProjectFeatureFlags(Project)} instead - */ - @Deprecated - @SuppressWarnings("deprecation") - public List listFeatureFlags(Project project) { - notNull(project, "project"); - try { - final ProjectFeatureFlags projectFeatureFlags = - restTemplate.getForObject(FEATURE_FLAGS_TEMPLATE.expand(project.getId()), ProjectFeatureFlags.class); - - if (projectFeatureFlags == null) { - throw new GoodDataException("empty response from API call"); - } - - return projectFeatureFlags.getItems(); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to list project feature flags for project ID=" + project.getId(), e); - } - } - - /** - * Creates new feature flag for given project. - * - * Usually, it doesn't make sense to create feature flag that is disabled because - * this is the same as having no feature flag at all. - * - * @param project project for which the feature flag should be created, cannot be null - * @param featureFlag feature flag to be created, cannot be null - * @return created feature flag - * @deprecated use {@link FeatureFlagService#createProjectFeatureFlag(Project, com.gooddata.featureflag.ProjectFeatureFlag)} - */ - @Deprecated - @SuppressWarnings("deprecation") - public ProjectFeatureFlag createFeatureFlag(final Project project, final ProjectFeatureFlag featureFlag) { - notNull(project, "project"); - notNull(featureFlag, "featureFlag"); - - final String featureFlagsUri = FEATURE_FLAGS_TEMPLATE.expand(project.getId()).toString(); - - try { - final URI featureFlagUri = restTemplate.postForLocation(featureFlagsUri, featureFlag); - notNull(featureFlagsUri, "URI of new featureFlag"); - return getFeatureFlag(featureFlagUri.toString()); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to create feature flag: " + featureFlag, e); - } - } - - /** - * Get feature flag by unique name (aka "key"). - * - * @param project project, cannot be null - * @param featureFlagName name of feature flag, cannot be empty - * @return feature flag - * @deprecated use {@link FeatureFlagService#getProjectFeatureFlag(Project, String)} - */ - @Deprecated - @SuppressWarnings("deprecation") - public ProjectFeatureFlag getFeatureFlag(final Project project, final String featureFlagName) { - notNull(project, "project"); - notEmpty(featureFlagName, "featureFlagName"); - - return restTemplate.getForObject(getFeatureFlagUri(project, featureFlagName), ProjectFeatureFlag.class); - } - - /** - * Updates existing feature flag. - * Note that it doesn't make sense to update any other field than {@link ProjectFeatureFlag#enabled}. - * - * @param featureFlag updated feature flag - * @return updated feature flag - * @deprecated use {@link FeatureFlagService#updateProjectFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} - */ - @Deprecated - @SuppressWarnings("deprecation") - public ProjectFeatureFlag updateFeatureFlag(final ProjectFeatureFlag featureFlag) { - notNull(featureFlag, "featureFlag"); - notEmpty(featureFlag.getUri(), "featureFlag"); - - try { - restTemplate.put(featureFlag.getUri(), featureFlag); - return getFeatureFlag(featureFlag.getUri()); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to create feature flag: " + featureFlag, e); - } - } - - /** - * Deletes existing project feature flag. - * - * @param featureFlag existing project feature flag with links set properly, cannot be null - * @deprecated use {@link FeatureFlagService#deleteProjectFeatureFlag(com.gooddata.featureflag.ProjectFeatureFlag)} - */ - @Deprecated - @SuppressWarnings("deprecation") - public void deleteFeatureFlag(ProjectFeatureFlag featureFlag) { - notNull(featureFlag, "featureFlag"); - notEmpty(featureFlag.getUri(), "featureFlag URI"); - - try { - restTemplate.delete(featureFlag.getUri()); - } catch (GoodDataRestException | RestClientException e) { - throw new GoodDataException("Unable to delete feature flag=" + featureFlag, e); - } - } - - - @SuppressWarnings("deprecation") - private ProjectFeatureFlag getFeatureFlag(String featureFlagUri) { - return restTemplate.getForObject(featureFlagUri, ProjectFeatureFlag.class); - } - - private String getFeatureFlagUri(final Project project, final String featureFlagName) { - return FEATURE_FLAG_TEMPLATE.expand(project.getId(), featureFlagName).toString(); - } } diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java index df9664834..18a65c246 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java @@ -16,7 +16,7 @@ public class FeatureFlagsTest { @Test public void testDeserialize() { - final FeatureFlags flags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", FeatureFlags.class); + final FeatureFlags flags = readObjectFromResource(getClass(), "/featureflag/featureFlags.json", FeatureFlags.class); assertNotNull(flags); assertThat(flags, containsInAnyOrder( @@ -26,7 +26,7 @@ public void testDeserialize() { @Test public void shouldIterateThroughFlagsInForeach() throws Exception { - final FeatureFlags flags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", FeatureFlags.class); + final FeatureFlags flags = readObjectFromResource(getClass(), "/featureflag/featureFlags.json", FeatureFlags.class); for (FeatureFlag flag : flags) { assertThat(flag, isOneOf( new FeatureFlag("testFeature", true), diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java index b9b29fef0..663e6e210 100644 --- a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java @@ -23,7 +23,7 @@ public class ProjectFeatureFlagsTest { @Test public void testDeserialize() { - final ProjectFeatureFlags featureFlags = readObjectFromResource(getClass(), "/project/feature-flags.json", + final ProjectFeatureFlags featureFlags = readObjectFromResource(getClass(), "/featureflag/projectFeatureFlags.json", ProjectFeatureFlags.class); assertNotNull(featureFlags); @@ -48,7 +48,7 @@ public void testSerialize() throws IOException { @Test public void shouldIterateThroughFlagsInForeach() throws Exception { - final ProjectFeatureFlags flags = readObjectFromResource(getClass(), "/project/feature-flags.json", + final ProjectFeatureFlags flags = readObjectFromResource(getClass(), "/featureflag/projectFeatureFlags.json", ProjectFeatureFlags.class); for (ProjectFeatureFlag flag : flags) { assertThat(flag, isOneOf( diff --git a/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java b/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java deleted file mode 100644 index 54ef24649..000000000 --- a/src/test/java/com/gooddata/gdc/FeatureFlagsTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.gdc; - -import org.testng.annotations.Test; - -import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.hasSize; -import static org.testng.AssertJUnit.assertNotNull; - -@SuppressWarnings("deprecation") -public class FeatureFlagsTest { - - @Test - public void testDeserialize() { - final FeatureFlags featureFlags = readObjectFromResource(getClass(), "/gdc/featureFlags.json", - FeatureFlags.class); - - assertNotNull(featureFlags); - assertThat(featureFlags.getFeatureFlags(), hasSize(2)); - assertThat(featureFlags.getFeatureFlags(), contains( - new FeatureFlag("testFeature", true), - new FeatureFlag("testFeature2", false))); - } - -} diff --git a/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java b/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java deleted file mode 100644 index 1151ca2d3..000000000 --- a/src/test/java/com/gooddata/project/ProjectFeatureFlagTest.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gooddata.project; - -import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; -import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; -import static org.hamcrest.core.StringContains.containsString; -import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.testng.AssertJUnit.assertTrue; - -import org.testng.annotations.Test; - -import java.io.IOException; - -public class ProjectFeatureFlagTest { - - @Test - public void testDeserialize() { - final ProjectFeatureFlag featureFlag = readObjectFromResource(getClass(), "/project/feature-flag.json", ProjectFeatureFlag.class); - assertThat(featureFlag.getName(), is("myCoolFeature")); - assertTrue(featureFlag.getEnabled()); - assertThat(featureFlag.getUri(), is("/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature")); - } - - @Test - public void testSerializeDefaultValueTrue() throws IOException { - checkFeatureFlagSerialization(new ProjectFeatureFlag("myFeature"), true); - } - - @Test - public void testSerializeWithValueFalse() throws IOException { - checkFeatureFlagSerialization(new ProjectFeatureFlag("myFeature", false), false); - } - - - private void checkFeatureFlagSerialization(ProjectFeatureFlag featureFlag, boolean expectedValue) throws IOException { - final String serializedFeatureFlag = OBJECT_MAPPER.writeValueAsString(featureFlag); - - assertThat(serializedFeatureFlag, startsWith("{\"featureFlag\"")); - assertThat(serializedFeatureFlag, containsString("\"key\":\"myFeature\"")); - assertThat(serializedFeatureFlag, containsString("\"value\":" + expectedValue)); - assertThat(serializedFeatureFlag, not(containsString("\"links\""))); - } -} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java deleted file mode 100644 index fa8e5211d..000000000 --- a/src/test/java/com/gooddata/project/ProjectFeatureFlagsTest.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.gooddata.project; - -import org.testng.annotations.Test; - -import java.io.IOException; -import java.util.Collections; - -import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; -import static com.gooddata.util.ResourceUtils.readObjectFromResource; -import static java.util.Arrays.asList; -import static java.util.Collections.singletonList; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.isOneOf; -import static org.hamcrest.core.StringContains.containsString; -import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.testng.AssertJUnit.assertNotNull; - -@SuppressWarnings("deprecation") -public class ProjectFeatureFlagsTest { - - @Test - public void testDeserialize() { - final ProjectFeatureFlags featureFlags = readObjectFromResource(getClass(), "/project/feature-flags.json", - ProjectFeatureFlags.class); - assertNotNull(featureFlags); - - assertThat(featureFlags.getItems(), containsInAnyOrder( - new ProjectFeatureFlag("myCoolFeature", true), - new ProjectFeatureFlag("mySuperCoolFeature", true), - new ProjectFeatureFlag("mySuperSecretFeature", false))); - } - - @Test - public void testSerialize() throws IOException { - final ProjectFeatureFlags projectFeatureFlags = new ProjectFeatureFlags(asList( - new ProjectFeatureFlag("enabledFeatureFlag", true), - new ProjectFeatureFlag("disabledFeatureFlag", false))); - - final String serializedFeatureFlags = OBJECT_MAPPER.writeValueAsString(projectFeatureFlags); - - assertThat(serializedFeatureFlags, startsWith("{\"featureFlags\"")); - assertThat(serializedFeatureFlags, containsString("\"key\":\"enabledFeatureFlag\",\"value\":true")); - assertThat(serializedFeatureFlags, containsString("\"key\":\"disabledFeatureFlag\",\"value\":false")); - } - -} \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 83206c2c8..a54f654f2 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -4,8 +4,6 @@ import com.gooddata.GoodDataException; import com.gooddata.collections.PageRequest; import com.gooddata.gdc.AsyncTask; -import com.gooddata.gdc.FeatureFlag; -import com.gooddata.gdc.FeatureFlags; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; import com.fasterxml.jackson.databind.ObjectMapper; @@ -13,10 +11,7 @@ import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.isJsonString; -import static com.gooddata.project.ProjectFeatureFlags.FEATURE_FLAGS_TEMPLATE; -import static com.gooddata.project.ProjectFeatureFlag.FEATURE_FLAG_TEMPLATE; import static com.gooddata.util.ResourceUtils.readFromResource; -import static com.gooddata.util.ResourceUtils.readStringFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; @@ -29,7 +24,6 @@ import java.util.List; import java.util.Set; -@SuppressWarnings("deprecation") public class ProjectServiceIT extends AbstractGoodDataIT { private static final ObjectMapper MAPPER = new ObjectMapper(); @@ -322,141 +316,4 @@ public void shouldListPagedUsers() throws Exception { assertThat(secondPage, empty()); } - @Test - public void shouldListAggregatedFeatureFlags() throws Exception { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(FeatureFlags.AGGREGATED_FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) - .respond() - .withBody(readStringFromResource("/gdc/featureFlags.json")) - .withStatus(200); - - final List featureFlags = gd.getProjectService().listAggregatedFeatureFlags(enabled); - - assertThat(featureFlags, hasSize(2)); - assertThat(featureFlags, contains( - new FeatureFlag("testFeature", true), - new FeatureFlag("testFeature2", false))); - } - - @Test - public void shouldListProjectFeatureFlags() throws Exception { - - mockListFeatureFlagsRequest(); - - final List projectFeatureFlags = gd.getProjectService().listFeatureFlags(enabled); - - assertThat(projectFeatureFlags, contains( - new ProjectFeatureFlag("myCoolFeature", true), - new ProjectFeatureFlag("mySuperCoolFeature", true), - new ProjectFeatureFlag("mySuperSecretFeature", false))); - } - - @Test - public void shouldGetProjectFeatureFlag() { - final String featureFlagName = "myCoolFeature"; - - mockGetFeatureFlagRequest(getFeatureFlagUri(featureFlagName), true); - - final ProjectFeatureFlag featureFlag = gd.getProjectService().getFeatureFlag(enabled, featureFlagName); - - checkFeatureFlag(featureFlag, featureFlagName, true); - } - - @Test - public void shouldSetProjectFeatureFlag() { - final String featureFlagName = "myCoolFeature"; - - final String featureFlagUri = getFeatureFlagUri(featureFlagName); - - mockCreateFeatureFlagRequest(featureFlagUri); - - mockGetFeatureFlagRequest(featureFlagUri, true); - - final ProjectFeatureFlag featureFlag = gd.getProjectService().createFeatureFlag(enabled, - new ProjectFeatureFlag(featureFlagName)); - - checkFeatureFlag(featureFlag, featureFlagName, true); - } - - @Test - public void shouldDisableExistingFeatureFlag() { - - final String featureFlagName = "myCoolFeature"; - - final String featureFlagUri = getFeatureFlagUri(featureFlagName); - mockUpdateFeatureFlagRequest(featureFlagUri); - mockGetFeatureFlagRequest(featureFlagUri, false); - - final ProjectFeatureFlag updatedFeatureFlag = gd.getProjectService().updateFeatureFlag( - new ProjectFeatureFlag(featureFlagName, false, new ProjectFeatureFlag.Links(featureFlagUri))); - - checkFeatureFlag(updatedFeatureFlag, featureFlagName, false); - } - - @Test - public void shouldDeleteExistingFeatureFlag() { - - final String featureFlagName = "myCoolFeature"; - - final String featureFlagUri = getFeatureFlagUri(featureFlagName); - onRequest() - .havingMethodEqualTo("DELETE") - .havingPathEqualTo(featureFlagUri) - .respond() - .withStatus(204); - - gd.getProjectService().deleteFeatureFlag(new ProjectFeatureFlag(featureFlagName, true, - new ProjectFeatureFlag.Links(featureFlagUri))); - } - - - private String getFeatureFlagUri(String featureFlagName) { - return FEATURE_FLAG_TEMPLATE.expand(PROJECT_ID, featureFlagName).toString(); - } - - private void mockListFeatureFlagsRequest() { - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) - .respond() - .withBody(readStringFromResource("/project/feature-flags.json")) - .withStatus(200); - } - - private void mockCreateFeatureFlagRequest(String featureFlagUri) { - onRequest() - .havingMethodEqualTo("POST") - .havingPathEqualTo(FEATURE_FLAGS_TEMPLATE.expand(PROJECT_ID).toString()) - .respond() - .withHeader("Location", featureFlagUri) - .withStatus(201); - } - - private void mockGetFeatureFlagRequest(String featureFlagUri, boolean featureFlagValue) { - final String jsonWithValue = readStringFromResource("/project/feature-flag.json") - .replaceAll("\"value\"\\s*:\\s*(true|false)", - "\"value\" : " + featureFlagValue); - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(featureFlagUri) - .respond() - .withBody(jsonWithValue) - .withStatus(200); - } - - private void mockUpdateFeatureFlagRequest(String featureFlagUri) { - onRequest() - .havingMethodEqualTo("PUT") - .havingPathEqualTo(featureFlagUri) - .respond() - .withStatus(200); - } - - private void checkFeatureFlag(ProjectFeatureFlag featureFlag, String expectedName, boolean expectedValue) { - assertThat(featureFlag, is(notNullValue())); - assertThat(featureFlag.getName(), is(expectedName)); - assertThat(featureFlag.getEnabled(), is(expectedValue)); - } - } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java index c72e7f0a2..b04dab0ae 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceTest.java +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -7,8 +7,6 @@ import com.gooddata.GoodDataRestException; import com.gooddata.account.Account; import com.gooddata.account.AccountService; -import com.gooddata.gdc.FeatureFlag; -import com.gooddata.gdc.FeatureFlags; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.web.client.RestClientException; @@ -16,9 +14,7 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -import java.net.URI; import java.util.Collection; -import java.util.List; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.hasItem; @@ -28,13 +24,11 @@ import static org.hamcrest.Matchers.hasSize; import static org.mockito.Mockito.when; -@SuppressWarnings("deprecation") public class ProjectServiceTest { private static final String ACCOUNT_ID = "17"; private static final String ID = "11"; private static final String URI = "/gdc/projects/11"; - private static final String FEATURE_FLAGS_URI = "/gdc/internal/projects/11/featureFlags"; @Mock private Project project; @@ -116,37 +110,4 @@ public void testGetProjectById() throws Exception { final Project result = service.getProjectById(ID); assertThat(result, is(project)); } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testListAggregatedFeatureFlagsWithNullId() throws Exception { - service.listAggregatedFeatureFlags(null); - } - - @Test(expectedExceptions = GoodDataException.class) - public void testListAggregatedFeatureFlagsWithEmptyResponse() throws Exception { - when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)).thenReturn(null); - service.listAggregatedFeatureFlags(project); - } - - @Test(expectedExceptions = GoodDataException.class) - public void testListAggregatedFeatureFlagsWithClientErrorResponse() throws Exception { - when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)) - .thenThrow(new RestClientException("")); - service.listAggregatedFeatureFlags(project); - } - - @Test - public void testListAggregatedFeatureFlags() throws Exception { - when(restTemplate.getForObject(new URI(FEATURE_FLAGS_URI), FeatureFlags.class)) - .thenReturn(new FeatureFlags() {{ - this.addFlag("flag1", true); - }}); - - final List flagList = service.listAggregatedFeatureFlags(project); - - assertThat(flagList, hasSize(1)); - assertThat(flagList, contains( - new FeatureFlag("flag1", true))); - } - } \ No newline at end of file diff --git a/src/test/resources/gdc/featureFlags.json b/src/test/resources/gdc/featureFlags.json deleted file mode 100644 index 72ff8f9d2..000000000 --- a/src/test/resources/gdc/featureFlags.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "featureFlags": { - "testFeature": true, - "testFeature2": false - } -} \ No newline at end of file diff --git a/src/test/resources/project/feature-flag.json b/src/test/resources/project/feature-flag.json deleted file mode 100644 index 26916a200..000000000 --- a/src/test/resources/project/feature-flag.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "featureFlag" : { - "key" : "myCoolFeature", - "value" : true, - "links" : { - "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" - } - } -} \ No newline at end of file diff --git a/src/test/resources/project/feature-flags.json b/src/test/resources/project/feature-flags.json deleted file mode 100644 index 1e77993a7..000000000 --- a/src/test/resources/project/feature-flags.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "featureFlags" : { - "items" : [ { - "featureFlag" : { - "key" : "myCoolFeature", - "value" : true, - "links" : { - "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/myCoolFeature" - } - } - }, { - "featureFlag" : { - "key" : "mySuperCoolFeature", - "value" : true, - "links" : { - "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperCoolFeature" - } - } - }, { - "featureFlag" : { - "key" : "mySuperSecretFeature", - "value" : false, - "links" : { - "self" : "/gdc/projects/PROJECT_ID/projectFeatureFlags/mySuperSecretFeature" - } - } - }] - } -} \ No newline at end of file From 7cd18899a1ea7b43a6caf6d49c8800642fb93c0c Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 20 May 2016 14:55:22 +0200 Subject: [PATCH 0361/1191] remove deprecated featureflag delete method --- .../featureflag/FeatureFlagService.java | 11 ----------- .../featureflag/FeatureFlagServiceTest.java | 19 ------------------- 2 files changed, 30 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 1f63beff8..415e4a408 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -151,17 +151,6 @@ public ProjectFeatureFlag updateProjectFeatureFlag(final ProjectFeatureFlag flag } } - /** - * Deletes existing project feature flag. - * - * @param flag existing project feature flag with links set properly, cannot be null - * @deprecated use {@link #deleteProjectFeatureFlag(ProjectFeatureFlag)} instead - */ - @Deprecated - public void deleteFeatureFlag(final ProjectFeatureFlag flag) { - deleteProjectFeatureFlag(flag); - } - /** * Deletes existing project feature flag. * diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index 8719ebcab..62b2feec6 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -210,25 +210,6 @@ public void testUpdateProjectFeatureFlag() throws Exception { assertThat(result, is(newFlag)); } - @Test(expectedExceptions = IllegalArgumentException.class) - public void whenNullFlagThenDeleteFeatureFlagShouldThrow() throws Exception { - service.deleteFeatureFlag(null); - } - - @Test(expectedExceptions = GoodDataException.class) - public void whenClientErrorResponseThenDeleteFeatureFlagShouldThrow() throws Exception { - when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); - doThrow(new RestClientException("")).when(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); - service.deleteFeatureFlag(projectFeatureFlag); - } - - @Test - public void testDeleteFeatureFlag() throws Exception { - when(projectFeatureFlag.getUri()).thenReturn(PROJECT_FEATURE_FLAG_URI); - service.deleteFeatureFlag(projectFeatureFlag); - verify(restTemplate).delete(PROJECT_FEATURE_FLAG_URI); - } - @Test(expectedExceptions = IllegalArgumentException.class) public void whenNullFlagThenDeleteProjectFeatureFlagShouldThrow() throws Exception { service.deleteProjectFeatureFlag(null); From b8b8983ada68aa9a39d0553b070c1a5e265329ee Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 31 May 2016 08:31:58 +0200 Subject: [PATCH 0362/1191] remove deprecated Warehouse.getJdbcConnectionString use getConnectionUrl() instead --- src/main/java/com/gooddata/warehouse/Warehouse.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 5a5b24d67..d6967cc00 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -147,17 +147,6 @@ public Map getLinks() { return links; } - /** - * Get jdbc connection string. Works only on Warehouse loaded from API (using WarehouseService). - * @deprecated Use {@link #getConnectionUrl()} instead. - * @return jdbc connection string - */ - @JsonIgnore - @Deprecated - public String getJdbcConnectionString() { - return getConnectionUrl(); - } - @JsonIgnore public String getUri() { return links != null ? links.get(SELF_LINK): null; From a3e7ca510b611c80a61a11e4d5af5e1d3077a7d7 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 31 May 2016 08:35:35 +0200 Subject: [PATCH 0363/1191] remove deprecated ProjectFeatureFlags.getItems use isEnabled(String) method or Iterable feature of ProjectFeatureFlags class --- .../com/gooddata/featureflag/ProjectFeatureFlags.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java index 33861277b..758778cd3 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java @@ -22,6 +22,7 @@ public class ProjectFeatureFlags implements Iterable { public static final String PROJECT_FEATURE_FLAGS_URI = Project.URI + "/projectFeatureFlags"; public static final UriTemplate PROJECT_FEATURE_FLAGS_TEMPLATE = new UriTemplate(PROJECT_FEATURE_FLAGS_URI); + @JsonProperty("items") private final List items = new LinkedList<>(); @JsonCreator @@ -52,12 +53,4 @@ public boolean isEnabled(final String flagName) { return false; } - /** - * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class - * @return list of project feature flags - */ - @Deprecated - public List getItems() { - return items; - } } From dd091e5e88c1c322a4fb0227df359263f153d448 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 31 May 2016 08:36:31 +0200 Subject: [PATCH 0364/1191] remove deprecated FeatureFlags.getFeatureFlags use isEnabled(String) method or Iterable feature of FeatureFlags class --- src/main/java/com/gooddata/featureflag/FeatureFlags.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index eb25d66a2..4ecce59b3 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -33,15 +33,6 @@ protected void addFlag(final String name, final boolean enabled) { featureFlags.add(new FeatureFlag(name, enabled)); } - /** - * @deprecated use {@link #isEnabled(String)} method or {@link Iterable} feature of this class - * @return list of feature flags - */ - @Deprecated - public List getFeatureFlags() { - return featureFlags; - } - @Override public Iterator iterator() { return featureFlags.iterator(); From efca80911f9bb6c6ac6245a2f3b674fe7acb3686 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 14 Jul 2016 13:08:28 +0200 Subject: [PATCH 0365/1191] remove deprecated paging constructor --- src/main/java/com/gooddata/collections/Paging.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index ca80477a9..f03e4c3c6 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -28,11 +28,6 @@ public Paging(@JsonProperty("offset") final String offset, @JsonProperty("next") this.next = next == null ? null : new UriPage(next); } - @Deprecated - public Paging(final int offset, final int count, final String next) { - this(Integer.toString(offset), next); - } - public Paging(final String next) { this(null, next); } From 7a23d3e614b8c6e8abea3a78dff60b16607af9f5 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 14 Jul 2016 13:11:06 +0200 Subject: [PATCH 0366/1191] remove deprecated getDataset method from DatasetException use getDatasets method instead --- src/main/java/com/gooddata/dataset/DatasetException.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetException.java b/src/main/java/com/gooddata/dataset/DatasetException.java index 11f42ae7a..b217d0cb3 100644 --- a/src/main/java/com/gooddata/dataset/DatasetException.java +++ b/src/main/java/com/gooddata/dataset/DatasetException.java @@ -41,13 +41,4 @@ public Collection getDatasets() { return datasets; } - /** - * @return string representation of collection containing dataset names - * @deprecated since this exception may contain more than one dataset, use {@link #getDatasets} instead - * @see #getDatasets() - */ - @Deprecated - public String getDataset() { - return datasets.toString(); - } } From e69f120fe24259cd6bd42f5d23048b6bceff7a38 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 20 May 2016 11:03:56 +0200 Subject: [PATCH 0367/1191] use spring 4.3.1.RELEASE --- README.md | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b358b13b..aa876d134 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info 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 *Spring Framework* version 3.x +* the *Spring Framework* version 4.3.* * the *Jackson JSON Processor* version 2.7.0 (*GoodData Java SDK* version 0.x requires version 1.9) * the *Java Development Kit (JDK)* version 7 or later diff --git a/pom.xml b/pom.xml index f6edd8073..0875e9700 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ UTF-8 4.3.3 2.7.0 - 3.2.13.RELEASE + 4.3.1.RELEASE 1.1.1 1.5.3 From a8edb0e06ad6fb70d4aa2b54c5b51ea389a83dd2 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 20 May 2016 11:31:30 +0200 Subject: [PATCH 0368/1191] upgrade to jackson 2.8.0 and use DateTime for zendesk start times There was a BUG in jackson https://github.com/FasterXML/jackson-databind/issues/1124 fixed in 2.7.2. In addition spring 4.3.0 officially claims compatibility with jackson 2.8.0 --- README.md | 2 +- pom.xml | 2 +- .../connector/Zendesk4ProcessExecution.java | 16 +++++++--------- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index aa876d134..2b699d91e 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,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.3 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.7.0 (*GoodData Java SDK* version 0.x requires version 1.9) +* the *Jackson JSON Processor* version 2.8.* * the *Java Development Kit (JDK)* version 7 or later ## License diff --git a/pom.xml b/pom.xml index 0875e9700..7b44cfe26 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ UTF-8 UTF-8 4.3.3 - 2.7.0 + 2.8.0 4.3.1.RELEASE 1.1.1 1.5.3 diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index a2fca64d0..8fd3e0e3d 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -8,10 +8,9 @@ import static com.gooddata.util.Validate.notNull; import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.ISODateTimeSerializer; import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.joda.time.format.DateTimeFormatter; -import org.joda.time.format.ISODateTimeFormat; import java.util.Map; import java.util.TreeMap; @@ -21,11 +20,9 @@ */ public class Zendesk4ProcessExecution implements ProcessExecution { - private static final DateTimeFormatter FORMATTER = ISODateTimeFormat.dateTime().withZone(DateTimeZone.UTC); - private Boolean incremental; - private Map startTimes; + private Map startTimes; @Override public ConnectorType getConnectorType() { @@ -41,7 +38,8 @@ public void setIncremental(final Boolean incremental) { } @JsonAnyGetter - public Map getStartTimes() { + @JsonSerialize(contentUsing = ISODateTimeSerializer.class) + public Map getStartTimes() { return startTimes; } @@ -50,8 +48,8 @@ public void setStartTime(final String resource, final DateTime startTime) { notEmpty(resource, "resource can't be empty"); notNull(startTime, "startTime can't be null"); - startTimes = startTimes == null ? new TreeMap() : startTimes; + startTimes = startTimes == null ? new TreeMap() : startTimes; - startTimes.put(resource + "StartDate", FORMATTER.print(startTime)); + startTimes.put(resource + "StartDate", startTime); } } From 3c8b19c12167ceccc4ddac38939c1e502323e594 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 15 Jul 2016 10:57:19 +0200 Subject: [PATCH 0369/1191] do not use deprecated GoodDataHttpClient constructor --- src/main/java/com/gooddata/GoodData.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 52b13dad6..5bd4173d8 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -233,8 +233,8 @@ protected HttpClient createHttpClient(final String login, final String password, final int port, final String protocol, final HttpClientBuilder builder) { final HttpHost host = new HttpHost(hostname, port, protocol); final HttpClient httpClient = builder.build(); - final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(httpClient, host, login, password); - return new GoodDataHttpClient(httpClient, strategy); + final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(login, password); + return new GoodDataHttpClient(httpClient, host, strategy); } private String getUserAgent() { From d81990bf43030b3c824f71acb5a72a4eace8ff82 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 18 Apr 2016 08:58:34 +0200 Subject: [PATCH 0370/1191] Use set of strings for tags in Meta object --- .../java/com/gooddata/md/AbstractObj.java | 6 ++- src/main/java/com/gooddata/md/Meta.java | 12 +++--- .../java/com/gooddata/md/ScheduledMail.java | 24 +++++------ .../java/com/gooddata/project/Project.java | 2 +- .../com/gooddata/util/TagsDeserializer.java | 37 +++++++++++++++++ .../com/gooddata/util/TagsSerializer.java | 23 +++++++++++ src/test/java/com/gooddata/md/MetaTest.java | 7 +++- src/test/java/com/gooddata/md/ObjTest.java | 5 ++- .../gooddata/util/TagsDeserializerTest.java | 34 +++++++++++++++ .../com/gooddata/util/TagsSerializerTest.java | 41 +++++++++++++++++++ .../java/com/gooddata/util/TagsTestClass.java | 26 ++++++++++++ 11 files changed, 195 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gooddata/util/TagsDeserializer.java create mode 100644 src/main/java/com/gooddata/util/TagsSerializer.java create mode 100644 src/test/java/com/gooddata/util/TagsDeserializerTest.java create mode 100644 src/test/java/com/gooddata/util/TagsSerializerTest.java create mode 100644 src/test/java/com/gooddata/util/TagsTestClass.java diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index b0847d8dd..7f383a0d8 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -7,6 +7,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import org.joda.time.DateTime; +import java.util.Set; + import static com.gooddata.util.Validate.noNullElements; /** @@ -69,11 +71,11 @@ public void setCategory(String category) { } @JsonIgnore - public String getTags() { + public Set getTags() { return meta.getTags(); } - public void setTags(String tags) { + public void setTags(Set tags) { meta.setTags(tags); } diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index fb713fa11..7284b59c3 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -13,6 +13,7 @@ import org.joda.time.DateTime; import java.io.Serializable; +import java.util.Set; import static org.apache.commons.lang.StringUtils.substring; @@ -33,7 +34,7 @@ public class Meta implements Serializable { private String summary; private String title; private String category; - private String tags; //TODO collection + private Set tags; private String uri; private String identifier; private Boolean deprecated; @@ -50,7 +51,7 @@ protected Meta(@JsonProperty("author") String author, @JsonProperty("summary") String summary, @JsonProperty("title") String title, @JsonProperty("category") String category, - @JsonProperty("tags") String tags, + @JsonProperty("tags") @JsonDeserialize(using = TagsDeserializer.class) Set tags, @JsonProperty("uri") String uri, @JsonProperty("identifier") String identifier) { super(); @@ -67,7 +68,7 @@ protected Meta(@JsonProperty("author") String author, } public Meta(String author, String contributor, DateTime created, DateTime updated, String summary, - String title, String category, String tags, String uri, String identifier, + String title, String category, Set tags, String uri, String identifier, Boolean deprecated, Boolean production, Boolean locked, Boolean unlisted, Boolean sharedWithSomeone) { this.author = author; this.contributor = contributor; @@ -137,11 +138,12 @@ public void setCategory(String category) { this.category = category; } - public String getTags() { + @JsonSerialize(using = TagsSerializer.class) + public Set getTags() { return tags; } - public void setTags(String tags) { + public void setTags(Set tags) { this.tags = tags; } diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index d8a6d33b2..76b8093de 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -3,14 +3,9 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.*; import com.gooddata.md.report.ReportDefinition; import com.gooddata.report.ReportExportFormat; -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 org.joda.time.LocalDate; import java.util.*; @@ -35,14 +30,17 @@ public class ScheduledMail extends AbstractObj implements Queryable, Updatable { this.content = content; } - private ScheduledMail(String title, String summary, String tags, boolean deprecated, String recurrency, 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)); + private ScheduledMail(String title, String summary, Set tags, boolean deprecated, String recurrency, + 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)); notNull(toAddresses, "toAddresses"); notNull(subject, "subject"); notNull(body, "body"); notNull(attachments, "attachments"); - content = new Content(new ScheduledMailWhen(recurrency, startDate, timeZone), toAddresses, bccAddresses, subject, body, attachments); + content = new Content(new ScheduledMailWhen(recurrency, startDate, timeZone), toAddresses, bccAddresses, + subject, body, attachments); } /** @@ -52,7 +50,8 @@ private ScheduledMail(String title, String summary, String tags, boolean depreca * @param summary the summary of the MD object */ public ScheduledMail(String title, String summary) { - super(new Meta(null, null, null, null, summary, title, null, "", null, null, false, null, false, false, null)); + super(new Meta(null, null, null, null, summary, title, null, Collections.emptySet(), null, null, false, + null, false, false, null)); this.content = new Content(); } @@ -73,7 +72,8 @@ public ScheduledMail(String title, String summary) { public ScheduledMail(String title, String summary, String recurrency, LocalDate startDate, String timeZone, Collection toAddresses, Collection bccAddresses, String subject, String body, List attachments) { - this(title, summary, "", false, recurrency, startDate, timeZone, toAddresses, bccAddresses, subject, body, attachments); + this(title, summary, Collections.emptySet(), false, recurrency, startDate, timeZone, toAddresses, + bccAddresses, subject, body, attachments); } /** diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 1f2c13483..62972d127 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -482,7 +482,7 @@ private ProjectMeta(@JsonProperty("author") String author, @JsonProperty("summary") String summary, @JsonProperty("title") String title, @JsonProperty("category") String category, - @JsonProperty("tags") String tags, + @JsonProperty("tags") Set tags, @JsonProperty("uri") String uri, @JsonProperty("identifier") String identifier, @JsonProperty("deprecated") @JsonDeserialize(using = BooleanDeserializer.class) Boolean deprecated, diff --git a/src/main/java/com/gooddata/util/TagsDeserializer.java b/src/main/java/com/gooddata/util/TagsDeserializer.java new file mode 100644 index 000000000..7e9a2ed17 --- /dev/null +++ b/src/main/java/com/gooddata/util/TagsDeserializer.java @@ -0,0 +1,37 @@ +package com.gooddata.util; + +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 java.io.IOException; +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + +import static com.gooddata.util.Validate.notNull; + +/** + * Deserializes whitespace separated tags from one string to set of tags (strings) + */ +public class TagsDeserializer extends JsonDeserializer> { + + @Override + public Set deserialize(JsonParser jp, DeserializationContext ctx) throws IOException { + final JsonNode root = jp.readValueAsTree(); + notNull(root, "jsonNode"); + if (root.isTextual()) { + final Scanner scanner = new Scanner(root.textValue()); + final HashSet tags = new HashSet<>(); + while (scanner.hasNext()) { + tags.add(scanner.next()); + } + return tags; + } else { + throw new JsonMappingException(jp, "Unknown value of type: " + root.getNodeType(), jp.getCurrentLocation()); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/gooddata/util/TagsSerializer.java b/src/main/java/com/gooddata/util/TagsSerializer.java new file mode 100644 index 000000000..dd539bc41 --- /dev/null +++ b/src/main/java/com/gooddata/util/TagsSerializer.java @@ -0,0 +1,23 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.util; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.commons.lang.StringUtils; + +import java.io.IOException; +import java.util.Set; + +/** + * Serializes set of tags (strings) to whitespace separated string of tags + */ +public class TagsSerializer extends JsonSerializer> { + + @Override + public void serialize(Set set, JsonGenerator gen, SerializerProvider provider) throws IOException { + gen.writeString(StringUtils.join(set, " ")); + } +} \ 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 c1c945934..08192eb8d 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -8,7 +8,12 @@ import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -22,7 +27,7 @@ public class MetaTest { public static final String TITLE = "Obj title"; public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 57, DateTimeZone.UTC); public static final String CATEGORY = "attributeDisplayForm"; - public static final String TAGS = "TAG1 TAG2"; + public static final Set TAGS = new LinkedHashSet<>(asList("TAG1", "TAG2")); public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; public static final boolean DEPRECATED = false; public static final String IDENTIFIER = "attr.person.id.name"; diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 7465f6d5a..95edc1cb1 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -10,8 +10,11 @@ import org.testng.annotations.Test; import java.io.InputStream; +import java.util.LinkedHashSet; +import java.util.Set; import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -25,7 +28,7 @@ public class ObjTest { public static final String TITLE = "Obj title"; public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 57, DateTimeZone.UTC); public static final String CATEGORY = "attributeDisplayForm"; - public static final String TAGS = "TAG1 TAG2"; + public static final Set TAGS = new LinkedHashSet<>(asList("TAG1", "TAG2")); public static final String URI = "/gdc/md/PROJECT_ID/obj/OBJ_ID"; public static final boolean DEPRECATED = false; public static final String IDENTIFIER = "attr.person.id.name"; diff --git a/src/test/java/com/gooddata/util/TagsDeserializerTest.java b/src/test/java/com/gooddata/util/TagsDeserializerTest.java new file mode 100644 index 000000000..047d9b71a --- /dev/null +++ b/src/test/java/com/gooddata/util/TagsDeserializerTest.java @@ -0,0 +1,34 @@ +package com.gooddata.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; + +public class TagsDeserializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldDeserializeOneToken() throws Exception { + final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG\"}", TagsTestClass.class); + assertThat(tags.getTags(), hasSize(1)); + assertThat(tags.getTags().iterator().next(), is("TAG")); + } + + @Test + public void shouldDeserializeTwoTokens() throws Exception { + final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); + assertThat(tags.getTags(), hasSize(2)); + assertThat(tags.getTags(), hasItems("TAG", "TAG2")); + } + + @Test + public void shouldDeserializeMultipleWhitespaceSeparatedTokens() throws Exception { + final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); + assertThat(tags.getTags(), hasSize(2)); + assertThat(tags.getTags(), hasItems("TAG", "TAG2")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/TagsSerializerTest.java b/src/test/java/com/gooddata/util/TagsSerializerTest.java new file mode 100644 index 000000000..d0cb5d651 --- /dev/null +++ b/src/test/java/com/gooddata/util/TagsSerializerTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.util.Collections; +import java.util.LinkedHashSet; + +import static java.util.Arrays.asList; +import static java.util.Collections.singleton; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +public class TagsSerializerTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Test + public void shouldSerializeOneTag() throws Exception { + final TagsTestClass tags = new TagsTestClass(singleton("TAG")); + final String jsonString = MAPPER.writeValueAsString(tags); + assertThat(jsonString, is("{\"tags\":\"TAG\"}")); + } + + @Test + public void shouldSerializeZeroTags() throws Exception { + final TagsTestClass tags = new TagsTestClass(Collections.emptySet()); + final String jsonString = MAPPER.writeValueAsString(tags); + assertThat(jsonString, is("{\"tags\":\"\"}")); + } + + @Test + public void shouldSerializeTwoTags() throws Exception { + final TagsTestClass tags = new TagsTestClass(new LinkedHashSet<>(asList("TAG", "TAG2"))); + final String jsonString = MAPPER.writeValueAsString(tags); + assertThat(jsonString, is("{\"tags\":\"TAG TAG2\"}")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/TagsTestClass.java b/src/test/java/com/gooddata/util/TagsTestClass.java new file mode 100644 index 000000000..1f74a7b1c --- /dev/null +++ b/src/test/java/com/gooddata/util/TagsTestClass.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.util; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; + +import java.util.Set; + +class TagsTestClass { + + private final Set tags; + + @JsonCreator + TagsTestClass(@JsonProperty("tags") @JsonDeserialize(using = TagsDeserializer.class) final Set tags) { + this.tags = tags; + } + + @JsonSerialize(using = TagsSerializer.class) + public Set getTags() { + return tags; + } +} From a00a28a735f9d818645188e5dcde18a8a7734c75 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 18 Apr 2016 09:46:57 +0200 Subject: [PATCH 0371/1191] Use set of strings for tags in Entry object --- src/main/java/com/gooddata/md/Entry.java | 15 +++++++-------- src/test/java/com/gooddata/md/EntryTest.java | 6 +++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 77f8b3f3b..570d753bd 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,15 +1,13 @@ package com.gooddata.md; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.*; import com.gooddata.util.*; -import com.fasterxml.jackson.annotation.JsonCreator; -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; import org.joda.time.DateTime; +import java.util.Set; + /** * Metadata entry (can be named "LINK" in some API docs) */ @@ -25,7 +23,7 @@ public class Entry { private final String contributor; private final Boolean deprecated; private final String identifier; - private final String tags; //TODO collection + private final Set tags; private final DateTime created; private final DateTime updated; private final Boolean locked; @@ -40,7 +38,7 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("contributor") String contributor, @JsonProperty("deprecated") @JsonDeserialize(using = BooleanDeserializer.class) Boolean deprecated, @JsonProperty("identifier") String identifier, - @JsonProperty("tags") String tags, + @JsonProperty("tags") @JsonDeserialize(using = TagsDeserializer.class) Set tags, @JsonProperty("created") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime created, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("locked") @JsonDeserialize(using = BooleanDeserializer.class) Boolean locked, @@ -101,7 +99,8 @@ public String getIdentifier() { return identifier; } - public String getTags() { + @JsonSerialize(using = TagsSerializer.class) + public Set getTags() { return tags; } diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 6d15b4804..714db982a 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -8,7 +8,11 @@ import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import java.util.Collections; +import java.util.Set; + import static com.gooddata.JsonMatchers.serializesToJson; +import static java.util.Collections.singleton; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -23,7 +27,7 @@ public class EntryTest { public static final String TITLE = "Entry title"; public static final DateTime UPDATED = new DateTime(2014, 4, 11, 13, 45, 55, DateTimeZone.UTC); public static final String CATEGORY = "ENTRY_CATEGORY"; - public static final String TAGS = "TAG"; + public static final Set TAGS = singleton("TAG"); public static final boolean DEPRECATED = true; public static final String IDENTIFIER = "ID"; public static final boolean LOCKED = true; From cd79aa134db3520590b80c0d9a07c01469fa3031 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 11 Mar 2016 20:14:16 +0100 Subject: [PATCH 0372/1191] Get rid of UriResponse from object APIs Unfortunately the change in DataLoadingColumn is not backward compatible. On the other hand this Object has been added recently. --- src/main/java/com/gooddata/gdc/UriResponse.java | 4 +++- .../java/com/gooddata/md/DataLoadingColumn.java | 4 ++-- .../md/maintenance/ExportImportService.java | 2 +- .../md/maintenance/PartialMdArtifact.java | 16 +++++++++------- .../com/gooddata/md/DataLoadingColumnTest.java | 3 +-- .../md/maintenance/PartialMdArtifactTest.java | 2 +- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index 9b591c4d8..3889baeea 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -9,7 +9,9 @@ import com.fasterxml.jackson.annotation.JsonProperty; /** - * Response containing URI + * Response containing URI string. + *

+ * Intended for internal library purposes only, not to be used in public API! */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index e34ec64cb..e8eda71b6 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -33,8 +33,8 @@ private DataLoadingColumn(@JsonProperty("meta") Meta meta, @JsonProperty("conten this.content = content; } - public UriResponse getColumnUri() { - return content.getColumnUri(); + public String getColumnUri() { + return content.getColumnUri().getUri(); } public String getName() { diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java index 07af4f2e9..d3078f155 100644 --- a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java @@ -47,7 +47,7 @@ public FutureResult partialExport(Project project, final P throw new ExportImportException("Unable to export metadata from objects " + export.getUris() + ".", e); } - return new PollResult<>(this, new AbstractPollHandler(partialMdArtifact.getStatus().getUri(), + return new PollResult<>(this, new AbstractPollHandler(partialMdArtifact.getStatusUri(), TaskStatus.class, PartialMdExportToken.class) { @Override public void handlePollResult(TaskStatus pollResult) { diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java index a3abec75b..0835c52b6 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java @@ -1,10 +1,6 @@ package com.gooddata.md.maintenance; -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.fasterxml.jackson.annotation.*; import com.gooddata.gdc.UriResponse; /** @@ -25,11 +21,17 @@ public PartialMdArtifact(@JsonProperty("status") UriResponse status, @JsonProper this.token = token; } - public UriResponse getStatus() { - return status; + @JsonIgnore + public String getStatusUri() { + return getStatus().getUri(); } public String getToken() { return token; } + + @JsonProperty("status") + private UriResponse getStatus() { + return status; + } } diff --git a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java index c48bf30f3..0b8951ed1 100644 --- a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -22,8 +22,7 @@ public void shouldDeserialize() throws Exception { final DataLoadingColumn column = new ObjectMapper().readValue(stream, DataLoadingColumn.class); assertThat(column, is(notNullValue())); - assertThat(column.getColumnUri(), is(notNullValue())); - assertThat(column.getColumnUri().getUri(), is("/gdc/md/PROJECT_ID/obj/COLUMN_ID")); + assertThat(column.getColumnUri(), is("/gdc/md/PROJECT_ID/obj/COLUMN_ID")); assertThat(column.getType(), is("INT")); assertThat(column.hasTypeInt(), is(true)); diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java index 6cc8d255b..c1b0f7336 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -17,7 +17,7 @@ public void shouldDeserialize() throws Exception { final InputStream input = getClass().getResourceAsStream("/md/maintenance/partialMDArtifact.json"); final PartialMdArtifact partialMdArtifact = new ObjectMapper().readValue(input, PartialMdArtifact.class); - assertThat(partialMdArtifact.getStatus().getUri(), is("/gdc/md/projectId/tasks/taskId/status")); + assertThat(partialMdArtifact.getStatusUri(), is("/gdc/md/projectId/tasks/taskId/status")); assertThat(partialMdArtifact.getToken(), is("TOKEN123")); } From d4795f7b241e7a93e69b31a18c7db3214efc4f4d Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 15 Jul 2016 14:17:33 +0200 Subject: [PATCH 0373/1191] Introduce project uploads information and statistics in DatasetService --- .../dataset/DatasetNotFoundException.java | 10 +- .../com/gooddata/dataset/DatasetService.java | 80 ++++++++++- .../gooddata/dataset/DatasetUploadsInfo.java | 130 ++++++++++++++++++ .../gooddata/dataset/ProjectUploadsInfo.java | 66 +++++++++ .../java/com/gooddata/dataset/Upload.java | 119 ++++++++++++++++ .../gooddata/dataset/UploadStatistics.java | 41 ++++++ .../java/com/gooddata/dataset/Uploads.java | 31 +++++ .../gooddata/dataset/DatasetServiceAT.java | 44 ++++++ .../gooddata/dataset/DatasetServiceIT.java | 70 ++++++++++ .../gooddata/dataset/DatasetServiceTest.java | 62 ++++++++- .../dataset/ProjectUploadsInfoTest.java | 56 ++++++++ .../dataset/UploadStatisticsTest.java | 26 ++++ .../java/com/gooddata/dataset/UploadTest.java | 32 +++++ .../com/gooddata/dataset/UploadsTest.java | 25 ++++ .../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 +++++ 18 files changed, 899 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java create mode 100644 src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java create mode 100644 src/main/java/com/gooddata/dataset/Upload.java create mode 100644 src/main/java/com/gooddata/dataset/UploadStatistics.java create mode 100644 src/main/java/com/gooddata/dataset/Uploads.java create mode 100644 src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java create mode 100644 src/test/java/com/gooddata/dataset/UploadStatisticsTest.java create mode 100644 src/test/java/com/gooddata/dataset/UploadTest.java create mode 100644 src/test/java/com/gooddata/dataset/UploadsTest.java create mode 100644 src/test/resources/dataset/uploads/data-sets.json create mode 100644 src/test/resources/dataset/uploads/data-uploads-info.json create mode 100644 src/test/resources/dataset/uploads/upload.json create mode 100644 src/test/resources/dataset/uploads/uploads.json diff --git a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java index 309656d1d..034a35bcf 100644 --- a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java +++ b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java @@ -3,6 +3,8 @@ */ package com.gooddata.dataset; +import static java.lang.String.format; + import com.gooddata.GoodDataException; /** @@ -10,7 +12,13 @@ */ public class DatasetNotFoundException extends GoodDataException { + private static final String MESSAGE = "Dataset %s was not found"; + + public DatasetNotFoundException(String dataset) { + super(format(MESSAGE, dataset)); + } + public DatasetNotFoundException(String dataset, Throwable cause) { - super("Dataset " + dataset + " was not found", cause); + super(format(MESSAGE, dataset), cause); } } diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 4424625e8..b64477bbb 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -38,7 +38,7 @@ import static org.springframework.util.StringUtils.isEmpty; /** - * Service to work with datasets and manifests. + * Service to work with datasets, manifests and dataset uploads. */ public class DatasetService extends AbstractService { @@ -324,4 +324,82 @@ public void handlePollException(final GoodDataRestException e) { } }); } + + /** + * Returns {@link ProjectUploadsInfo} object containing upload information for every single dataset + * in the given project. + * + * @param project GoodData project + * @return information about dataset uploads + */ + public ProjectUploadsInfo getProjectUploadsInfo(Project project) { + notNull(project, "project"); + + try { + return restTemplate.getForObject(ProjectUploadsInfo.URI, ProjectUploadsInfo.class, project.getId()); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get dataset uploads for project '" + project.getId() + "'.", e); + } + } + + /** + * Lists all uploads for the given dataset. Returns empty list if there are no uploads for the given dataset. + * + * @param datasetUploadsInfo {@link DatasetUploadsInfo} object for the given dataset + * @return collection of {@link Upload} objects or empty list + */ + public Collection listUploadsForDataset(DatasetUploadsInfo datasetUploadsInfo) { + notNull(datasetUploadsInfo, "datasetUploadsInfo"); + + if (isEmpty(datasetUploadsInfo.getUploadsUri())) { + throw new GoodDataException("Uploads link for dataset '" + datasetUploadsInfo.getDatasetId() + + "' does not exist."); + } + + try { + final Uploads result = restTemplate.getForObject(datasetUploadsInfo.getUploadsUri(), Uploads.class); + + if (result == null) { + throw new GoodDataException("empty response from API call"); + } else if (result.items() == null){ + return emptyList(); + } + + return result.items(); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get uploads for dataset '" + datasetUploadsInfo.getDatasetId() + + "'.", e); + } + } + + /** + * Lists all uploads for the dataset with the given identifier in the given project. Returns empty list if there + * are no uploads for the given dataset. + * + * @param project GD project + * @param datasetId dataset identifier + * @return collection of {@link Upload} objects or empty list + */ + public Collection listUploadsForDataset(Project project, String datasetId) { + final ProjectUploadsInfo projectUploadsInfo = getProjectUploadsInfo(project); + final DatasetUploadsInfo datasetUploadsInfo = projectUploadsInfo.getDatasetUploadsInfo(datasetId); + + return listUploadsForDataset(datasetUploadsInfo); + } + + /** + * Returns global upload statistics for the given project. + * + * @param project GoodData project + * @return {@link UploadStatistics} object with project's upload statistics + */ + public UploadStatistics getUploadStatistics(Project project) { + notNull(project, "project"); + + try { + return restTemplate.getForObject(UploadStatistics.URI, UploadStatistics.class, project.getId()); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get dataset uploads statistics.", e); + } + } } diff --git a/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java b/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java new file mode 100644 index 000000000..a3c459310 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java @@ -0,0 +1,130 @@ +package com.gooddata.dataset; + +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.md.Meta; +import com.gooddata.util.GDDateTimeDeserializer; +import org.joda.time.DateTime; + +/** + * Contains information about dataset uploads for one dataset in the project. Information contain: + *

    + *
  • dataset ID
  • + *
  • uri to all uploads for the given dataset
  • + *
  • date of the last successful upload
  • + *
  • last upload
  • + *
+ * + * Deserialization only. + */ +@JsonIgnoreProperties(ignoreUnknown = true) +public class DatasetUploadsInfo { + + private final Meta meta; + private final String datasetUploadsUri; + private final DateTime lastSuccess; + private final LastUpload lastUpload; + + private DatasetUploadsInfo( + @JsonProperty("meta") Meta meta, + @JsonProperty("dataUploads") String datasetUploadsUri, + @JsonProperty("lastSuccess") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime lastSuccess, + @JsonProperty("lastUpload") LastUpload lastUpload) { + this.meta = meta; + this.datasetUploadsUri = datasetUploadsUri; + this.lastSuccess = lastSuccess; + this.lastUpload = lastUpload; + } + + /** + * @return dataset identifier + */ + public String getDatasetId() { + return meta.getIdentifier(); + } + + /** + * @return dataset's author + */ + public String getDatasetAuthor() { + return meta.getAuthor(); + } + + /** + * @return dataset created date + */ + public DateTime getDatasetCreated() { + return meta.getCreated(); + } + + /** + * @return dataset title + */ + public String getDatasetTitle() { + return meta.getTitle(); + } + + /** + * @return dataset URI link + */ + public String getDatasetUri() { + return meta.getUri(); + } + + /** + * @return dataset's summary + */ + public String getDatasetSummary() { + return meta.getSummary(); + } + + /** + * @return URI for all uploads of this dataset + */ + public String getUploadsUri() { + return datasetUploadsUri; + } + + /** + * @return date of the last successful upload of this dataset + */ + public DateTime getLastSuccess() { + return lastSuccess; + } + + /** + * Returns object containing information about last dataset upload. This upload doesn't contain information + * about upload mode, size of data and date when this upload was processed. If you want to get more information about + * dataset uploads, use {@link DatasetService#listUploadsForDataset(DatasetUploadsInfo)} method. + * + * @return {@link Upload} object + */ + public Upload getLastUpload() { + return lastUpload.upload; + } + + /** + * Wrapper class for the last upload. + * Only for deserialization. For internal use only. + */ + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonTypeName("dataUploadShort") + @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) + private static class LastUpload { + + private final Upload upload; + + private LastUpload( + @JsonProperty("uri") String uri, + @JsonProperty("status") String status, + @JsonProperty("progress") Double progress, + @JsonProperty("msg") String message, + @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date) { + + this.upload = new Upload(message, progress, status, null, uri, date, null, null); + } + } +} diff --git a/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java b/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java new file mode 100644 index 000000000..bab0b8662 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java @@ -0,0 +1,66 @@ +package com.gooddata.dataset; + +import static com.gooddata.util.Validate.notEmpty; + +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 org.springframework.web.util.UriTemplate; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * Contains information about dataset uploads for every single dataset in the project. + * For more about dataset uploads information, see {@link DatasetUploadsInfo}. + * Deserialization only. + */ +@JsonTypeName("dataSetsInfo") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +public class ProjectUploadsInfo { + + 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<>(); + + //for deserialization and testing purposes only + ProjectUploadsInfo(@JsonProperty("sets") Collection datasets) { + if (datasets != null) { + for (DatasetUploadsInfo dataset : datasets) { + this.datasets.put(dataset.getDatasetId(), dataset); + } + } + } + + /** + * Returns dataset uploads information for a dataset with the given ID. + * + * @param datasetId dataset identifier + * @return {@link DatasetUploadsInfo} object + */ + public DatasetUploadsInfo getDatasetUploadsInfo(String datasetId) { + notEmpty(datasetId, "datasetId"); + + if (hasDataset(datasetId)) { + return datasets.get(datasetId); + } else { + throw new DatasetNotFoundException(datasetId); + } + } + + /** + * Returns if dataset with the given identifier exists in the project dataset uploads. + * + * @param datasetId dataset identifier + * @return {@code true} if the dataset exists, {@code false} otherwise + */ + public boolean hasDataset(String datasetId) { + notEmpty(datasetId, "datasetId"); + + return datasets.containsKey(datasetId); + } +} diff --git a/src/main/java/com/gooddata/dataset/Upload.java b/src/main/java/com/gooddata/dataset/Upload.java new file mode 100644 index 000000000..77a819b83 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/Upload.java @@ -0,0 +1,119 @@ +package com.gooddata.dataset; + +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.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.util.BooleanDeserializer; +import com.gooddata.util.GDDateTimeDeserializer; +import org.joda.time.DateTime; +import org.springframework.web.util.UriTemplate; + +/** + * Contains information about single dataset upload. + * Deserialization only. + */ +@JsonTypeName("dataUpload") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +public class Upload { + + public static final String URI = "/gdc/md/{projectId}/data/upload/{uploadId}"; + public static final UriTemplate URI_TEMPLATE = new UriTemplate(URI); + + private final String uri; + private final String status; + private final double progress; + private final String message; + private final UploadMode uploadMode; + private final Integer size; + private final DateTime createdAt; + private final DateTime processedAt; + + Upload(@JsonProperty("msg") String message, + @JsonProperty("progress") Double progress, + @JsonProperty("status") String status, + @JsonProperty("fullUpload") @JsonDeserialize(using = BooleanDeserializer.class) Boolean fullUpload, + @JsonProperty("uri") String uri, + @JsonProperty("createdAt") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime createdAt, + @JsonProperty("fileSize") Integer size, + @JsonProperty("processedAt") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime processedAt) { + + this.uri = uri; + this.status = status; + this.progress = progress != null ? progress : 0; + this.message = message; + this.uploadMode = toUploadMode(fullUpload); + this.size = size; + this.createdAt = createdAt; + this.processedAt = processedAt; + } + + /** + * @return uri link to self + */ + public String getUri() { + return uri; + } + + /** + * @return upload status + */ + public String getStatus() { + return status; + } + + /** + * @return upload progress in percent as floating point number + */ + public double getProgress() { + return progress; + } + + /** + * @return error message if the upload failed, {@code null} otherwise + */ + public String getMessage() { + return message; + } + + /** + * @return {@link UploadMode} of this upload + */ + public UploadMode getUploadMode() { + return uploadMode; + } + + /** + * @return size of the data uploaded by this upload + */ + public Integer getSize() { + return size; + } + + /** + * @return date of creation of this upload + */ + public DateTime getCreatedAt() { + return createdAt; + } + + /** + * @return date when the upload was processed or {@code null} if upload is still being processed + */ + public DateTime getProcessedAt() { + return processedAt; + } + + /** + * Converts boolean value containing if the upload is full or incremental load to {@link UploadMode} enum. + */ + private UploadMode toUploadMode(Boolean fullUpload) { + if (fullUpload == null) { + return null; + } + + return fullUpload ? UploadMode.FULL : UploadMode.INCREMENTAL; + } +} diff --git a/src/main/java/com/gooddata/dataset/UploadStatistics.java b/src/main/java/com/gooddata/dataset/UploadStatistics.java new file mode 100644 index 000000000..61d7c6f94 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/UploadStatistics.java @@ -0,0 +1,41 @@ +package com.gooddata.dataset; + +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 org.springframework.web.util.UriTemplate; + +import java.util.HashMap; +import java.util.Map; + +/** + * Global statistics about project's uploads + */ +@JsonTypeName("dataUploadsInfo") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +public class UploadStatistics { + + public static final String URI = "/gdc/md/{projectId}/data/uploads_info"; + public static final UriTemplate URI_TEMPLATE = new UriTemplate(URI); + + private final Map statusesCount; + + private UploadStatistics(@JsonProperty("statusesCount") Map statusesCount) { + this.statusesCount = new HashMap<>(statusesCount); + } + + /** + * Returns count of uploads finished in given status. + * + * @param uploadStatus status of uploads to be counted + * @return count of uploads or zero when statistics for given status don't exist + */ + public int getUploadsCount(String uploadStatus) { + final Integer uploadsCount = statusesCount.get(uploadStatus); + + return uploadsCount != null ? uploadsCount : 0; + } +} diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/src/main/java/com/gooddata/dataset/Uploads.java new file mode 100644 index 000000000..3eb507764 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/Uploads.java @@ -0,0 +1,31 @@ +package com.gooddata.dataset; + +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 java.util.Collection; + +/** + * Contains collection of dataset uploads. + * Deserialization only. For internal use only. + */ +@JsonTypeName("dataUploads") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +class Uploads { + + private Collection uploads; + + Uploads(@JsonProperty("uploads") Collection uploads) { + this.uploads = uploads; + } + + /** + * @return all items of uploads collection + */ + Collection items() { + return uploads; + } +} diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index c875dbb43..8d0628825 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -2,6 +2,10 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.Matchers.greaterThan; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.gooddata.AbstractGoodDataAT; @@ -9,6 +13,8 @@ import org.testng.annotations.Test; +import java.util.Collection; + /** * Dataset acceptance tests. */ @@ -68,4 +74,42 @@ public void loadDatasetBatchFail() throws Exception { 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]"))); } } + + @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) + public void getProjectsUploadsInfo() throws Exception { + final ProjectUploadsInfo projectUploadsInfo = gd.getDatasetService().getProjectUploadsInfo(project); + + assertThat(projectUploadsInfo, notNullValue()); + assertTrue(projectUploadsInfo.hasDataset("dataset.person")); + assertThat(projectUploadsInfo.getDatasetUploadsInfo("dataset.person").getLastUpload(), notNullValue()); + } + + @Test(groups = "dataset", dependsOnMethods = {"getProjectsUploadsInfo"}) + public void listUploadsForDataset() throws Exception { + final DatasetService datasetService = gd.getDatasetService(); + + final DatasetUploadsInfo datasetUploadsInfo = + datasetService.getProjectUploadsInfo(project).getDatasetUploadsInfo("dataset.person"); + final Collection uploads = datasetService.listUploadsForDataset(datasetUploadsInfo); + + assertThat(uploads, notNullValue()); + assertFalse(uploads.isEmpty()); + } + + @Test(groups = "dataset", dependsOnMethods = {"getProjectsUploadsInfo"}) + public void listUploadsForDatasetId() throws Exception { + final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.person"); + + assertThat(uploads, notNullValue()); + assertFalse(uploads.isEmpty()); + } + + @Test(groups = "dataset", dependsOnMethods = {"loadDataset", "loadDatasetFail"}) + public void getUploadStatistics() throws Exception { + final UploadStatistics uploadStatistics = gd.getDatasetService().getUploadStatistics(project); + + assertThat(uploadStatistics, notNullValue()); + assertThat(uploadStatistics.getUploadsCount("OK"), greaterThan(0)); + assertThat(uploadStatistics.getUploadsCount("ERROR"), greaterThan(0)); + } } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 1b6b9d7af..e1e6e3cb1 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -20,6 +20,9 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.startsWith; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; public class DatasetServiceIT extends AbstractGoodDataIT { @@ -250,4 +253,71 @@ public void shouldFailUpdateProjectData() throws IOException { gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); } + + @Test + public void shouldGetProjectUploadsInfo() { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/sets") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/uploads/data-sets.json")); + + final ProjectUploadsInfo projectUploadsInfo = gd.getDatasetService().getProjectUploadsInfo(project); + + assertThat(projectUploadsInfo, notNullValue()); + assertTrue(projectUploadsInfo.hasDataset("dataset.campaign")); + } + + @Test + public void shouldListUploadsForDataset() { + final String datasetUploadsUri = "/gdc/md/PROJECT_ID/uploads/DATASET_ID"; + + onRequest() + .havingPathEqualTo(datasetUploadsUri) + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/uploads/uploads.json")); + + final DatasetUploadsInfo info = mock(DatasetUploadsInfo.class); + when(info.getUploadsUri()).thenReturn(datasetUploadsUri); + + final Collection uploads = gd.getDatasetService().listUploadsForDataset(info); + + assertThat(uploads, notNullValue()); + assertThat(uploads, hasSize(2)); + } + + @Test + public void shouldListUploadsForDatasetId() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/sets") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/uploads/data-sets.json")); + + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/uploads/814") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/uploads/uploads.json")); + + final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.campaign"); + + assertThat(uploads, notNullValue()); + assertThat(uploads, hasSize(2)); + } + + @Test + public void shouldGetUploadStatistics() throws Exception { + onRequest() + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/uploads_info") + .respond() + .withStatus(200) + .withBody(readFromResource("/dataset/uploads/data-uploads-info.json")); + + final UploadStatistics uploadStatistics = gd.getDatasetService().getUploadStatistics(project); + + assertThat(uploadStatistics, notNullValue()); + assertThat(uploadStatistics.getUploadsCount("OK"), is(845)); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index f09a0754a..64adbb8d3 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -8,6 +8,7 @@ import com.gooddata.gdc.DataStoreException; import com.gooddata.gdc.DataStoreService; import com.gooddata.project.Project; +import org.hamcrest.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.springframework.web.client.RestClientException; @@ -18,7 +19,7 @@ import java.io.InputStream; import java.util.Collection; -import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -48,6 +49,7 @@ public class DatasetServiceTest { private InputStream stream; private DatasetService service; + private static final String DATASET_UPLOADS_URI = "uploads/uri"; @BeforeMethod public void setUp() throws Exception { @@ -166,10 +168,66 @@ public void testListDatasetsWithRestClientError() throws Exception { public void testListDatasetsWithEmptyResponse() throws Exception { final Datasets datasets = mock(Datasets.class); when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); - when(datasets.getLinks()).thenReturn(asList(dataset)); + when(datasets.getLinks()).thenReturn(singletonList(dataset)); final Collection result = service.listDatasets(project); assertThat(result, hasSize(1)); assertThat(result, contains(dataset)); } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetProjectsUploadsInfoWithRestClientError() throws Exception { + when(restTemplate.getForObject(ProjectUploadsInfo.URI, ProjectUploadsInfo.class, PROJECT_ID)) + .thenThrow(new RestClientException("")); + service.getProjectUploadsInfo(project); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListUploadsForDatasetWhenMissingUploadsUri() throws Exception { + final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(null); + + service.listUploadsForDataset(uploadsInfo); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListUploadsForDatasetWhenRestClientError() throws Exception { + final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + + when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenThrow(new RestClientException("")); + + service.listUploadsForDataset(uploadsInfo); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testListUploadsForDatasetWithNoResponse() throws Exception { + final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + + when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenReturn(null); + + service.listUploadsForDataset(uploadsInfo); + } + + @Test + public void testListUploadsForDatasetWithEmptyResponseBody() throws Exception { + final DatasetUploadsInfo datasetUploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + + when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenReturn(new Uploads(null)); + + assertThat(service.listUploadsForDataset(datasetUploadsInfo), Matchers.empty()); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetUploadStatisticsWhenRestClientError() throws Exception { + when(restTemplate.getForObject(UploadStatistics.URI, UploadStatistics.class, PROJECT_ID)) + .thenThrow(new RestClientException("")); + + service.getUploadStatistics(project); + } + + private DatasetUploadsInfo mockDatasetUploadsInfo(String uploadsUri) { + final DatasetUploadsInfo uploadsInfo = mock(DatasetUploadsInfo.class); + when(uploadsInfo.getUploadsUri()).thenReturn(uploadsUri); + + return uploadsInfo; + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java b/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java new file mode 100644 index 000000000..d1d3a919d --- /dev/null +++ b/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java @@ -0,0 +1,56 @@ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.testng.Assert.assertTrue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collections; + +public class ProjectUploadsInfoTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); + final ProjectUploadsInfo projectUploadsInfo = new ObjectMapper().readValue(input, ProjectUploadsInfo.class); + + assertThat(projectUploadsInfo, notNullValue()); + assertTrue(projectUploadsInfo.hasDataset("dataset.campaign"), + "ProjectUploadsInfo must contain dataset with id: 'dataset.campaign'."); + + final DatasetUploadsInfo dataset = projectUploadsInfo.getDatasetUploadsInfo("dataset.campaign"); + + assertThat(dataset, notNullValue()); + + assertThat(dataset.getDatasetId(), is("dataset.campaign")); + assertThat(dataset.getDatasetUri(), is("/gdc/md/PROJECT_ID/obj/814")); + assertThat(dataset.getDatasetTitle(), is("Campaign")); + assertThat(dataset.getDatasetAuthor(), is("/gdc/account/profile/1")); + assertThat(dataset.getDatasetCreated(), is(new DateTime(2010, 11, 23, 10, 37, 54, DateTimeZone.UTC))); + assertThat(dataset.getDatasetSummary(), + is("Information about Medium, Campaign, Keyword, Ad Slot, Source and Referral Path")); + + assertThat(dataset.getUploadsUri(), is("/gdc/md/PROJECT_ID/data/uploads/814")); + assertThat(dataset.getLastSuccess(), is(new DateTime(2011, 9, 12, 13, 36, 27, DateTimeZone.UTC))); + + final Upload lastUpload = dataset.getLastUpload(); + assertThat(lastUpload, notNullValue()); + assertThat(lastUpload.getUri(), is("/gdc/md/PROJECT_ID/data/upload/1076")); + assertThat(lastUpload.getStatus(), is("WARNING")); + assertThat(lastUpload.getProgress(), closeTo(1, 0.0001)); + assertThat(lastUpload.getMessage(), is("1 of 7 parts went with warnings")); + assertThat(lastUpload.getCreatedAt(), is(new DateTime(2011, 10, 4, 10, 35, 5, DateTimeZone.UTC))); + } + + @Test(expectedExceptions = DatasetNotFoundException.class) + public void getDatasetUploadInfoFails() throws Exception { + new ProjectUploadsInfo(Collections.emptyList()).getDatasetUploadsInfo("dataset.non_existing_one"); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java new file mode 100644 index 000000000..27638562b --- /dev/null +++ b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java @@ -0,0 +1,26 @@ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class UploadStatisticsTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-uploads-info.json"); + final UploadStatistics uploadStatistics = new ObjectMapper().readValue(input, UploadStatistics.class); + + assertThat(uploadStatistics, notNullValue()); + + assertThat(uploadStatistics.getUploadsCount("OK"), is(845)); + assertThat(uploadStatistics.getUploadsCount("ERROR"), is(25)); + assertThat(uploadStatistics.getUploadsCount("RUNNING"), is(1)); + assertThat(uploadStatistics.getUploadsCount("NOT_DEFINED"), is(0)); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadTest.java b/src/test/java/com/gooddata/dataset/UploadTest.java new file mode 100644 index 000000000..6aac22e12 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/UploadTest.java @@ -0,0 +1,32 @@ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class UploadTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/upload.json"); + final Upload upload = new ObjectMapper().readValue(input, Upload.class); + + assertThat(upload, notNullValue()); + assertThat(upload.getMessage(), is("some upload message")); + assertThat(upload.getProgress(), closeTo(1, 0.0001)); + assertThat(upload.getStatus(), is("OK")); + assertThat(upload.getUploadMode(), is(UploadMode.INCREMENTAL)); + assertThat(upload.getUri(), is("/gdc/md/project/data/upload/123")); + assertThat(upload.getCreatedAt(), is(new DateTime(2016, 4, 8, 12, 55, 21, DateTimeZone.UTC))); + assertThat(upload.getSize(), is(130501)); + assertThat(upload.getProcessedAt(), is(new DateTime(2016, 4, 8, 12, 55, 25, DateTimeZone.UTC))); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java new file mode 100644 index 000000000..41904c24c --- /dev/null +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -0,0 +1,25 @@ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.notNullValue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.hamcrest.Matchers; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class UploadsTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/uploads.json"); + final Uploads uploads = new ObjectMapper().readValue(input, Uploads.class); + + assertThat(uploads, notNullValue()); + assertThat(uploads.items(), not(Matchers.empty())); + assertThat(uploads.items().size(), is(2)); + } +} diff --git a/src/test/resources/dataset/uploads/data-sets.json b/src/test/resources/dataset/uploads/data-sets.json new file mode 100644 index 000000000..57be8d019 --- /dev/null +++ b/src/test/resources/dataset/uploads/data-sets.json @@ -0,0 +1,54 @@ +{ + "dataSetsInfo": { + "sets": [ + { + "etlInterface": "/etl/interface/uri/123", + "lastUpload": { + "dataUploadShort": { + "msg": "1 of 7 parts went with warnings", + "date": "2011-10-04 10:35:05", + "progress": "1.000", + "status": "WARNING", + "uri": "/gdc/md/PROJECT_ID/data/upload/1076" + } + }, + "lastSuccess": "2011-09-12 13:36:27", + "dataUploads": "/gdc/md/PROJECT_ID/data/uploads/814", + "meta": { + "author": "/gdc/account/profile/1", + "uri": "/gdc/md/PROJECT_ID/obj/814", + "tags": "", + "created": "2010-11-23 10:37:54", + "identifier": "dataset.campaign", + "deprecated": "0", + "summary": "Information about Medium, Campaign, Keyword, Ad Slot, Source and Referral Path", + "title": "Campaign", + "category": "dataSet", + "updated": "2010-11-23 10:58:02", + "contributor": "/gdc/account/profile/1" + }, + "uploadConfiguration": "/configuration" + }, + { + "etlInterface": null, + "lastUpload": null, + "lastSuccess": null, + "dataUploads": "/gdc/md/PROJECT_ID/data/uploads/356", + "meta": { + "author": "/gdc/account/profile/1", + "uri": "/gdc/md/PROJECT_ID/obj/356", + "tags": "", + "created": "2010-11-23 10:36:22", + "identifier": "dataset.os", + "deprecated": "0", + "summary": "Information about OS, OS version, Screen Colors and Screen Resolution", + "title": "OS", + "category": "dataSet", + "updated": "2010-11-23 10:57:59", + "contributor": "/gdc/account/profile/1" + } + } + ], + "links": {} + } +} \ No newline at end of file diff --git a/src/test/resources/dataset/uploads/data-uploads-info.json b/src/test/resources/dataset/uploads/data-uploads-info.json new file mode 100644 index 000000000..a6783bfab --- /dev/null +++ b/src/test/resources/dataset/uploads/data-uploads-info.json @@ -0,0 +1,9 @@ +{ + "dataUploadsInfo" : { + "statusesCount" : { + "OK" : 845, + "RUNNING" : 1, + "ERROR" : 25 + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataset/uploads/upload.json b/src/test/resources/dataset/uploads/upload.json new file mode 100644 index 000000000..a88d4b1dd --- /dev/null +++ b/src/test/resources/dataset/uploads/upload.json @@ -0,0 +1,14 @@ +{ + "dataUpload" : { + "msg" : "some upload message", + "etlInterface" : "/gdc/md/project/obj/123", + "progress" : "1.000", + "status" : "OK", + "file" : "upload_info.json", + "fullUpload" : 0, + "uri" : "/gdc/md/project/data/upload/123", + "createdAt" : "2016-04-08 12:55:21", + "fileSize" : 130501, + "processedAt" : "2016-04-08 12:55:25" + } +} \ No newline at end of file diff --git a/src/test/resources/dataset/uploads/uploads.json b/src/test/resources/dataset/uploads/uploads.json new file mode 100644 index 000000000..546ca4419 --- /dev/null +++ b/src/test/resources/dataset/uploads/uploads.json @@ -0,0 +1,34 @@ +{ + "dataUploads" : { + "uploads" : [ + { + "dataUpload" : { + "msg" : "some upload message 1", + "etlInterface" : "/gdc/md/project/obj/123", + "progress" : "0.500", + "status" : "RUNNING", + "file" : "upload_info.json", + "fullUpload" : 0, + "uri" : "/gdc/md/project/data/upload/234", + "createdAt" : "2016-04-08 13:55:21", + "fileSize" : 131501, + "processedAt" : "2016-04-08 13:55:25" + } + }, + { + "dataUpload" : { + "msg" : "some upload message", + "etlInterface" : "/gdc/md/project/obj/123", + "progress" : "1.000", + "status" : "OK", + "file" : "upload_info.json", + "fullUpload" : 0, + "uri" : "/gdc/md/project/data/upload/123", + "createdAt" : "2016-04-08 12:55:21", + "fileSize" : 130501, + "processedAt" : "2016-04-08 12:55:25" + } + } + ] + } +} \ No newline at end of file From 5181444afdaf319eb9a207da9f637eca666788cd Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 13 Apr 2016 23:25:00 +0200 Subject: [PATCH 0374/1191] Use DatasetLinks instead of confusing Datasets --- .../com/gooddata/dataset/DatasetLinks.java | 25 +++++++++++ .../java/com/gooddata/dataset/Datasets.java | 6 +-- .../gooddata/dataset/DatasetLinksTest.java | 41 +++++++++++++++++++ .../gooddata/dataset/DatasetServiceIT.java | 4 +- .../com/gooddata/dataset/DatasetsTest.java | 2 +- .../{datasets.json => datasetLinks.json} | 0 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gooddata/dataset/DatasetLinks.java create mode 100644 src/test/java/com/gooddata/dataset/DatasetLinksTest.java rename src/test/resources/dataset/{datasets.json => datasetLinks.json} (100%) diff --git a/src/main/java/com/gooddata/dataset/DatasetLinks.java b/src/main/java/com/gooddata/dataset/DatasetLinks.java new file mode 100644 index 000000000..0b380de0d --- /dev/null +++ b/src/main/java/com/gooddata/dataset/DatasetLinks.java @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import com.fasterxml.jackson.annotation.*; +import com.gooddata.gdc.AboutLinks; + +import java.util.List; + +/** + * Dataset links. + * Deserialization only. + */ +class DatasetLinks extends AboutLinks { + + public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; + + @JsonCreator + public DatasetLinks(@JsonProperty("category") String category, @JsonProperty("summary") String summary, + @JsonProperty("links") List links) { + super(category, summary, null, links); + } + +} diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java index 126ac8f62..e3ec2f65e 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -10,11 +10,9 @@ /** * Dataset links + * @deprecated use {@link DatasetLinks} instead. */ -@JsonTypeName("about") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) +@Deprecated class Datasets extends AboutLinks { public static final String URI = "/gdc/md/{project}/ldm/singleloadinterface"; diff --git a/src/test/java/com/gooddata/dataset/DatasetLinksTest.java b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java new file mode 100644 index 000000000..5fef2ac3d --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.gdc.AboutLinks; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collection; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; + +public class DatasetLinksTest { + + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); + final DatasetLinks datasetLinks = new ObjectMapper().readValue(stream, DatasetLinks.class); + assertThat(datasetLinks, is(notNullValue())); + assertThat(datasetLinks.getCategory(), is("singleloadinterface")); + assertThat(datasetLinks.getInstance(), is("MD::LDM::SingleLoadInterface")); + assertThat(datasetLinks.getSummary(), is("single loading interfaces")); + + final Collection links = datasetLinks.getLinks(); + assertThat(links, is(notNullValue())); + assertThat(links, hasSize(1)); + + final AboutLinks.Link link = links.iterator().next(); + assertThat(link, is(notNullValue())); + assertThat(link.getIdentifier(), is("dataset.person")); + assertThat(link.getUri(), is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); + assertThat(link.getCategory(), is("dataset-singleloadinterface")); + assertThat(link.getTitle(), is("Person")); + assertThat(link.getSummary(), is("dataset single data loading interface specifications")); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 7609f187b..dbc4d8e07 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -138,7 +138,7 @@ public void shouldListDatasets() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface") .respond() - .withBody(readFromResource("/dataset/datasets.json")) + .withBody(readFromResource("/dataset/datasetLinks.json")) ; final Collection datasets = gd.getDatasetService().listDatasets(project); @@ -153,7 +153,7 @@ public void shouldListDatasetLinks() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo("/gdc/md/PROJECT_ID/ldm/singleloadinterface") .respond() - .withBody(readFromResource("/dataset/datasets.json")) + .withBody(readFromResource("/dataset/datasetLinks.json")) ; final Collection datasets = gd.getDatasetService().listDatasetLinks(project); diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index cfb2bdda7..2a53d9d6d 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -16,7 +16,7 @@ public class DatasetsTest { @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/datasets.json"); + final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); final Datasets datasets = new ObjectMapper().readValue(stream, Datasets.class); assertThat(datasets, is(notNullValue())); assertThat(datasets.getCategory(), is("singleloadinterface")); diff --git a/src/test/resources/dataset/datasets.json b/src/test/resources/dataset/datasetLinks.json similarity index 100% rename from src/test/resources/dataset/datasets.json rename to src/test/resources/dataset/datasetLinks.json From bfefb7d0ff7bfd9ea9ab3d5846bc4412d113ddbd Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 14 Apr 2016 09:08:07 +0200 Subject: [PATCH 0375/1191] Use RootLinks instead of confusing Gdc --- .../com/gooddata/gdc/DataStoreService.java | 2 +- src/main/java/com/gooddata/gdc/Gdc.java | 216 +-------------- .../java/com/gooddata/gdc/GdcService.java | 15 ++ src/main/java/com/gooddata/gdc/RootLinks.java | 253 ++++++++++++++++++ .../java/com/gooddata/gdc/GdcServiceIT.java | 28 ++ .../java/com/gooddata/gdc/RootLinksTest.java | 37 +++ 6 files changed, 338 insertions(+), 213 deletions(-) create mode 100644 src/main/java/com/gooddata/gdc/RootLinks.java create mode 100644 src/test/java/com/gooddata/gdc/RootLinksTest.java diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index f5842a5ee..7788a3426 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -69,7 +69,7 @@ public DataStoreService(HttpClient httpClient, RestTemplate restTemplate, GdcSer private UriPrefixer getPrefixer() { if (prefixer == null) { - final String uriString = gdcService.getGdc().getUserStagingLink(); + final String uriString = gdcService.getRootLinks().getUserStagingLink(); final URI uri = URI.create(uriString); prefixer = new UriPrefixer(uri.isAbsolute() ? uri : gdcUri.resolve(uriString)); sardine.enablePreemptiveAuthentication(prefixer.getUriPrefix().getHost()); diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 3f83476fd..7dad58440 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -17,8 +17,10 @@ /** * GoodData API root links (aka "about" or "home"). * Deserialization only. + * @deprecated use {@link RootLinks} instead */ -public class Gdc extends AboutLinks { +@Deprecated +public class Gdc extends RootLinks { /** * URI of GoodData API root @@ -27,217 +29,7 @@ public class Gdc extends AboutLinks { @JsonCreator public Gdc(@JsonProperty("links") List links) { - super(null, null, null, links); - } - - /** - * Get GoodData API root link - * - * @return GoodData API root link - */ - @JsonIgnore - public String getHomeLink() { - return getLink(LinkCategory.HOME).getUri(); - } - - /** - * Get temporary token generator link - * - * @return temporary token generator link - */ - @JsonIgnore - public String getTokenLink() { - return getLink(LinkCategory.TOKEN).getUri(); - } - - /** - * Get authentication service link - * - * @return authentication service link - */ - @JsonIgnore - public String getLoginLink() { - return getLink(LinkCategory.LOGIN).getUri(); - } - - /** - * Get metadata resources link - * - * @return metadata resources link - */ - @JsonIgnore - public String getMetadataLink() { - return getLink(LinkCategory.METADATA).getUri(); - } - - /** - * Get report execution resource link - * - * @return report execution resource link - */ - @JsonIgnore - public String getXTabLink() { - return getLink(LinkCategory.XTAB).getUri(); - } - - /** - * Get link of resource used to determine valid attribute values in the context of a report - * - * @return link of resource used to determine valid attribute values in the context of a report - */ - @JsonIgnore - public String getAvailableElementsLink() { - return getLink(LinkCategory.AVAILABLE_ELEMENTS).getUri(); - } - - /** - * Get report exporting resource link - * - * @return report exporting resource link - */ - @JsonIgnore - public String getReportExporterLink() { - return getLink(LinkCategory.REPORT_EXPORTER).getUri(); - } - - /** - * Get account manipulation resource link - * - * @return account manipulation resource link - */ - @JsonIgnore - public String getAccountLink() { - return getLink(LinkCategory.ACCOUNT).getUri(); - } - - /** - * Get user and project management resource link - * - * @return user and project management resource link - */ - @JsonIgnore - public String getProjectsLink() { - return getLink(LinkCategory.PROJECTS).getUri(); - } - - /** - * Get miscellaneous tool resource link - * - * @return miscellaneous tool resource link - */ - @JsonIgnore - public String getToolLink() { - return getLink(LinkCategory.TOOL).getUri(); - } - - /** - * Get template resource link - * - * @return template resource link - */ - @JsonIgnore - public String getTemplatesLink() { - return getLink(LinkCategory.TEMPLATES).getUri(); - } - - /** - * Get release information link - * - * @return release information link - */ - @JsonIgnore - public String getReleaseInfoLink() { - return getLink(LinkCategory.RELEASE_INFO).getUri(); - } - - /** - * Get user data staging area link - * - * @return user data staging area link - */ - @JsonIgnore - public String getUserStagingLink() { - return getLink(LinkCategory.USER_STAGING).getUri(); - } - - /** - * Get link by category - * - * @param category requested link category - * @return link by given category - */ - @JsonIgnore - private Link getLink(LinkCategory category) { - for (Link link : getLinks()) { - if (category.value.equals(link.getCategory())) { - return link; - } - } - return null; - } - - /** - * GoodData API root link category enum - */ - private enum LinkCategory { - /** - * GoodData API root - */ - HOME("home"), - /** - * Temporary token generator - */ - TOKEN("token"), - /** - * Authentication service - */ - LOGIN("login"), - /** - * Metadata resources - */ - METADATA("md"), - /** - * Report execution resource - */ - XTAB("xtab"), - /** - * Resource used to determine valid attribute values in the context of a report - */ - AVAILABLE_ELEMENTS("availablelements"), - /** - * Report exporting resource - */ - REPORT_EXPORTER("report-exporter"), - /** - * Resource for logged in account manipulation - */ - ACCOUNT("account"), - /** - * Resource for user and project management - */ - PROJECTS("projects"), - /** - * Miscellaneous resources - */ - TOOL("tool"), - /** - * Template resource - for internal use only - */ - TEMPLATES("templates"), - /** - * Release information - */ - RELEASE_INFO("releaseInfo"), - /** - * User data staging area - */ - USER_STAGING("uploads"); - - private final String value; - - LinkCategory(final String value) { - this.value = value; - } + super(links); } } \ No newline at end of file diff --git a/src/main/java/com/gooddata/gdc/GdcService.java b/src/main/java/com/gooddata/gdc/GdcService.java index e256c90d4..2b8100a21 100644 --- a/src/main/java/com/gooddata/gdc/GdcService.java +++ b/src/main/java/com/gooddata/gdc/GdcService.java @@ -21,7 +21,9 @@ public GdcService(RestTemplate restTemplate) { * Obtains GoodData API root links. * * @return GoodData API root links + * @deprecated use {@link #getRootLinks()} instead */ + @Deprecated public Gdc getGdc() { try { return restTemplate.getForObject(Gdc.URI, Gdc.class); @@ -30,4 +32,17 @@ public Gdc getGdc() { } } + /** + * Obtains GoodData API root links. + * + * @return GoodData API root links + */ + public RootLinks getRootLinks() { + try { + return restTemplate.getForObject(RootLinks.URI, RootLinks.class); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to get gdc root links", e); + } + } + } diff --git a/src/main/java/com/gooddata/gdc/RootLinks.java b/src/main/java/com/gooddata/gdc/RootLinks.java new file mode 100644 index 000000000..32374e6b9 --- /dev/null +++ b/src/main/java/com/gooddata/gdc/RootLinks.java @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.GoodDataException; + +import java.util.List; + +/** + * GoodData API root links (aka "about" or "home"). + * Deserialization only. + */ +public class RootLinks extends AboutLinks { + + /** + * URI of GoodData API root + */ + public static final String URI = "/gdc"; + + @JsonCreator + public RootLinks(@JsonProperty("links") List links) { + super(null, null, null, links); + } + + /** + * Get GoodData API root link + * + * @return GoodData API root link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getHomeLink() { + return getLink(LinkCategory.HOME).getUri(); + } + + /** + * Get temporary token generator link + * + * @return temporary token generator link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getTokenLink() { + return getLink(LinkCategory.TOKEN).getUri(); + } + + /** + * Get authentication service link + * + * @return authentication service link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getLoginLink() { + return getLink(LinkCategory.LOGIN).getUri(); + } + + /** + * Get metadata resources link + * + * @return metadata resources link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getMetadataLink() { + return getLink(LinkCategory.METADATA).getUri(); + } + + /** + * Get report execution resource link + * + * @return report execution resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getXTabLink() { + return getLink(LinkCategory.XTAB).getUri(); + } + + /** + * Get link of resource used to determine valid attribute values in the context of a report + * + * @return link of resource used to determine valid attribute values in the context of a report + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getAvailableElementsLink() { + return getLink(LinkCategory.AVAILABLE_ELEMENTS).getUri(); + } + + /** + * Get report exporting resource link + * + * @return report exporting resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getReportExporterLink() { + return getLink(LinkCategory.REPORT_EXPORTER).getUri(); + } + + /** + * Get account manipulation resource link + * + * @return account manipulation resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getAccountLink() { + return getLink(LinkCategory.ACCOUNT).getUri(); + } + + /** + * Get user and project management resource link + * + * @return user and project management resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getProjectsLink() { + return getLink(LinkCategory.PROJECTS).getUri(); + } + + /** + * Get miscellaneous tool resource link + * + * @return miscellaneous tool resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getToolLink() { + return getLink(LinkCategory.TOOL).getUri(); + } + + /** + * Get template resource link + * + * @return template resource link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getTemplatesLink() { + return getLink(LinkCategory.TEMPLATES).getUri(); + } + + /** + * Get release information link + * + * @return release information link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getReleaseInfoLink() { + return getLink(LinkCategory.RELEASE_INFO).getUri(); + } + + /** + * Get user data staging area link + * + * @return user data staging area link + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getUserStagingLink() { + return getLink(LinkCategory.USER_STAGING).getUri(); + } + + /** + * Get link by category + * + * @param category requested link category + * @return link by given category + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + private Link getLink(LinkCategory category) { + for (Link link : getLinks()) { + if (category.value.equals(link.getCategory())) { + return link; + } + } + throw new GoodDataException("No link with such category found"); + } + + /** + * GoodData API root link category enum + */ + private enum LinkCategory { + /** + * GoodData API root + */ + HOME("home"), + /** + * Temporary token generator + */ + TOKEN("token"), + /** + * Authentication service + */ + LOGIN("login"), + /** + * Metadata resources + */ + METADATA("md"), + /** + * Report execution resource + */ + XTAB("xtab"), + /** + * Resource used to determine valid attribute values in the context of a report + */ + AVAILABLE_ELEMENTS("availablelements"), + /** + * Report exporting resource + */ + REPORT_EXPORTER("report-exporter"), + /** + * Resource for logged in account manipulation + */ + ACCOUNT("account"), + /** + * Resource for user and project management + */ + PROJECTS("projects"), + /** + * Miscellaneous resources + */ + TOOL("tool"), + /** + * Template resource - for internal use only + */ + TEMPLATES("templates"), + /** + * Release information + */ + RELEASE_INFO("releaseInfo"), + /** + * User data staging area + */ + USER_STAGING("uploads"); + + private final String value; + + LinkCategory(final String value) { + this.value = value; + } + } + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index 9172c9e1f..d1f829363 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -39,4 +39,32 @@ public void shouldUseProperVersionHeader() throws Exception { final Gdc gdc = gd.getGdcService().getGdc(); assertThat(gdc, is(notNullValue())); } + + @Test + public void shouldReturnRootLinks() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .respond() + .withBody(readFromResource("/gdc/gdc.json")) + .withStatus(200); + + final RootLinks rootLinks = gd.getGdcService().getRootLinks(); + assertThat(rootLinks, is(notNullValue())); + assertThat(rootLinks.getUserStagingLink(), is("/uploads")); + } + + @Test + public void rootLinksShouldUseProperVersionHeader() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo("/gdc") + .havingHeaderEqualTo("Accept", "application/json;version=1") + .respond() + .withBody(readFromResource("/gdc/gdc.json")) + .withStatus(200); + + final RootLinks rootLinks = gd.getGdcService().getRootLinks(); + assertThat(rootLinks, is(notNullValue())); + } } diff --git a/src/test/java/com/gooddata/gdc/RootLinksTest.java b/src/test/java/com/gooddata/gdc/RootLinksTest.java new file mode 100644 index 000000000..59ec65d9b --- /dev/null +++ b/src/test/java/com/gooddata/gdc/RootLinksTest.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.gdc; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class RootLinksTest { + + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); + final RootLinks rootLinks = new ObjectMapper().readValue(stream, RootLinks.class); + assertThat(rootLinks, is(notNullValue())); + + assertThat(rootLinks.getHomeLink(), is("/gdc/")); + assertThat(rootLinks.getTokenLink(), is("/gdc/account/token")); + assertThat(rootLinks.getLoginLink(), is("/gdc/account/login")); + assertThat(rootLinks.getMetadataLink(), is("/gdc/md")); + assertThat(rootLinks.getXTabLink(), is("/gdc/xtab2")); + assertThat(rootLinks.getAvailableElementsLink(), is("/gdc/availableelements")); + assertThat(rootLinks.getReportExporterLink(), is("/gdc/exporter")); + assertThat(rootLinks.getAccountLink(), is("/gdc/account")); + assertThat(rootLinks.getProjectsLink(), is("/gdc/projects")); + assertThat(rootLinks.getToolLink(), is("/gdc/tool")); + assertThat(rootLinks.getTemplatesLink(), is("/gdc/templates")); + assertThat(rootLinks.getReleaseInfoLink(), is("/gdc/releaseInfo")); + assertThat(rootLinks.getUserStagingLink(), is("/uploads")); + } +} \ No newline at end of file From 2b8a884488eb5afd91f88163508a9b8f0542bb46 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 29 Jul 2016 18:21:50 +0200 Subject: [PATCH 0376/1191] Set DefaultSocketConfig with socket timeout Currently we use only RequestConfig, which is applied after the connection is establish. However in certain situations (i.e. when connected throughout proxy) connecting include making requests, in such situations defaultSocketConfig on ConnectionManager is used. --- src/main/java/com/gooddata/GoodData.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 5bd4173d8..bc952736d 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -24,6 +24,7 @@ import org.apache.http.HttpHost; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; +import org.apache.http.config.SocketConfig; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.VersionInfo; @@ -210,6 +211,10 @@ private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings setting connectionManager.setDefaultMaxPerRoute(settings.getMaxConnections()); connectionManager.setMaxTotal(settings.getMaxConnections()); + final SocketConfig.Builder socketConfig = SocketConfig.copy(SocketConfig.DEFAULT); + socketConfig.setSoTimeout(settings.getSocketTimeout()); + connectionManager.setDefaultSocketConfig(socketConfig.build()); + final RequestConfig.Builder requestConfig = RequestConfig.copy(RequestConfig.DEFAULT); requestConfig.setConnectTimeout(settings.getConnectionTimeout()); requestConfig.setConnectionRequestTimeout(settings.getConnectionRequestTimeout()); From 397b58a7bc3eab4d1b87eba1a3795ec506473ce2 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 11 Mar 2016 20:11:22 +0100 Subject: [PATCH 0377/1191] Add URI vs. Link naming description --- CONTRIBUTING.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03e7cf3d1..8678e8ac4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,7 @@ Below are few **rules, recommendations and best practices** we try to follow whe ### DTOs * All DTOs which can be updated should be **mutable**. Please keep mutable only the fields which are subject of change, the rest should be immutable. -* Create method named `String getUri()` to provide **link to self**. +* Create method named `String getUri()` to provide **URI string to self**. * Introduce **constants**: ```java public static final String URI = "/gdc/someresource/{resource-id}"; @@ -28,6 +28,10 @@ public static final UriTemplate TEMPLATE = new UriTemplate(URI); * Consider the **visibility** - use `package protected` when DTO is not intended for SDK user, but is needed in related service. * Test all DTOs using _[JsonUnit](https://github.com/lukas-krecan/JsonUnit)_. +* **Naming**: + * `Uri` for _URI string_ of some resource + * `Link` for structure containing at least _category_ (e.g. "self") and _URI string_ + (can contain also others like _title_, _summary_, etc.) ### Enums * Use enums sparingly, because they don't work with REST API changes (eg. new value added on the backend) **never use From 9aba81e06da5ec405d0f36e5270834e0f739a8ea Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 11 Mar 2016 21:03:28 +0100 Subject: [PATCH 0378/1191] Sanitize IdentifierToUri --- .../java/com/gooddata/md/IdentifierToUri.java | 22 +++++++++---------- .../com/gooddata/md/MetadataServiceIT.java | 16 ++++++++------ src/test/resources/md/identifierToUri.json | 5 +++++ 3 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 src/test/resources/md/identifierToUri.json diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index 7cc1a5be9..aab23d6de 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -1,6 +1,5 @@ package com.gooddata.md; -import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.Collection; @@ -8,20 +7,21 @@ import static com.gooddata.util.Validate.notNull; /** - * Strucuture with list of symbolic names to be expanded by related uri. + * Structure with list of symbolic names (identifiers) to be expanded to list of URIs. + * Serialization only. */ class IdentifierToUri { - private final Collection identifierToUri; + private final Collection identifiers; - @JsonCreator - IdentifierToUri(@JsonProperty("identifierToUri") final Collection identifierToUri) { - notNull(identifierToUri, "identifierToUri"); - this.identifierToUri = identifierToUri; + IdentifierToUri(final Collection identifiers) { + notNull(identifiers, "identifiers"); + this.identifiers = identifiers; } - public Collection getIdentifierToUri() { - return identifierToUri; + @JsonProperty("identifierToUri") + public Collection getIdentifiers() { + return identifiers; } @Override @@ -31,13 +31,13 @@ public boolean equals(Object o) { IdentifierToUri that = (IdentifierToUri) o; - if (!identifierToUri.equals(that.identifierToUri)) return false; + if (!identifiers.equals(that.identifiers)) return false; return true; } @Override public int hashCode() { - return identifierToUri.hashCode(); + return identifiers.hashCode(); } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index dd247032a..a1af86dfa 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -7,22 +7,22 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; +import com.gooddata.util.ResourceUtils; +import net.javacrumbs.jsonunit.JsonMatchers; import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.gooddata.util.ResourceUtils.readFromResource; import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static com.gooddata.util.ResourceUtils.readStringFromResource; import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; import static net.jadler.Jadler.onRequest; +import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -115,6 +115,7 @@ public void testFindIdentifierUris() throws IOException { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(IDENTIFIERS_URI) + .havingBody(jsonEquals(readStringFromResource("/md/identifierToUri.json"))) .respond() .withStatus(200) .withBody(MAPPER.writeValueAsString(response)); @@ -135,11 +136,12 @@ public void testIdentifiersToUris() throws IOException { onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(IDENTIFIERS_URI) + .havingBody(jsonEquals(readStringFromResource("/md/identifierToUri.json"))) .respond() .withStatus(200) .withBody(MAPPER.writeValueAsString(response)); - final Map uris = gd.getMetadataService().identifiersToUris(project, asList(ID)); + final Map uris = gd.getMetadataService().identifiersToUris(project, singletonList(ID)); assertThat(uris.keySet(), hasSize(1)); assertThat(uris.get(ID), is(OBJ_URI)); } diff --git a/src/test/resources/md/identifierToUri.json b/src/test/resources/md/identifierToUri.json new file mode 100644 index 000000000..2ea741bcb --- /dev/null +++ b/src/test/resources/md/identifierToUri.json @@ -0,0 +1,5 @@ +{ + "identifierToUri": [ + "ID" + ] +} From 210ec0b4737bab7d6430fd381c673edf6b0faabf Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 11 Mar 2016 21:26:19 +0100 Subject: [PATCH 0379/1191] Sanitize IdentifiersAndUris --- .../com/gooddata/md/IdentifierAndUri.java | 2 +- .../com/gooddata/md/IdentifiersAndUris.java | 27 +++++++++++++----- .../java/com/gooddata/md/MetadataService.java | 28 +++---------------- .../com/gooddata/md/MetadataServiceIT.java | 16 ++--------- src/test/resources/md/identifiersAndUris.json | 8 ++++++ 5 files changed, 35 insertions(+), 46 deletions(-) create mode 100644 src/test/resources/md/identifiersAndUris.json diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index 68b46db1b..f9c95672b 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; /** - * Encapsulates identifier and its uri. + * Encapsulates identifier and its URI. */ class IdentifierAndUri { diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index 5cf3c8d9c..ef414b4a9 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -3,23 +3,36 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; +import java.util.*; /** - * Encapsulates list of identifier and its uri. + * Encapsulates list of identifiers and their URIs. + * Deserialization only. */ class IdentifiersAndUris { public static final String URI = "/gdc/md/{projectId}/identifiers"; - private final List identifiers; + private final List identifiersAndUris; @JsonCreator - IdentifiersAndUris(@JsonProperty("identifiers") List identifiers) { - this.identifiers = identifiers; + IdentifiersAndUris(@JsonProperty("identifiers") List identifiersAndUris) { + this.identifiersAndUris = identifiersAndUris; } - public List getIdentifiers() { - return identifiers; + public List getUris() { + final List uris = new ArrayList<>(); + for (IdentifierAndUri idAndUri : identifiersAndUris) { + uris.add(idAndUri.getUri()); + } + return uris; + } + + public Map asMap() { + final Map identifiersToUris = new HashMap<>(); + for (IdentifierAndUri idAndUri : identifiersAndUris) { + identifiersToUris.put(idAndUri.getIdentifier(), idAndUri.getUri()); + } + return Collections.unmodifiableMap(identifiersToUris); } } diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 93f73d455..afe96ec89 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -6,7 +6,6 @@ import com.gooddata.AbstractService; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; import org.springframework.http.HttpStatus; @@ -14,12 +13,7 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; @@ -380,20 +374,13 @@ public Collection findUris(Project project, Restriction... restrictions) ids.add(restriction.getValue()); } - final IdentifiersAndUris response = getUrisForIdentifiers(project, ids); - - final List uris = new ArrayList<>(); - for (IdentifierAndUri idAndUri : response.getIdentifiers()) { - uris.add(idAndUri.getUri()); - } - - return uris; + return getUrisForIdentifiers(project, ids).getUris(); } /** * Find metadata URIs for given identifiers. * - * @param project project where to search for the metadata + * @param project project where to search for the metadata * @param identifiers query restrictions * @return the map of identifiers as keys and metadata URIs as values * @throws com.gooddata.GoodDataException if unable to query metadata @@ -403,14 +390,7 @@ public Map identifiersToUris(Project project, Collection notNull(project, "project" ); noNullElements(identifiers, "identifiers"); - final IdentifiersAndUris response = getUrisForIdentifiers(project, identifiers); - - final Map identifiersToUris = new HashMap<>(); - for (IdentifierAndUri idAndUri : response.getIdentifiers()) { - identifiersToUris.put(idAndUri.getIdentifier(), idAndUri.getUri()); - } - - return Collections.unmodifiableMap(identifiersToUris); + return getUrisForIdentifiers(project, identifiers).asMap(); } /** diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index a1af86dfa..0104f95b2 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -106,19 +106,13 @@ public void testUsedByBatch() throws Exception { @Test public void testFindIdentifierUris() throws IOException { - final IdentifierAndUri identifierAndUri = new IdentifierAndUri(ID, OBJ_URI); - - final List identifiersAndUris = new ArrayList<>(); - identifiersAndUris.add(identifierAndUri); - IdentifiersAndUris response = new IdentifiersAndUris(identifiersAndUris); - onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(IDENTIFIERS_URI) .havingBody(jsonEquals(readStringFromResource("/md/identifierToUri.json"))) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(response)); + .withBody(readFromResource("/md/identifiersAndUris.json")); final Collection uris = gd.getMetadataService().findUris(project, Restriction.identifier(ID)); assertThat(uris, hasSize(1)); @@ -127,19 +121,13 @@ public void testFindIdentifierUris() throws IOException { @Test public void testIdentifiersToUris() throws IOException { - final IdentifierAndUri identifierAndUri = new IdentifierAndUri(ID, OBJ_URI); - - final List identifiersAndUris = new ArrayList<>(); - identifiersAndUris.add(identifierAndUri); - IdentifiersAndUris response = new IdentifiersAndUris(identifiersAndUris); - onRequest() .havingMethodEqualTo("POST") .havingPathEqualTo(IDENTIFIERS_URI) .havingBody(jsonEquals(readStringFromResource("/md/identifierToUri.json"))) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(response)); + .withBody(readFromResource("/md/identifiersAndUris.json")); final Map uris = gd.getMetadataService().identifiersToUris(project, singletonList(ID)); assertThat(uris.keySet(), hasSize(1)); diff --git a/src/test/resources/md/identifiersAndUris.json b/src/test/resources/md/identifiersAndUris.json new file mode 100644 index 000000000..232a289fc --- /dev/null +++ b/src/test/resources/md/identifiersAndUris.json @@ -0,0 +1,8 @@ +{ + "identifiers": [ + { + "identifier": "ID", + "uri": "/gdc/md/PROJECT_ID/obj" + } + ] +} \ No newline at end of file From 04644dda6f4e9c333d30d64ccc661c2d680afb12 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Tue, 5 Apr 2016 23:53:53 +0200 Subject: [PATCH 0380/1191] Link to Uri rename --- .../java/com/gooddata/account/Account.java | 10 + .../dataload/processes/DataloadProcess.java | 20 ++ .../dataload/processes/ProcessExecution.java | 2 +- .../processes/ProcessExecutionDetail.java | 39 +++- .../processes/ProcessExecutionTask.java | 10 + .../dataload/processes/ProcessService.java | 12 +- .../java/com/gooddata/dataset/Dataset.java | 2 +- .../java/com/gooddata/gdc/AboutLinks.java | 9 + .../com/gooddata/gdc/DataStoreService.java | 2 +- .../java/com/gooddata/gdc/LinkEntries.java | 17 +- src/main/java/com/gooddata/gdc/RootLinks.java | 221 +++++++++++++++--- src/main/java/com/gooddata/md/Dataset.java | 20 ++ .../java/com/gooddata/md/DisplayForm.java | 10 + src/main/java/com/gooddata/md/Entry.java | 18 +- .../java/com/gooddata/md/MetadataService.java | 10 +- .../java/com/gooddata/md/NestedAttribute.java | 107 +++++++-- .../gooddata/md/report/ReportDefinition.java | 10 + .../java/com/gooddata/model/MaqlDdlLinks.java | 11 +- .../java/com/gooddata/model/ModelService.java | 2 +- .../java/com/gooddata/project/Project.java | 160 +++++++++++++ .../gooddata/warehouse/WarehouseService.java | 12 +- .../com/gooddata/warehouse/WarehouseTask.java | 15 ++ .../com/gooddata/account/AccountTest.java | 1 + .../processes/DataloadProcessTest.java | 4 +- .../processes/ProcessExecutionDetailTest.java | 5 +- .../processes/ProcessExecutionTaskTest.java | 3 +- .../com/gooddata/dataset/DatasetTest.java | 29 +++ .../java/com/gooddata/gdc/GdcServiceIT.java | 2 +- src/test/java/com/gooddata/gdc/GdcTest.java | 13 ++ .../com/gooddata/gdc/LinkEntriesTest.java | 1 + .../gooddata/md/AttributeDisplayFormTest.java | 1 + .../java/com/gooddata/md/AttributeTest.java | 2 + .../java/com/gooddata/md/DatasetTest.java | 2 + .../java/com/gooddata/md/DisplayFormTest.java | 1 + src/test/java/com/gooddata/md/EntryTest.java | 7 +- .../com/gooddata/md/MetadataServiceAT.java | 3 +- .../com/gooddata/md/MetadataServiceTest.java | 16 +- .../com/gooddata/md/NestedAttributeTest.java | 1 + .../md/report/ReportDefinitionTest.java | 1 + .../com/gooddata/model/MaqlDdlLinksTest.java | 1 + .../com/gooddata/project/ProjectTest.java | 29 ++- .../warehouse/WarehouseServiceIT.java | 12 +- .../gooddata/warehouse/WarehouseTaskTest.java | 2 + src/test/resources/dataset/dataset.json | 7 + 44 files changed, 737 insertions(+), 125 deletions(-) create mode 100644 src/test/java/com/gooddata/dataset/DatasetTest.java create mode 100644 src/test/resources/dataset/dataset.json diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 904131dd5..94880a702 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -64,8 +64,18 @@ public String getUri() { return links.getSelf(); } + /** + * @return projects URI string + * @deprecated use {@link #getProjectsUri()} instead + */ + @Deprecated @JsonIgnore public String getProjectsLink() { + return getProjectsUri(); + } + + @JsonIgnore + public String getProjectsUri() { return links.getProjects(); } diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index ae0a7030b..502323c1a 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -100,13 +100,33 @@ public String getId() { return TEMPLATE.match(getUri()).get("processId"); } + /** + * @return executions URI string + * @deprecated use {@link #getExecutionsUri()} instead + */ + @Deprecated @JsonIgnore public String getExecutionsLink() { + return getExecutionsUri(); + } + + @JsonIgnore + public String getExecutionsUri() { return links != null ? links.get(EXECUTIONS_LINK) : null; } + /** + * @return source URI string + * @deprecated use {@link #getSourceUri()} instead + */ + @Deprecated @JsonIgnore public String getSourceLink() { + return getSourceUri(); + } + + @JsonIgnore + public String getSourceUri() { return getUri() != null ? getUri() + "/source" : null; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 16111e034..79335cab0 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -35,7 +35,7 @@ public ProcessExecution(DataloadProcess process, String executable, Map params, Map hiddenParams) { notNull(process, "process"); - this.executionsUri = notEmpty(process.getExecutionsLink(), "process executions link"); + this.executionsUri = notEmpty(process.getExecutionsUri(), "process executions link"); this.executable = executable; this.params = notNull(params, "params"); this.hiddenParams = notNull(hiddenParams, "hiddenParams"); diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index 3ad500aba..b6c736f04 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -1,24 +1,19 @@ package com.gooddata.dataload.processes; -import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; - +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.gdc.ErrorStructure; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonIgnore; -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.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import java.net.URI; import java.util.Map; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + /** * Dataload process execution detail. Deserialization only. */ @@ -48,7 +43,7 @@ private ProcessExecutionDetail(@JsonProperty("status") String status, @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, @JsonProperty("finished") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime finished, @JsonProperty("error") ErrorStructure error, - @JsonProperty("links") Map links) { + @JsonProperty("links") Map links) { this.status = notEmpty(status, "status"); this.created = notNull(created, "created"); this.started = started; @@ -86,8 +81,18 @@ public ErrorStructure getError() { return error; } + /** + * @return log URI string + * @deprecated use {@link #getLogUri()} instead + */ + @Deprecated @JsonIgnore public String getLogLink() { + return getLogUri(); + } + + @JsonIgnore + public String getLogUri() { return links != null ? links.get(LOG_LINK) : null; } @@ -96,8 +101,18 @@ public String getUri() { return links != null ? links.get(SELF_LINK) : null; } + /** + * @return execution URI string + * @deprecated use {@link #getExecutionUri()} instead + */ + @Deprecated @JsonIgnore public String getExecutionLink() { + return getExecutionUri(); + } + + @JsonIgnore + public String getExecutionUri() { return links != null ? links.get(EXECUTION_LINK) : null; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java index d51d3e758..7809f5874 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -26,11 +26,21 @@ private ProcessExecutionTask(@JsonProperty("links") Map links) { this.links = links; } + @Deprecated String getPollLink() { + return getPollUri(); + } + + String getPollUri() { return links != null ? links.get(POLL_LINK) : null; } + @Deprecated String getDetailLink() { + return getDetailUri(); + } + + String getDetailUri() { return links != null ? links.get(DETAIL_LINK) : null; } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 9fbccf5b3..5e7dbb218 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -185,10 +185,10 @@ public void getProcessSource(DataloadProcess process, OutputStream outputStream) notNull(process, "process"); notNull(outputStream, "outputStream"); try { - restTemplate.execute(process.getSourceLink(), HttpMethod.GET, + restTemplate.execute(process.getSourceUri(), HttpMethod.GET, null, new OutputStreamResponseExtractor(outputStream)); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to get process source " + process.getSourceLink(), e); + throw new GoodDataException("Unable to get process source " + process.getSourceUri(), e); } } @@ -201,10 +201,10 @@ public void getExecutionLog(ProcessExecutionDetail executionDetail, OutputStream notNull(executionDetail, "executionDetail"); notNull(outputStream, "outputStream"); try { - restTemplate.execute(executionDetail.getLogLink(), HttpMethod.GET, + restTemplate.execute(executionDetail.getLogUri(), HttpMethod.GET, null, new OutputStreamResponseExtractor(outputStream)); } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to get process execution log " + executionDetail.getLogLink(), e); + throw new GoodDataException("Unable to get process execution log " + executionDetail.getLogUri(), e); } } @@ -228,9 +228,9 @@ public FutureResult executeProcess(ProcessExecution exec throw new ProcessExecutionException("Cannot find started execution."); } - final String detailLink = executionTask.getDetailLink(); + final String detailLink = executionTask.getDetailUri(); - return new PollResult<>(this, new AbstractPollHandler(executionTask.getPollLink(), Void.class, ProcessExecutionDetail.class) { + return new PollResult<>(this, new AbstractPollHandler(executionTask.getPollUri(), Void.class, ProcessExecutionDetail.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { return HttpStatus.NO_CONTENT.equals(response.getStatusCode()); diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java index fe0806f82..85068d532 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -3,11 +3,11 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; -import com.gooddata.gdc.AboutLinks; import com.gooddata.gdc.AboutLinks.Link; /** * Dataset link + * * @deprecated use {@link Link} instead */ @Deprecated diff --git a/src/main/java/com/gooddata/gdc/AboutLinks.java b/src/main/java/com/gooddata/gdc/AboutLinks.java index c3e62439f..cb25c68e0 100644 --- a/src/main/java/com/gooddata/gdc/AboutLinks.java +++ b/src/main/java/com/gooddata/gdc/AboutLinks.java @@ -79,6 +79,15 @@ public String getUri() { return uri; } + /** + * @return self URI string + * @deprecated use {@link #getUri()} instead + */ + @Deprecated + public String getLink() { + return getUri(); + } + public String getTitle() { return title; } diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 7788a3426..965620c65 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -69,7 +69,7 @@ public DataStoreService(HttpClient httpClient, RestTemplate restTemplate, GdcSer private UriPrefixer getPrefixer() { if (prefixer == null) { - final String uriString = gdcService.getRootLinks().getUserStagingLink(); + final String uriString = gdcService.getRootLinks().getUserStagingUri(); final URI uri = URI.create(uriString); prefixer = new UriPrefixer(uri.isAbsolute() ? uri : gdcUri.resolve(uriString)); sardine.enablePreemptiveAuthentication(prefixer.getUriPrefix().getHost()); diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/src/main/java/com/gooddata/gdc/LinkEntries.java index 1e6d96b96..f56d7ac4d 100644 --- a/src/main/java/com/gooddata/gdc/LinkEntries.java +++ b/src/main/java/com/gooddata/gdc/LinkEntries.java @@ -29,17 +29,26 @@ protected List getEntries() { @JsonIgnoreProperties(ignoreUnknown = true) protected static class LinkEntry { - private final String link; + private final String uri; private final String category; @JsonCreator - private LinkEntry(@JsonProperty("link") String link, @JsonProperty("category") String category) { - this.link = link; + private LinkEntry(@JsonProperty("link") String uri, @JsonProperty("category") String category) { + this.uri = uri; this.category = category; } + /** + * @return self URI string + * @deprecated use {@link #getUri()} instead + */ + @Deprecated public String getLink() { - return link; + return getUri(); + } + + public String getUri() { + return uri; } public String getCategory() { diff --git a/src/main/java/com/gooddata/gdc/RootLinks.java b/src/main/java/com/gooddata/gdc/RootLinks.java index 32374e6b9..14af65a7d 100644 --- a/src/main/java/com/gooddata/gdc/RootLinks.java +++ b/src/main/java/com/gooddata/gdc/RootLinks.java @@ -27,145 +27,314 @@ public RootLinks(@JsonProperty("links") List links) { } /** - * Get GoodData API root link + * Get GoodData API root URI string * - * @return GoodData API root link + * @return GoodData API root URI string + * @deprecated use {@link #getHomeUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getHomeLink() { + return getHomeUri(); + } + + /** + * Get GoodData API root URI string + * + * @return GoodData API root URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getHomeUri() { return getLink(LinkCategory.HOME).getUri(); } /** - * Get temporary token generator link + * Get temporary token generator URI string * - * @return temporary token generator link + * @return temporary token generator URI string + * @deprecated use {@link #getTokenUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getTokenLink() { + return getTokenUri(); + } + + /** + * Get temporary token generator URI string + * + * @return temporary token generator URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getTokenUri() { return getLink(LinkCategory.TOKEN).getUri(); } /** - * Get authentication service link + * Get authentication service URI string * - * @return authentication service link + * @return authentication service URI string + * @deprecated use {@link #getLoginUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getLoginLink() { + return getLoginUri(); + } + + /** + * Get authentication service URI string + * + * @return authentication service URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getLoginUri() { return getLink(LinkCategory.LOGIN).getUri(); } /** - * Get metadata resources link + * Get metadata resources URI string * - * @return metadata resources link + * @return metadata resources URI string + * @deprecated use {@link #getMetadataUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getMetadataLink() { + return getMetadataUri(); + } + + /** + * Get metadata resources URI string + * + * @return metadata resources URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getMetadataUri() { return getLink(LinkCategory.METADATA).getUri(); } /** - * Get report execution resource link + * Get report execution resource URI string * - * @return report execution resource link + * @return report execution resource URI string + * @deprecated use {@link #getXTabUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getXTabLink() { + return getXTabUri(); + } + + /** + * Get report execution resource URI string + * + * @return report execution resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getXTabUri() { return getLink(LinkCategory.XTAB).getUri(); } /** - * Get link of resource used to determine valid attribute values in the context of a report + * Get URI string of resource used to determine valid attribute values in the context of a report * - * @return link of resource used to determine valid attribute values in the context of a report + * @return URI string of resource used to determine valid attribute values in the context of a report + * @deprecated use {@link #getAvailableElementsUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getAvailableElementsLink() { + return getAvailableElementsUri(); + } + + /** + * Get URI string of resource used to determine valid attribute values in the context of a report + * + * @return URI string of resource used to determine valid attribute values in the context of a report + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getAvailableElementsUri() { return getLink(LinkCategory.AVAILABLE_ELEMENTS).getUri(); } /** - * Get report exporting resource link + * Get report exporting resource URI string * - * @return report exporting resource link + * @return report exporting resource URI string + * @deprecated use {@link #getReportExporterUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getReportExporterLink() { + return getReportExporterUri(); + } + + /** + * Get report exporting resource URI string + * + * @return report exporting resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getReportExporterUri() { return getLink(LinkCategory.REPORT_EXPORTER).getUri(); } /** - * Get account manipulation resource link + * Get account manipulation resource URI string * - * @return account manipulation resource link + * @return account manipulation resource URI string + * @deprecated use {@link #getAccountUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getAccountLink() { + return getAccountUri(); + } + + /** + * Get account manipulation resource URI string + * + * @return account manipulation resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getAccountUri() { return getLink(LinkCategory.ACCOUNT).getUri(); } /** - * Get user and project management resource link + * Get user and project management resource URI string * - * @return user and project management resource link + * @return user and project management resource URI string + * @deprecated use {@link #getProjectsUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getProjectsLink() { + return getProjectsUri(); + } + + /** + * Get user and project management resource URI string + * + * @return user and project management resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getProjectsUri() { return getLink(LinkCategory.PROJECTS).getUri(); } /** - * Get miscellaneous tool resource link + * Get miscellaneous tool resource URI string * - * @return miscellaneous tool resource link + * @return miscellaneous tool resource URI string + * @deprecated use {@link #getToolUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getToolLink() { + return getToolUri(); + } + + /** + * Get miscellaneous tool resource URI string + * + * @return miscellaneous tool resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getToolUri() { return getLink(LinkCategory.TOOL).getUri(); } /** - * Get template resource link + * Get template resource URI string * - * @return template resource link + * @return template resource URI string + * @deprecated use {@link #getTemplatesUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getTemplatesLink() { + return getTemplatesUri(); + } + + /** + * Get template resource URI string + * + * @return template resource URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getTemplatesUri() { return getLink(LinkCategory.TEMPLATES).getUri(); } /** - * Get release information link + * Get release information URI string * - * @return release information link + * @return release information URI string + * @deprecated use {@link #getReleaseInfoUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getReleaseInfoLink() { + return getReleaseInfoUri(); + } + + /** + * Get release information URI string + * + * @return release information URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getReleaseInfoUri() { return getLink(LinkCategory.RELEASE_INFO).getUri(); } /** - * Get user data staging area link + * Get user data staging area URI string * - * @return user data staging area link + * @return user data staging area URI string + * @deprecated use {@link #getUserStagingUri()} instead * @throws GoodDataException in case no link with such category found */ + @Deprecated @JsonIgnore public String getUserStagingLink() { + return getUserStagingUri(); + } + + /** + * Get user data staging area URI string + * + * @return user data staging area URI string + * @throws GoodDataException in case no link with such category found + */ + @JsonIgnore + public String getUserStagingUri() { return getLink(LinkCategory.USER_STAGING).getUri(); } diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index a957d7a99..8450df70d 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -80,13 +80,33 @@ public boolean hasUploadConfiguration() { return Boolean.TRUE.equals(content.hasUploadConfiguration()); } + /** + * @return data uploads URI string + * @deprecated use {@link #getDataUploadsUri()} instead + */ + @Deprecated @JsonIgnore public String getDataUploadsLink() { + return getDataUploadsUri(); + } + + @JsonIgnore + public String getDataUploadsUri() { return links != null ? links.get(DATA_UPLOADS_LINK) : null; } + /** + * @return upload configuration URI string + * @deprecated use {@link #getUploadConfigurationUri()} instead + */ + @Deprecated @JsonIgnore public String getUploadConfigurationLink() { + return getUploadConfigurationUri(); + } + + @JsonIgnore + public String getUploadConfigurationUri() { return links != null ? links.get(UPLOAD_CONFIGURATION_LINK) : null; } diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 04926d896..750a4e001 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -50,8 +50,18 @@ public String getType() { return content.getType(); } + /** + * @return elements URI string + * @deprecated use {@link #getElementsUri()} instead + */ + @Deprecated @JsonIgnore public String getElementsLink() { + return getElementsUri(); + } + + @JsonIgnore + public String getElementsUri() { return links.getElements(); } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 570d753bd..89051cb03 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -15,7 +15,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Entry { - private final String link; + private final String uri; private final String title; private final String summary; private final String category; @@ -30,7 +30,7 @@ public class Entry { private final Boolean unlisted; @JsonCreator - public Entry(@JsonProperty("link") String link, + public Entry(@JsonProperty("link") String uri, @JsonProperty("title") String title, @JsonProperty("summary") String summary, @JsonProperty("category") String category, @@ -43,7 +43,7 @@ public Entry(@JsonProperty("link") String link, @JsonProperty("updated") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime updated, @JsonProperty("locked") @JsonDeserialize(using = BooleanDeserializer.class) Boolean locked, @JsonProperty("unlisted") @JsonDeserialize(using = BooleanDeserializer.class) Boolean unlisted) { - this.link = link; + this.uri = uri; this.title = title; this.summary = summary; this.category = category; @@ -58,8 +58,18 @@ public Entry(@JsonProperty("link") String link, this.unlisted = unlisted; } + /** + * @return self URI string + * @deprecated use {@link #getUri()} instead + */ + @Deprecated public String getLink() { - return link; + return getUri(); + } + + @JsonIgnore + public String getUri() { + return uri; } public String getTitle() { diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index afe96ec89..3b94ecc02 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -286,7 +286,7 @@ public Collection findUris(Project project, final Collection entries = find(project, cls, restrictions); final Collection result = new ArrayList<>(entries.size()); for (Entry entry : entries) { - result.add(entry.getLink()); + result.add(entry.getUri()); } return result; } @@ -414,16 +414,16 @@ public List getAttributeElements(Attribute attribute) { public List getAttributeElements(DisplayForm displayForm) { notNull(displayForm, "displayForm"); - final String elementsLink = displayForm.getElementsLink(); - if (StringUtils.isEmpty(elementsLink)) { + final String elementsUri = displayForm.getElementsUri(); + if (StringUtils.isEmpty(elementsUri)) { return Collections.emptyList(); } try { - final AttributeElements attributeElements = restTemplate.getForObject(elementsLink, AttributeElements.class); + final AttributeElements attributeElements = restTemplate.getForObject(elementsUri, AttributeElements.class); return attributeElements.getElements(); } catch (GoodDataRestException | RestClientException e) { - throw new GoodDataException("Unable to get attribute elements from " + elementsLink + ".", e); + throw new GoodDataException("Unable to get attribute elements from " + elementsUri + ".", e); } } diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index d8835db97..082ec6b6b 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -3,11 +3,7 @@ */ package com.gooddata.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.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.*; import java.util.Collection; @@ -48,13 +44,23 @@ public DisplayForm getDefaultDisplayForm() { return getDisplayForms().iterator().next(); } + /** + * @return dimension URI string + * @deprecated use {@link #getDimensionUri()} instead + */ + @Deprecated @JsonIgnore public String getDimensionLink() { - return content.getDimensionLink(); + return getDimensionUri(); + } + + @JsonIgnore + public String getDimensionUri() { + return content.getDimensionUri(); } public boolean hasDimension() { - return getDimensionLink() != null; + return getDimensionUri() != null; } @JsonIgnore @@ -117,14 +123,34 @@ public Collection getCompositeAttributePk() { return content.getCompositeAttributePk(); } + /** + * @return drill-down step display form URI string + * @deprecated use {@link #getDrillDownStepDisplayFormUri()} instead + */ + @Deprecated @JsonIgnore public String getDrillDownStepDisplayFormLink() { - return content.getDrillDownStepDisplayFormLink(); + return getDrillDownStepDisplayFormUri(); } + @JsonIgnore + public String getDrillDownStepDisplayFormUri() { + return content.getDrillDownStepDisplayFormUri(); + } + + /** + * @return linked display form URI string + * @deprecated use {@link #getLinkedDisplayFormUri()} instead + */ + @Deprecated @JsonIgnore public String getLinkedDisplayFormLink() { - return content.getLinkedDisplayFormLink(); + return getLinkedDisplayFormUri(); + } + + @JsonIgnore + public String getLinkedDisplayFormUri() { + return content.getLinkedDisplayFormUri(); } /** @@ -154,18 +180,25 @@ protected static class Content { private final Collection compositeAttribute; private final Collection compositeAttributePk; private final String drillDownStepAttributeDF; - private final String linkAttributeDF; + private final String linkedDisplayFormUri; private final Collection folders; private final Collection grain; @JsonCreator - protected Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Collection fk, - @JsonProperty("displayForms") Collection displayForms, @JsonProperty("dimension") String dimension, - @JsonProperty("direction") String direction, @JsonProperty("sort") AttributeSort sort, @JsonProperty("type") String type, - @JsonProperty("rel") Collection rel, @JsonProperty("compositeAttribute") Collection compositeAttribute, - @JsonProperty("compositeAttributePk") Collection compositeAttributePk, - @JsonProperty("drillDownStepAttributeDF") String drillDownStepAttributeDF, @JsonProperty("linkAttributeDF") String linkAttributeDF, - @JsonProperty("folders") Collection folders, @JsonProperty("grain") Collection grain) { + protected Content(@JsonProperty("pk") Collection pk, + @JsonProperty("fk") Collection fk, + @JsonProperty("displayForms") Collection displayForms, + @JsonProperty("dimension") String dimension, + @JsonProperty("direction") String direction, + @JsonProperty("sort") AttributeSort sort, + @JsonProperty("type") String type, + @JsonProperty("rel") Collection rel, + @JsonProperty("compositeAttribute") Collection compositeAttribute, + @JsonProperty("compositeAttributePk") Collection compositeAttributePk, + @JsonProperty("drillDownStepAttributeDF") String drillDownStepAttributeDF, + @JsonProperty("linkAttributeDF") String linkedDisplayFormUri, + @JsonProperty("folders") Collection folders, + @JsonProperty("grain") Collection grain) { this.pk = pk; this.fk = fk; this.displayForms = displayForms; @@ -177,7 +210,7 @@ protected Content(@JsonProperty("pk") Collection pk, @JsonProperty("fk") Co this.compositeAttribute = compositeAttribute; this.compositeAttributePk = compositeAttributePk; this.drillDownStepAttributeDF = drillDownStepAttributeDF; - this.linkAttributeDF = linkAttributeDF; + this.linkedDisplayFormUri = linkedDisplayFormUri; this.folders = folders; this.grain = grain; } @@ -194,8 +227,18 @@ public Collection getDisplayForms() { return displayForms; } - @JsonProperty("dimension") + /** + * @return dimension URI string + * @deprecated use {@link #getDimensionUri()} instead + */ + @Deprecated + @JsonIgnore public String getDimensionLink() { + return getDimensionUri(); + } + + @JsonProperty("dimension") + public String getDimensionUri() { return dimension; } @@ -224,14 +267,34 @@ public Collection getCompositeAttributePk() { return compositeAttributePk; } - @JsonProperty("drillDownStepAttributeDF") + /** + * @return drill-down step display form URI string + * @deprecated use {@link #getDrillDownStepDisplayFormUri()} instead + */ + @Deprecated + @JsonIgnore public String getDrillDownStepDisplayFormLink() { + return getDrillDownStepDisplayFormUri(); + } + + @JsonProperty("drillDownStepAttributeDF") + public String getDrillDownStepDisplayFormUri() { return drillDownStepAttributeDF; } - @JsonProperty("linkAttributeDF") + /** + * @return linked display form URI string + * @deprecated use {@link #getLinkedDisplayFormUri()} instead + */ + @Deprecated + @JsonIgnore public String getLinkedDisplayFormLink() { - return linkAttributeDF; + return getLinkedDisplayFormUri(); + } + + @JsonProperty("linkAttributeDF") + public String getLinkedDisplayFormUri() { + return linkedDisplayFormUri; } public Collection getFolders() { diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 1a95adab2..2944df08d 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -59,8 +59,18 @@ public Grid getGrid() { return content.getGrid(); } + /** + * @return explain URI string + * @deprecated use {@link #getExplainUri()} instead + */ + @Deprecated @JsonIgnore public String getExplainLink() { + return getExplainUri(); + } + + @JsonIgnore + public String getExplainUri() { return links != null ? links.get(EXPLAIN_LINK) : null; } diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/src/main/java/com/gooddata/model/MaqlDdlLinks.java index 230e01914..6be97e64e 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/src/main/java/com/gooddata/model/MaqlDdlLinks.java @@ -26,10 +26,19 @@ private MaqlDdlLinks(@JsonProperty("entries") List entries) { super(entries); } + /** + * @return status URI string + * @deprecated use {@link #getStatusUri()} instead + */ + @Deprecated public String getStatusLink() { + return getStatusUri(); + } + + public String getStatusUri() { for (LinkEntry linkEntry : getEntries()) { if (TASKS_STATUS.equals(linkEntry.getCategory())) { - return linkEntry.getLink(); + return linkEntry.getUri(); } } return null; diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index 9d339005a..c333bfb88 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -143,7 +143,7 @@ private boolean executeNextMaqlChunk() { try { final MaqlDdlLinks links = restTemplate.postForObject(MaqlDdl.URI, new MaqlDdl(maqlChunks.poll()), MaqlDdlLinks.class, projectId); - this.pollUri = links.getStatusLink(); + this.pollUri = links.getStatusUri(); } catch (GoodDataRestException | RestClientException e) { throw new ModelException("Unable to update project model", e); } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 62972d127..7d21620a1 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -139,83 +139,243 @@ public String getUri() { return links.getSelf(); } + /** + * @return users URI string + * @deprecated use {@link #getUsersUri()} instead + */ + @Deprecated @JsonIgnore public String getUsersLink() { + return getUsersUri(); + } + + @JsonIgnore + public String getUsersUri() { return links.getUsers(); } + /** + * @return roles URI string + * @deprecated use {@link #getRolesUri()} instead + */ + @Deprecated @JsonIgnore public String getRolesLink() { + return getRolesUri(); + } + + @JsonIgnore + public String getRolesUri() { return links.getRoles(); } + /** + * @return groups URI string + * @deprecated use {@link #getGroupsUri()} instead + */ + @Deprecated @JsonIgnore public String getGroupsLink() { + return getGroupsUri(); + } + + @JsonIgnore + public String getGroupsUri() { return links.getGroups(); } + /** + * @return invitations URI string + * @deprecated use {@link #getInvitationsUri()} instead + */ + @Deprecated @JsonIgnore public String getInvitationsLink() { + return getInvitationsUri(); + } + + @JsonIgnore + public String getInvitationsUri() { return links.getInvitations(); } + /** + * @return LDM URI string + * @deprecated use {@link #getLdmUri()} instead + */ + @Deprecated @JsonIgnore public String getLdmLink() { + return getLdmUri(); + } + + @JsonIgnore + public String getLdmUri() { return links.getLdm(); } + /** + * @return LDM thumbnail URI string + * @deprecated use {@link #getLdmThumbnailUri()} instead + */ + @Deprecated @JsonIgnore public String getLdmThumbnailLink() { + return getLdmThumbnailUri(); + } + + @JsonIgnore + public String getLdmThumbnailUri() { return links.getLdmThumbnail(); } + /** + * @return metadata URI string + * @deprecated use {@link #getMetadataUri()} instead + */ + @Deprecated @JsonIgnore public String getMetadataLink() { + return getMetadataUri(); + } + + @JsonIgnore + public String getMetadataUri() { return links.getMetadata(); } + /** + * @return public artifacts URI string + * @deprecated use {@link #getPublicArtifactsUri()} instead + */ + @Deprecated @JsonIgnore public String getPublicArtifactsLink() { + return getPublicArtifactsUri(); + } + + @JsonIgnore + public String getPublicArtifactsUri() { return links.getPublicArtifacts(); } + /** + * @return templates URI string + * @deprecated use {@link #getTemplatesUri()} instead + */ + @Deprecated @JsonIgnore public String getTemplatesLink() { + return getTemplatesUri(); + } + + @JsonIgnore + public String getTemplatesUri() { return links.getTemplates(); } + /** + * @return connectors URI string + * @deprecated use {@link #getConnectorsUri()} instead + */ + @Deprecated @JsonIgnore public String getConnectorsLink() { + return getConnectorsUri(); + } + + @JsonIgnore + public String getConnectorsUri() { return links.getConnectors(); } + /** + * @return data load URI string + * @deprecated use {@link #getDataLoadUri()} instead + */ + @Deprecated @JsonIgnore public String getDataLoadLink() { + return getDataLoadUri(); + } + + @JsonIgnore + public String getDataLoadUri() { return links.getDataLoad(); } + /** + * @return schedules URI string + * @deprecated use {@link #getSchedulesUri()} instead + */ + @Deprecated @JsonIgnore public String getSchedulesLink() { + return getSchedulesUri(); + } + + @JsonIgnore + public String getSchedulesUri() { return links.getSchedules(); } + /** + * @return execute URI string + * @deprecated use {@link #getExecuteUri()} instead + */ + @Deprecated @JsonIgnore public String getExecuteLink() { + return getExecuteUri(); + } + + @JsonIgnore + public String getExecuteUri() { return links.getExecute(); } + /** + * @return event stores URI string + * @deprecated use {@link #getEventStoresUri()} instead + */ + @Deprecated @JsonIgnore public String getEventStoresLink() { + return getEventStoresUri(); + } + + @JsonIgnore + public String getEventStoresUri() { return links.getEventStores(); } + /** + * @return clear caches URI string + * @deprecated use {@link #getClearCachesUri()} instead + */ + @Deprecated @JsonIgnore public String getClearCachesLink() { + return getClearCachesUri(); + } + + @JsonIgnore + public String getClearCachesUri() { return links.getClearCaches(); } + /** + * @return uploads URI string + * @deprecated use {@link #getUploadsUri()} instead + */ + @Deprecated @JsonIgnore public String getUploadsLink() { + return getUploadsUri(); + } + + @JsonIgnore + public String getUploadsUri() { return links.getUploads(); } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index a9a1037c1..765fd163c 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -56,7 +56,7 @@ public FutureResult createWarehouse(Warehouse warehouse) { throw new GoodDataException("Empty response when Warehouse POSTed to API"); } - return new PollResult<>(this, new AbstractPollHandler(task.getPollLink(), WarehouseTask.class, Warehouse.class) { + return new PollResult<>(this, new AbstractPollHandler(task.getPollUri(), WarehouseTask.class, Warehouse.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { @@ -73,11 +73,11 @@ protected void onFinish() { @Override public void handlePollResult(WarehouseTask pollResult) { try { - final Warehouse warehouse = restTemplate.getForObject(pollResult.getWarehouseLink(), Warehouse.class); + final Warehouse warehouse = restTemplate.getForObject(pollResult.getWarehouseUri(), Warehouse.class); setResult(warehouse); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Warehouse creation finished, but can't get created warehouse, uri: " - + pollResult.getWarehouseLink(), e); + + pollResult.getWarehouseUri(), e); } } @@ -209,7 +209,7 @@ public FutureResult addUserToWarehouse(final Warehouse warehouse, return new PollResult<>(this, new AbstractPollHandler - (task.getPollLink(), WarehouseTask.class, WarehouseUser.class) { + (task.getPollUri(), WarehouseTask.class, WarehouseUser.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { @@ -219,11 +219,11 @@ public boolean isFinished(ClientHttpResponse response) throws IOException { @Override public void handlePollResult(WarehouseTask pollResult) { try { - final WarehouseUser newUser = restTemplate.getForObject(pollResult.getWarehouseUserLink(), WarehouseUser.class); + final WarehouseUser newUser = restTemplate.getForObject(pollResult.getWarehouseUserUri(), WarehouseUser.class); setResult(newUser); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("User added to warehouse, but can't get it back, uri: " - + pollResult.getWarehouseUserLink(), e); + + pollResult.getWarehouseUserUri(), e); } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index de8e6c41e..6d9db65b8 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -27,15 +27,30 @@ private WarehouseTask(@JsonProperty("links") Map links) { this.links = links; } + @Deprecated String getPollLink() { + return getPollUri(); + } + + String getPollUri() { return links.get(POLL_LINK); } + @Deprecated String getWarehouseLink() { + return getWarehouseUri(); + } + + String getWarehouseUri() { return links.get(WAREHOUSE_LINK); } + @Deprecated String getWarehouseUserLink() { + return getWarehouseUserUri(); + } + + String getWarehouseUserUri() { return links.get(WAREHOUSE_USER_LINK); } } diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 24ea11b53..65a7b7a5e 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -21,6 +21,7 @@ public void testDeserialize() throws Exception { assertThat(account.getId(), is("ID")); assertThat(account.getUri(), is("/gdc/account/profile/ID")); assertThat(account.getProjectsLink(), is("/gdc/account/profile/ID/projects")); + assertThat(account.getProjectsUri(), is("/gdc/account/profile/ID/projects")); } @Test diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 54ff2e6f4..7132ff308 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -22,8 +22,10 @@ public void testDeserialization() throws Exception { assertThat(process.getType(), is("GROOVY")); assertThat(process.getExecutables(), hasSize(1)); assertThat(process.getId(), is("processId")); + assertThat(process.getUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId")); assertThat(process.getExecutionsLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions")); - + assertThat(process.getExecutionsUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions")); + assertThat(process.getSourceUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/source")); } @Test diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index d5d5f4659..13f5636a3 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -27,8 +27,9 @@ public void testDeserialization() throws Exception { assertThat(executionDetail.getError().getErrorCode(), is("executor.error")); assertThat(executionDetail.getError().getFormattedMessage(), is("Error message with some placeholders for parameters - like this one.")); - + assertThat(executionDetail.getUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail")); + assertThat(executionDetail.getLogUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/log")); + assertThat(executionDetail.getExecutionUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); } - } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index f846ccb13..3e36044e1 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -13,7 +13,8 @@ public void testDeserialize() throws Exception { final ProcessExecutionTask task = new ObjectMapper() .readValue(getClass().getResourceAsStream("/dataload/processes/executionTask.json"), ProcessExecutionTask.class); assertThat(task.getPollLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); + assertThat(task.getPollUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); assertThat(task.getDetailLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail")); - + assertThat(task.getDetailUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/DatasetTest.java b/src/test/java/com/gooddata/dataset/DatasetTest.java new file mode 100644 index 000000000..9763bff61 --- /dev/null +++ b/src/test/java/com/gooddata/dataset/DatasetTest.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataset; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collection; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; + +public class DatasetTest { + + @Test + public void deserialize() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/dataset.json"); + final Dataset dataset = new ObjectMapper().readValue(stream, Dataset.class); + assertThat(dataset, is(notNullValue())); + + assertThat(dataset.getIdentifier(), is("dataset.person")); + assertThat(dataset.getTitle(), is("Person")); + assertThat(dataset.getUri(), is("/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person")); + } +} diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index d1f829363..655c208d6 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -23,7 +23,7 @@ public void shouldReturnGdc() throws Exception { final Gdc gdc = gd.getGdcService().getGdc(); assertThat(gdc, is(notNullValue())); - assertThat(gdc.getUserStagingLink(), is("/uploads")); + assertThat(gdc.getUserStagingUri(), is("/uploads")); } @Test diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index ac1f3ac0e..7178f56df 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -18,17 +18,30 @@ public void deserialize() throws Exception { assertThat(gdc, is(notNullValue())); assertThat(gdc.getHomeLink(), is("/gdc/")); + assertThat(gdc.getHomeUri(), is("/gdc/")); assertThat(gdc.getTokenLink(), is("/gdc/account/token")); + assertThat(gdc.getTokenUri(), is("/gdc/account/token")); assertThat(gdc.getLoginLink(), is("/gdc/account/login")); + assertThat(gdc.getLoginUri(), is("/gdc/account/login")); assertThat(gdc.getMetadataLink(), is("/gdc/md")); + assertThat(gdc.getMetadataUri(), is("/gdc/md")); assertThat(gdc.getXTabLink(), is("/gdc/xtab2")); + assertThat(gdc.getXTabUri(), is("/gdc/xtab2")); assertThat(gdc.getAvailableElementsLink(), is("/gdc/availableelements")); + assertThat(gdc.getAvailableElementsUri(), is("/gdc/availableelements")); assertThat(gdc.getReportExporterLink(), is("/gdc/exporter")); + assertThat(gdc.getReportExporterUri(), is("/gdc/exporter")); assertThat(gdc.getAccountLink(), is("/gdc/account")); + assertThat(gdc.getAccountUri(), is("/gdc/account")); assertThat(gdc.getProjectsLink(), is("/gdc/projects")); + assertThat(gdc.getProjectsUri(), is("/gdc/projects")); assertThat(gdc.getToolLink(), is("/gdc/tool")); + assertThat(gdc.getToolUri(), is("/gdc/tool")); assertThat(gdc.getTemplatesLink(), is("/gdc/templates")); + assertThat(gdc.getTemplatesUri(), is("/gdc/templates")); assertThat(gdc.getReleaseInfoLink(), is("/gdc/releaseInfo")); + assertThat(gdc.getReleaseInfoUri(), is("/gdc/releaseInfo")); assertThat(gdc.getUserStagingLink(), is("/uploads")); + assertThat(gdc.getUserStagingUri(), is("/uploads")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index a2254328c..b831793b9 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -24,6 +24,7 @@ public void testDeserialization() throws Exception { assertThat(linkEntries.getEntries(), hasSize(1)); assertThat(linkEntries.getEntries().get(0), is(notNullValue())); assertThat(linkEntries.getEntries().get(0).getLink(), is("URI")); + assertThat(linkEntries.getEntries().get(0).getUri(), is("URI")); assertThat(linkEntries.getEntries().get(0).getCategory(), is("tasks-status")); } } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index f7a9ecfc7..eeaf26b6b 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -32,6 +32,7 @@ public void shouldDeserialize() throws Exception { assertThat(attrDF.getLdmExpression(), is(LDM_EXPRESSION)); assertThat(attrDF.getType(), is(TYPE)); assertThat(attrDF.getElementsLink(), is(ELEMENTS_LINK)); + assertThat(attrDF.getElementsUri(), is(ELEMENTS_LINK)); } @Test diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 5af17be3a..f83696990 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -56,6 +56,7 @@ public void shouldDeserialize() throws Exception { assertThat(attribute.hasDimension(), is(true)); assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); + assertThat(attribute.getDimensionUri(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); assertThat(attribute.getDirection(), is("asc")); assertThat(attribute.getSort(), is("pk")); @@ -64,6 +65,7 @@ public void shouldDeserialize() throws Exception { assertThat(attribute.isSortedByLinkedDf(), is(false)); assertThat(attribute.getType(), is("GDC.time.date")); assertThat(attribute.getLinkedDisplayFormLink(), is("/gdc/md/PROJECT_ID/obj/DF_LINK")); + assertThat(attribute.getLinkedDisplayFormUri(), is("/gdc/md/PROJECT_ID/obj/DF_LINK")); assertThat(attribute.getCompositeAttribute(), hasSize(0)); assertThat(attribute.getCompositeAttributePk(), hasSize(0)); assertThat(attribute.getFolders(), hasSize(0)); diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index cd9cd0ab4..4a685d245 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -45,8 +45,10 @@ public void shouldDeserialize() throws Exception { assertThat(attributes, hasSize(3)); assertThat(dataset.getDataUploadsLink(), is("/gdc/md/PROJECT_ID/data/uploads/688536")); + assertThat(dataset.getDataUploadsUri(), is("/gdc/md/PROJECT_ID/data/uploads/688536")); assertThat(dataset.hasUploadConfiguration(), is(false)); assertThat(dataset.getUploadConfigurationLink(), is(nullValue())); + assertThat(dataset.getUploadConfigurationUri(), is(nullValue())); } @Test diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index 371b9f2f9..aedae527f 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -32,6 +32,7 @@ public void shouldDeserialize() throws Exception { assertThat(displayForm.getLdmExpression(), is(LDM_EXPRESSION)); assertThat(displayForm.getType(), is(nullValue())); assertThat(displayForm.getElementsLink(), is(ELEMENTS_LINK)); + assertThat(displayForm.getElementsUri(), is(ELEMENTS_LINK)); } @Test diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 714db982a..792b462dc 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -19,7 +19,7 @@ public class EntryTest { - public static final String LINK = "/gdc/md/PROJECT_ID/obj/ENTRY_ID"; + public static final String URI = "/gdc/md/PROJECT_ID/obj/ENTRY_ID"; public static final String AUTHOR = "/gdc/account/profile/AUTHOR_USER_ID"; public static final String CONTRIBUTOR = "/gdc/account/profile/CONTRIBUTOR_USER_ID"; public static final DateTime CREATED = new DateTime(2014, 4, 11, 13, 45, 54, DateTimeZone.UTC); @@ -37,7 +37,8 @@ public class EntryTest { public void testDeserialize() throws Exception { final Entry entry = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/entry.json"), Entry.class); assertThat(entry, is(notNullValue())); - assertThat(entry.getLink(), is(LINK)); + assertThat(entry.getLink(), is(URI)); + assertThat(entry.getUri(), is(URI)); assertThat(entry.getTitle(), is(TITLE)); assertThat(entry.getSummary(), is(SUMMARY)); assertThat(entry.getCategory(), is(CATEGORY)); @@ -54,7 +55,7 @@ public void testDeserialize() throws Exception { @Test public void testSerialization() throws Exception { - final Entry entry = new Entry(LINK, TITLE, SUMMARY, CATEGORY, AUTHOR, CONTRIBUTOR, DEPRECATED, IDENTIFIER, TAGS, + final Entry entry = new Entry(URI, TITLE, SUMMARY, CATEGORY, AUTHOR, CONTRIBUTOR, DEPRECATED, IDENTIFIER, TAGS, CREATED, UPDATED, LOCKED, UNLISTED); assertThat(entry, serializesToJson("/md/entry.json")); diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 9c5ca8f6c..91af4ae77 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -128,7 +128,8 @@ public void retrieveScheduledMail() throws Exception { Collection result = md.find(project, ScheduledMail.class); assertThat(result, hasSize(1)); for (Entry e : result) { - ScheduledMail schedule = md.getObjByUri(e.getLink(), ScheduledMail.class); + ScheduledMail schedule = md.getObjByUri(e.getUri(), ScheduledMail.class); + assertThat(schedule.getTitle(), is("Scheduled Mail Title")); } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 15405d8ce..08af25241 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -236,7 +236,7 @@ public void testGetObjUriToFindOneObjByTitle() throws Exception { when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); when(resultEntry.getTitle()).thenReturn(title); - when(resultEntry.getLink()).thenReturn(uri); + when(resultEntry.getUri()).thenReturn(uri); final String result = service.getObjUri(project, Queryable.class, Restriction.title(title)); assertThat(result, is(uri)); @@ -274,7 +274,7 @@ public void testGetObjToFindOneObjById() throws Exception { when(restTemplate.getForObject(Query.URI, Query.class, project.getId(), "queryable")).thenReturn(queryResult); when(queryResult.getEntries()).thenReturn(asList(resultEntry)); when(resultEntry.getIdentifier()).thenReturn(id); - when(resultEntry.getLink()).thenReturn(uri); + when(resultEntry.getUri()).thenReturn(uri); when(restTemplate.getForObject(uri, Queryable.class)).thenReturn(intendedResult); final Queryable result = service.getObj(project, Queryable.class, Restriction.identifier(id)); @@ -333,8 +333,8 @@ public void testFindUrisBySummary() throws Exception { when(queryResult.getEntries()).thenReturn(asList(resultEntry1, resultEntry2)); when(resultEntry1.getSummary()).thenReturn(summary); when(resultEntry2.getSummary()).thenReturn(summary); - when(resultEntry1.getLink()).thenReturn(uri1); - when(resultEntry2.getLink()).thenReturn(uri2); + when(resultEntry1.getUri()).thenReturn(uri1); + when(resultEntry2.getUri()).thenReturn(uri2); final Collection results = service.findUris(project, Queryable.class, Restriction.summary(summary)); assertThat(results, allOf(hasItem(uri1), hasItem(uri2))); @@ -343,11 +343,11 @@ public void testFindUrisBySummary() throws Exception { @Test public void testGetAttributeElementsEmpty() throws Exception { final DisplayForm attrDisplayForm = mock(AttributeDisplayForm.class); - when(attrDisplayForm.getElementsLink()).thenReturn("elementsLink"); + when(attrDisplayForm.getElementsUri()).thenReturn("elementsUri"); final Attribute attr = mock(Attribute.class); when(attr.getDefaultDisplayForm()).thenReturn(attrDisplayForm); - when(restTemplate.getForObject("elementsLink", AttributeElements.class)) + when(restTemplate.getForObject("elementsUri", AttributeElements.class)) .thenReturn(new AttributeElements(Collections.emptyList())); final List elements = service.getAttributeElements(attr); assertThat(elements, hasSize(0)); @@ -356,14 +356,14 @@ public void testGetAttributeElementsEmpty() throws Exception { @Test public void testGetAttributeElements() throws Exception { final DisplayForm attrDisplayForm = mock(AttributeDisplayForm.class); - when(attrDisplayForm.getElementsLink()).thenReturn("elementsLink"); + when(attrDisplayForm.getElementsUri()).thenReturn("elementsUri"); final Attribute attr = mock(Attribute.class); when(attr.getDefaultDisplayForm()).thenReturn(attrDisplayForm); final AttributeElement result1 = mock(AttributeElement.class); final AttributeElement result2 = mock(AttributeElement.class); - when(restTemplate.getForObject("elementsLink", AttributeElements.class)) + when(restTemplate.getForObject("elementsUri", AttributeElements.class)) .thenReturn(new AttributeElements(asList(result1, result2))); final List elements = service.getAttributeElements(attr); assertThat(elements, allOf(hasItem(result1), hasItem(result2))); diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index bdbefb314..9276e2edb 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -51,5 +51,6 @@ public void testDeserialization() throws Exception { assertThat(attribute.hasDimension(), is(true)); assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); + assertThat(attribute.getDimensionUri(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 90072a0c6..ebf9ff985 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -26,6 +26,7 @@ public void testDeserialization() throws Exception { assertThat(def, is(notNullValue())); assertThat(def.getFormat(), is(FORMAT)); assertThat(def.getGrid(), is(notNullValue())); + assertThat(def.getExplainUri(), is("/gdc/md/PROJECT_ID/obj/2274/explain2")); } @Test diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index c4cfb07d0..b4d2fb3eb 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -21,5 +21,6 @@ public void testDeserialization() throws Exception { assertThat(maqlDdlLinks, is(notNullValue())); assertThat(maqlDdlLinks.getStatusLink(), is("/gdc/md/PROJECT_ID/tasks/123/status")); + assertThat(maqlDdlLinks.getStatusUri(), is("/gdc/md/PROJECT_ID/tasks/123/status")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 93912b4b2..a22664932 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,24 +1,14 @@ package com.gooddata.project; -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.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.*; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringStartsWith.startsWith; -import static org.hamcrest.MatcherAssert.assertThat; - -import com.gooddata.md.AbstractObj; -import com.gooddata.md.Meta; public class ProjectTest { @@ -44,22 +34,37 @@ public void testDeserialize() throws Exception { assertThat(project.getUpdated(), is(new DateTime(2014, 4, 11, 11, 43, 47, DateTimeZone.UTC))); assertThat(project.getLdmThumbnailLink(), is("/gdc/projects/PROJECT_ID/ldm?thumbnail=1")); + assertThat(project.getLdmThumbnailUri(), is("/gdc/projects/PROJECT_ID/ldm?thumbnail=1")); assertThat(project.getUri(), is("/gdc/projects/PROJECT_ID")); assertThat(project.getClearCachesLink(), is("/gdc/projects/PROJECT_ID/clearCaches")); + assertThat(project.getClearCachesUri(), is("/gdc/projects/PROJECT_ID/clearCaches")); assertThat(project.getInvitationsLink(), is("/gdc/projects/PROJECT_ID/invitations")); + assertThat(project.getInvitationsUri(), is("/gdc/projects/PROJECT_ID/invitations")); assertThat(project.getUsersLink(), is("/gdc/projects/PROJECT_ID/users?link=1")); + assertThat(project.getUsersUri(), is("/gdc/projects/PROJECT_ID/users?link=1")); assertThat(project.getGroupsLink(), is("/gdc/projects/PROJECT_ID/groups")); + assertThat(project.getGroupsUri(), is("/gdc/projects/PROJECT_ID/groups")); assertThat(project.getUploadsLink(), is("https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/")); + assertThat(project.getUploadsUri(), is("https://ea-di.staging.getgooddata.com/project-uploads/PROJECT_ID/")); assertThat(project.getLdmLink(), is("/gdc/projects/PROJECT_ID/ldm")); + assertThat(project.getLdmUri(), is("/gdc/projects/PROJECT_ID/ldm")); assertThat(project.getMetadataLink(), is("/gdc/md/PROJECT_ID")); + assertThat(project.getMetadataUri(), is("/gdc/md/PROJECT_ID")); assertThat(project.getPublicArtifactsLink(), is("/gdc/projects/PROJECT_ID/publicartifacts")); + assertThat(project.getPublicArtifactsUri(), is("/gdc/projects/PROJECT_ID/publicartifacts")); assertThat(project.getRolesLink(), is("/gdc/projects/PROJECT_ID/roles")); + assertThat(project.getRolesUri(), is("/gdc/projects/PROJECT_ID/roles")); assertThat(project.getDataLoadLink(), is("/gdc/projects/PROJECT_ID/dataload")); + assertThat(project.getDataLoadUri(), is("/gdc/projects/PROJECT_ID/dataload")); assertThat(project.getConnectorsLink(), is("/gdc/projects/PROJECT_ID/connectors")); + assertThat(project.getConnectorsUri(), is("/gdc/projects/PROJECT_ID/connectors")); assertThat(project.getExecuteLink(), is("/gdc/projects/PROJECT_ID/execute")); + assertThat(project.getExecuteUri(), is("/gdc/projects/PROJECT_ID/execute")); assertThat(project.getSchedulesLink(), is("/gdc/projects/PROJECT_ID/schedules")); + assertThat(project.getSchedulesUri(), is("/gdc/projects/PROJECT_ID/schedules")); assertThat(project.getTemplatesLink(), is("/gdc/md/PROJECT_ID/templates")); assertThat(project.getEventStoresLink(), is("/gdc/projects/PROJECT_ID/dataload/eventstore/stores")); + assertThat(project.getEventStoresUri(), is("/gdc/projects/PROJECT_ID/dataload/eventstore/stores")); } @Test diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index e7ef9e1d7..47757d553 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -57,7 +57,7 @@ public void shouldCreateWarehouse() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(202) .thenRespond() @@ -65,7 +65,7 @@ public void shouldCreateWarehouse() throws Exception { .withStatus(201); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseLink()) + .havingPathEqualTo(finishedTask.getWarehouseUri()) .respond() .withBody(readFromResource(WAREHOUSE)) .withStatus(200); @@ -86,7 +86,7 @@ public void shouldFailToCreateWarehouse() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(400) ; @@ -205,7 +205,7 @@ public void shouldAddUserToWarehouse() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(202) .thenRespond() @@ -213,7 +213,7 @@ public void shouldAddUserToWarehouse() throws Exception { .withStatus(201); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(finishedTask.getWarehouseUserLink()) + .havingPathEqualTo(finishedTask.getWarehouseUserUri()) .respond() .withBody(readFromResource(WAREHOUSE_USER)) .withStatus(200); @@ -236,7 +236,7 @@ public void shouldFailToAddUserToWarehouse() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(409); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 893e4e90f..6c1a40d10 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -14,12 +14,14 @@ public class WarehouseTaskTest { public void testDeserializePoll() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-poll.json"); assertThat(warehouseTask.getPollLink(), is("/gdc/datawarehouse/executions/executionId")); + assertThat(warehouseTask.getPollUri(), is("/gdc/datawarehouse/executions/executionId")); } @Test public void testDeserializeInstance() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-finished.json"); assertThat(warehouseTask.getWarehouseLink(), is("/gdc/datawarehouse/instances/instanceId")); + assertThat(warehouseTask.getWarehouseUri(), is("/gdc/datawarehouse/instances/instanceId")); } private WarehouseTask deserialize(String path) throws Exception { diff --git a/src/test/resources/dataset/dataset.json b/src/test/resources/dataset/dataset.json new file mode 100644 index 000000000..f7eabfe2d --- /dev/null +++ b/src/test/resources/dataset/dataset.json @@ -0,0 +1,7 @@ +{ + "link": "/gdc/md/PROJECT_ID/ldm/singleloadinterface/dataset.person", + "identifier": "dataset.person", + "summary": "dataset single data loading interface specifications", + "category": "dataset-singleloadinterface", + "title": "Person" +} \ No newline at end of file From 0bc8891000541df4e7098def64a8293cac777469 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 1 Aug 2016 13:23:45 +0200 Subject: [PATCH 0381/1191] fix: ignore links field on metrics This field is added in R119, and because of Metric object doesn't ignore unknown fileds, the deserialization fails. Close: #339 --- src/main/java/com/gooddata/md/Metric.java | 2 + src/test/java/com/gooddata/md/MetricTest.java | 7 +++ src/test/resources/md/metric-links.json | 61 +++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 src/test/resources/md/metric-links.json diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index e0a25522d..4c5679ec0 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -5,6 +5,7 @@ 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; @@ -18,6 +19,7 @@ @JsonTypeName("metric") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties("links") public class Metric extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index e3581d744..271b82f56 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -57,4 +57,11 @@ public void fullJsonShouldStayTheSameAfterDeserializationAndSerializationBack() assertThat(metric, jsonNodeAbsent("metric.content.tree.content[0].content[0].content[0].content")); assertThat(metric, serializesToJson("/md/metric-out.json")); } + + @Test + public void shouldIgnoreLinksProperty() throws Exception { + final Metric metric = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/metric-links.json"), Metric.class); + assertThat(metric, serializesToJson("/md/metric-out.json")); + } } \ No newline at end of file diff --git a/src/test/resources/md/metric-links.json b/src/test/resources/md/metric-links.json new file mode 100644 index 000000000..3982b5661 --- /dev/null +++ b/src/test/resources/md/metric-links.json @@ -0,0 +1,61 @@ +{ + "metric": { + "content": { + "format": "#,##0", + "tree": { + "content": [ + { + "content": [ + { + "value": "AVG", + "content": [ + { + "value": "/gdc/md/PROJECT_ID/obj/EXPR_ID", + "position": { + "column": 12, + "line": 2 + }, + "type": "fact object" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "function" + } + ], + "position": { + "column": 8, + "line": 2 + }, + "type": "expression" + } + ], + "position": { + "column": 1, + "line": 2 + }, + "type": "metric" + }, + "expression": "SELECT AVG([/gdc/md/PROJECT_ID/obj/EXPR_ID])" + }, + "links": { + "explain2": "/gdc/md/cpn1dbltx3at2wrmfl79inlxs76oxb7h/obj/47/explain2" + }, + "meta": { + "author": "/gdc/account/profile/PROFILE_ID", + "uri": "/gdc/md/PROJECT_ID/obj/47", + "tags": "", + "created": "2015-10-10 12:56:13", + "identifier": "MY_ID", + "deprecated": "0", + "summary": "", + "isProduction": 1, + "title": "Avg shoe size", + "category": "metric", + "updated": "2015-10-10 12:56:13", + "contributor": "/gdc/account/profile/PROFILE_ID" + } + } +} \ No newline at end of file From 6210b88edcf96fb6b5029bddaed982b9f2c348bb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 1 Aug 2016 15:18:53 +0200 Subject: [PATCH 0382/1191] [maven-release-plugin] prepare release gooddata-java-1.5.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c291e6226..627dbe120 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.2-SNAPSHOT + 1.5.2 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From b6bbecfbc0dd683da6caa4f7700613b7143fc3b5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 1 Aug 2016 15:18:54 +0200 Subject: [PATCH 0383/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 627dbe120..c7195e6df 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.2 + 1.5.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From f15161c3c4d2155871f00b87a2cd3f476ae03bf5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 1 Aug 2016 15:30:57 +0200 Subject: [PATCH 0384/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f1f35e0ca..44a10e834 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.5.1 + 1.5.2 ``` From ffe09f61f028baf01ca839039e8d90fafa82243a Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Tue, 2 Aug 2016 13:55:44 +0200 Subject: [PATCH 0385/1191] Refactor ProjectValidationResult*ElParam classes Removed useless field 'vals' from ProjectValidationResultGdcTimeElParam Removed ProjectValidationResultElParam Add asMap method generating collection of tuples in ProjectValidationResultSliElParam --- .../ProjectValidationResultElParam.java | 37 --------- ...ProjectValidationResultGdcTimeElParam.java | 47 +++++++---- .../ProjectValidationResultSliElParam.java | 77 ++++++++++++++++++- .../ProjectValidationResultParamTest.java | 2 +- ...ProjectValidationResultSliElParamTest.java | 45 +++++++++++ .../project-validationResultParam.json | 3 +- 6 files changed, 156 insertions(+), 55 deletions(-) delete mode 100644 src/main/java/com/gooddata/project/ProjectValidationResultElParam.java create mode 100644 src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java deleted file mode 100644 index e37e1540d..000000000 --- a/src/main/java/com/gooddata/project/ProjectValidationResultElParam.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. - */ -package com.gooddata.project; - -import java.util.List; - -abstract class ProjectValidationResultElParam extends ProjectValidationResultParam { - - private final List ids; - private final List vals; - - protected ProjectValidationResultElParam(final List ids, final List vals) { - this.ids = ids; - this.vals = vals; - } - - public List getIds() { - return ids; - } - - public List getVals() { - return vals; - } - - @Override - public int hashCode() { - int result = ids != null ? ids.hashCode() : 0; - result = 31 * result + (vals != null ? vals.hashCode() : 0); - return result; - } - - @Override - public String toString() { - return ids + " " + vals; - } -} diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index 383583e13..b39350e0f 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -6,31 +6,52 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.List; +import java.util.Objects; @JsonTypeName("gdctime_el") @JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectValidationResultGdcTimeElParam extends ProjectValidationResultElParam { +public class ProjectValidationResultGdcTimeElParam extends ProjectValidationResultParam { - ProjectValidationResultGdcTimeElParam(final List ids, final List vals) { - super(ids, vals); + private final List ids; + + ProjectValidationResultGdcTimeElParam(final List ids) { + this.ids = ids; } @JsonCreator - private static ProjectValidationResultGdcTimeElParam create(@JsonProperty("ids") List ids, @JsonProperty("vals") List vals) { - return new ProjectValidationResultGdcTimeElParam(ids, vals); + private static ProjectValidationResultGdcTimeElParam create(@JsonProperty("ids") List ids) { + return new ProjectValidationResultGdcTimeElParam(ids); } - @Override - public boolean equals(final Object o) { - if (this == o) return true; - if (!(o instanceof ProjectValidationResultGdcTimeElParam)) return false; + public List getIds() { + return ids; + } - ProjectValidationResultGdcTimeElParam that = (ProjectValidationResultGdcTimeElParam) o; + /** + * @deprecated for backward compatibility only. Do not use this method, it always returns null. + */ + @Deprecated + public List getVals() { + return null; + } - if (getIds() != null ? !getIds().equals(that.getIds()) : that.getIds() != null) return false; - if (getVals() != null ? !getVals().equals(that.getVals()) : that.getVals() != null) return false; + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (!(o instanceof ProjectValidationResultGdcTimeElParam)) + return false; + ProjectValidationResultGdcTimeElParam that = (ProjectValidationResultGdcTimeElParam) o; + return Objects.equals(ids, that.ids); + } - return true; + @Override + public int hashCode() { + return Objects.hash(ids); } + @Override + public String toString() { + return ids.toString(); + } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index b3708eadf..1f9263832 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -1,18 +1,26 @@ package com.gooddata.project; +import static java.lang.String.format; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; +import java.util.HashMap; import java.util.List; +import java.util.Map; @JsonTypeName("sli_el") @JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectValidationResultSliElParam extends ProjectValidationResultElParam { +public class ProjectValidationResultSliElParam extends ProjectValidationResultParam { + + private final List ids; + private final List vals; ProjectValidationResultSliElParam(final List ids, final List vals) { - super(ids, vals); + this.ids = ids; + this.vals = vals; } @JsonCreator @@ -20,6 +28,60 @@ private static ProjectValidationResultSliElParam create(@JsonProperty("ids") Lis return new ProjectValidationResultSliElParam(ids, vals); } + /** + * Returns list of IDs. IDs are primary property of this param. + */ + public List getIds() { + return ids; + } + + /** + * Returns list of values. Values have only informative character and are connected to IDs. + * + * @see #getIds() + */ + public List getVals() { + return vals; + } + + /** + * Returns map of tuples {@code }. Tuples are constructed from lists of IDs and values + * according these assumptions: + *
    + *
  • Sizes of both lists are equal.
  • + *
  • ID and it's corresponding value are on the same index.
  • + *
+ * + * @see #getIds() + * @see #getVals() + * + * @return {@code null} when ids are {@code null} or map of tuples + * @throws IllegalStateException
    + *
  • when ids are not {@code null} and vals are {@code null}
  • + *
  • when sizes of ids and vals lists are not equal
  • + *
+ */ + public Map asMap() { + if (ids == null) { + return null; + } + + if (vals == null) { + throw new IllegalStateException("Values not defined for IDs."); + } + + if (ids.size() != vals.size()) { + throw new IllegalStateException(format("Size of list of IDs (%s) and corresponding list of their values (%s)" + + " is not equal.", ids.size(), vals.size())); + } + + final HashMap sliElParamMap = new HashMap<>(ids.size()); + for (int index = 0; index < ids.size(); index++) { + sliElParamMap.put(ids.get(index), vals.get(index)); + } + return sliElParamMap; + } + @Override public boolean equals(final Object o) { if (this == o) return true; @@ -33,4 +95,15 @@ public boolean equals(final Object o) { return true; } + @Override + public int hashCode() { + int result = ids != null ? ids.hashCode() : 0; + result = 31 * result + (vals != null ? vals.hashCode() : 0); + return result; + } + + @Override + public String toString() { + return ids + " " + vals; + } } diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java index 60846d42e..4a3ece4cc 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -22,6 +22,6 @@ public void testDeser() throws Exception { assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultStringParam("report")))); assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultObjectParam("Historical backlog", "/gdc/md/d45dlwq6fixqsgbukrlnir1qsw8y44q6/obj/41886")))); assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultSliElParam(asList("4761"), asList("Deleted"))))); - assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultGdcTimeElParam(asList("4762"), asList("Deleted"))))); + assertThat(result, hasItem(sameBeanAs(new ProjectValidationResultGdcTimeElParam(asList("4762"))))); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java new file mode 100644 index 000000000..8077d46e6 --- /dev/null +++ b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java @@ -0,0 +1,45 @@ +package com.gooddata.project; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.nullValue; + +import org.testng.annotations.Test; + +import java.util.HashMap; +import java.util.Map; + +public class ProjectValidationResultSliElParamTest { + + @Test + public void testAsMapNullIds() throws Exception { + final ProjectValidationResultSliElParam param = new ProjectValidationResultSliElParam(null, singletonList("2")); + + assertThat(param.asMap(), nullValue()); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testAsMapNullVals() throws Exception { + new ProjectValidationResultSliElParam(singletonList("2"), null).asMap(); + } + + @Test(expectedExceptions = IllegalStateException.class) + public void testAsMapNotEqualIdsVals() throws Exception { + new ProjectValidationResultSliElParam(asList("2", "1"), singletonList("1234")).asMap(); + } + + @Test + public void testAsMap() throws Exception { + final ProjectValidationResultSliElParam param = + new ProjectValidationResultSliElParam(asList("1", "3", "2"), asList("1234", "9012", "5678")); + + final Map expectedMap = new HashMap<>(3); + expectedMap.put("1", "1234"); + expectedMap.put("2", "5678"); + expectedMap.put("3", "9012"); + + assertThat(param.asMap(), is(expectedMap)); + } +} \ No newline at end of file diff --git a/src/test/resources/project/project-validationResultParam.json b/src/test/resources/project/project-validationResultParam.json index 08d800fcb..30d109a79 100644 --- a/src/test/resources/project/project-validationResultParam.json +++ b/src/test/resources/project/project-validationResultParam.json @@ -17,8 +17,7 @@ }, { "gdctime_el": { - "ids": ["4762"], - "vals": ["Deleted"] + "ids": ["4762"] } } ] From c4e45f7097810fdd79971043383405bb86225cc7 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Thu, 4 Aug 2016 09:39:46 +0200 Subject: [PATCH 0386/1191] ProjectValidationResultSliElParam#asMap returns LinkedHashMap to preserve ordering --- .../gooddata/project/ProjectValidationResultSliElParam.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index 1f9263832..626c278c9 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -7,7 +7,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -75,7 +75,7 @@ public Map asMap() { + " is not equal.", ids.size(), vals.size())); } - final HashMap sliElParamMap = new HashMap<>(ids.size()); + final Map sliElParamMap = new LinkedHashMap<>(ids.size()); for (int index = 0; index < ids.size(); index++) { sliElParamMap.put(ids.get(index), vals.get(index)); } From c0aad67feab9e419b1ae382b7064e4c3b22ad9cd Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 4 Aug 2016 10:10:10 +0200 Subject: [PATCH 0387/1191] [maven-release-plugin] prepare release gooddata-java-1.6.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c7195e6df..9a420e30f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.5.3-SNAPSHOT + 1.6.0 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From ed4c81e2db15062c516c30d80c4aad61ae69bd46 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 4 Aug 2016 10:10:11 +0200 Subject: [PATCH 0388/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9a420e30f..e2abcdb19 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.6.0 + 1.6.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 222919835451635b401b77a2ae91b4846803464a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 4 Aug 2016 10:21:29 +0200 Subject: [PATCH 0389/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 44a10e834..50cde79a8 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.5.2 + 1.6.0 ``` From c44d2d82141823673c34a2b8b73ac37cc55efbe3 Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Tue, 16 Aug 2016 15:13:41 +0200 Subject: [PATCH 0390/1191] fix formatting --- src/test/java/com/gooddata/AbstractGoodDataAT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 23b74f270..47200d329 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -25,7 +25,7 @@ public abstract class AbstractGoodDataAT { "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); protected static final GoodData gd = - new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")){ + new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")) { /** * had to be overriden to access connectionManager, to test how many connections were not closed */ From 7e40bcb29fc9599c06368d6d220881fce54bdc90 Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Tue, 16 Aug 2016 15:13:56 +0200 Subject: [PATCH 0391/1191] add support for creating and removing user accounts --- pom.xml | 1 + .../java/com/gooddata/account/Account.java | 59 +++++- .../account/AccountNotFoundException.java | 21 ++ .../com/gooddata/account/AccountService.java | 76 ++++++- .../gooddata/account/AccountServiceAT.java | 48 ++++- .../gooddata/account/AccountServiceIT.java | 191 ++++++++++++++++++ .../com/gooddata/account/AccountTest.java | 18 +- .../account/create-account-response.json | 3 + .../resources/account/create-account.json | 10 + 9 files changed, 407 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/gooddata/account/AccountNotFoundException.java create mode 100644 src/test/java/com/gooddata/account/AccountServiceIT.java create mode 100644 src/test/resources/account/create-account-response.json create mode 100644 src/test/resources/account/create-account.json diff --git a/pom.xml b/pom.xml index e2abcdb19..8cb01ce07 100644 --- a/pom.xml +++ b/pom.xml @@ -186,6 +186,7 @@ + isolated_domain **/*AT.java diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 904131dd5..3a51524c5 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -22,33 +22,68 @@ public class Account { public static final String URI = "/gdc/account/profile/{id}"; + public static final String ACCOUNTS_URI = "/gdc/account/domains/{organization_name}/users"; public static final UriTemplate TEMPLATE = new UriTemplate(URI); + public static final UriTemplate ACCOUNTS_TEMPLATE = new UriTemplate(ACCOUNTS_URI); public static final String LOGIN_URI = "/gdc/account/login/{id}"; public static final UriTemplate LOGIN_TEMPLATE = new UriTemplate(LOGIN_URI); public static final String CURRENT_ID = "current"; - + private final String login; + private final String email; + private final String password; + private final String verifyPassword; private final String firstName; private final String lastName; @JsonIgnore private final Links links; @JsonCreator - public Account(@JsonProperty("firstName") String firstName, - @JsonProperty("lastName") String lastName, - @JsonProperty("links") Links links) { + private Account( + @JsonProperty("login") String login, + @JsonProperty("email") String email, + @JsonProperty("password") String password, + @JsonProperty("verifyPassword") String verifyPassword, + @JsonProperty("firstName") String firstName, + @JsonProperty("lastName") String lastName, + @JsonProperty("links") Links links + ) { + this.login = login; + this.email = email; + this.password = password; + this.verifyPassword = verifyPassword; this.firstName = firstName; this.lastName = lastName; this.links = links; } - /* Just for serialization test */ - Account(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - links = null; + public Account(String firstName,String lastName, Links links) { + this(null, null, null, null, firstName, lastName, links); + } + + /** + * Account creation constructor + */ + public Account(String email, String password, String firstName, String lastName) { + this(email, email, password, password, firstName, lastName, null); + } + + public String getLogin() { + return login; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } + + public String getVerifyPassword() { + return verifyPassword; } public String getFirstName() { @@ -71,7 +106,7 @@ public String getProjectsLink() { @JsonIgnore public String getId() { - return TEMPLATE.match(getUri()).get("id"); + return getId(getUri()); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -93,4 +128,8 @@ public String getProjects() { return projects; } } + + static String getId(String uri) { + return TEMPLATE.match(uri).get("id"); + } } diff --git a/src/main/java/com/gooddata/account/AccountNotFoundException.java b/src/main/java/com/gooddata/account/AccountNotFoundException.java new file mode 100644 index 000000000..9567d8cb3 --- /dev/null +++ b/src/main/java/com/gooddata/account/AccountNotFoundException.java @@ -0,0 +1,21 @@ +package com.gooddata.account; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; + +/** + * Account doesn't exist. + */ +public class AccountNotFoundException extends GoodDataException { + + private final String accountUri; + + public AccountNotFoundException(String uri, GoodDataRestException cause) { + super("Account " + uri + " was not found", cause); + this.accountUri = uri; + } + + public String getAccountUri() { + return accountUri; + } +} diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index 5e9e727da..f3d978e6b 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -5,9 +5,15 @@ import com.gooddata.AbstractService; import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.gdc.UriResponse; +import org.springframework.http.HttpStatus; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + /** * Service to access and manipulate account. */ @@ -29,11 +35,7 @@ public AccountService(RestTemplate restTemplate) { * @throws com.gooddata.GoodDataException when current account can't be accessed. */ public Account getCurrent() { - try { - return restTemplate.getForObject(Account.URI, Account.class, Account.CURRENT_ID); - } catch (GoodDataException | RestClientException e) { - throw new GoodDataException("Unable to get current account", e); - } + return getAccount(Account.CURRENT_ID); } /** @@ -49,4 +51,68 @@ public void logout() { throw new GoodDataException("Unable to logout", e); } } + + /** + * Creates new account in given organization (domain). + * Only domain admin is allowed create new accounts! This means rest request has to authorized as domain admin. + * @param account to create + * @param organizationName (domain) in which account should be created + * @return new account + * @throws GoodDataException when account can't be created + */ + public Account createAccount(Account account, String organizationName) { + notNull(account, "account"); + notEmpty(organizationName, "organizationName"); + + try { + final UriResponse uriResponse = restTemplate.postForObject(Account.ACCOUNTS_URI, account, UriResponse.class, organizationName); + return getAccount(Account.getId(uriResponse.getUri())); + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to create account", e); + } + } + + /** + * Delete given account + * @param account to remove + * @throws AccountNotFoundException when given account wasn't found + * @throws GoodDataException when account can't be removed for other reason + */ + public void removeAccount(Account account) { + notNull(account, "account"); + + try { + restTemplate.delete(account.getUri()); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new AccountNotFoundException(account.getUri(), e); + } else { + throw e; + } + } catch (GoodDataException e) { + throw new GoodDataException("Unable to remove account", e); + } + } + + /** + * Get account for given account id + * @param id to search for + * @return account for id + * @throws AccountNotFoundException when account for given id can't be found + * @throws GoodDataException + */ + public Account getAccount(String id) { + try { + return restTemplate.getForObject(Account.URI, Account.class, id); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new AccountNotFoundException(Account.TEMPLATE.expand(id).toString(), e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get account", e); + } + } + } diff --git a/src/test/java/com/gooddata/account/AccountServiceAT.java b/src/test/java/com/gooddata/account/AccountServiceAT.java index ac393316b..b66b55e2d 100644 --- a/src/test/java/com/gooddata/account/AccountServiceAT.java +++ b/src/test/java/com/gooddata/account/AccountServiceAT.java @@ -1,9 +1,13 @@ package com.gooddata.account; import com.gooddata.AbstractGoodDataAT; +import org.testng.annotations.AfterClass; import org.testng.annotations.Test; +import java.util.UUID; + import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -13,11 +17,53 @@ @Test(groups = "account") public class AccountServiceAT extends AbstractGoodDataAT { + private static final String LOGIN = "john.smith." + UUID.randomUUID() + "@gooddata.com"; + + private final AccountService accountService = gd.getAccountService(); + + private Account account; + @Test public void login() throws Exception { - final AccountService accountService = gd.getAccountService(); final Account current = accountService.getCurrent(); assertThat(current.getId(), is(notNullValue())); } + @Test(groups = "isolated_domain") + public void createAccount() { + final Account newAccount = new Account(LOGIN, "w4yYxSQpAbaODA64", "FistName", "LastName"); + + account = accountService.createAccount(newAccount, getProperty("domain")); + + assertThat(account, is(notNullValue())); + assertThat(account.getId(), is(notNullValue())); + assertThat(account.getLogin(), is(LOGIN)); + } + + @Test(groups = "isolated_domain", dependsOnMethods = "createAccount") + public void getAccount() { + final Account foundAccount = accountService.getAccount(this.account.getId()); + + assertThat(foundAccount, is(notNullValue())); + assertThat(foundAccount.getId(), is(notNullValue())); + assertThat(foundAccount.getId(), is(account.getId())); + assertThat(foundAccount.getLogin(), is(LOGIN)); + assertThat(foundAccount.getLogin(), is(account.getLogin())); + } + + @Test(groups = "isolated_domain", dependsOnMethods = "getAccount") + public void removeAccount() { + accountService.removeAccount(account); + account = null; + } + + @AfterClass + public void tearDown() { + if (account != null) { + try { + accountService.removeAccount(account); + } catch (Exception ignored) {} + } + } + } diff --git a/src/test/java/com/gooddata/account/AccountServiceIT.java b/src/test/java/com/gooddata/account/AccountServiceIT.java new file mode 100644 index 000000000..d01def336 --- /dev/null +++ b/src/test/java/com/gooddata/account/AccountServiceIT.java @@ -0,0 +1,191 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.account; + +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.GoodDataException; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.IOException; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static net.jadler.Jadler.onRequest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.Is.is; + +public class AccountServiceIT extends AbstractGoodDataIT { + + private static final String CREATE_ACCOUNT = "/account/create-account.json"; + private static final String ACCOUNT = "/account/account.json"; + private static final String ACCOUNT_ID = "ID"; + private static final String ACCOUNT_URI = Account.TEMPLATE.expand(ACCOUNT_ID).toString(); + private static final String CURRENT_ACCOUNT_URI = Account.TEMPLATE.expand(Account.CURRENT_ID).toString(); + private static final String LOGOUT_CURRENT = Account.LOGIN_TEMPLATE.expand(ACCOUNT_ID).toString(); + private static final String DOMAIN = "default"; + + private static Account account; + private static Account createAccount; + + @BeforeClass + public void init() throws IOException { + account = MAPPER.readValue(readFromResource(ACCOUNT), Account.class); + createAccount = MAPPER.readValue(readFromResource(CREATE_ACCOUNT), Account.class); + } + + @Test + public void shouldCreateAccount() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Account.ACCOUNTS_TEMPLATE.expand(DOMAIN).toString()) + .respond() + .withBody("{\"uri\": \"" + ACCOUNT_URI + "\"}") + .withStatus(201); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(ACCOUNT_URI) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(200); + + final Account created = gd.getAccountService().createAccount(createAccount, DOMAIN); + + assertThat(created, notNullValue()); + assertThat(created.getFirstName(), is("Blah")); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailToCreateAccount() { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(Account.ACCOUNTS_TEMPLATE.expand(DOMAIN).toString()) + .respond() + .withBody("") + .withStatus(400); + + gd.getAccountService().createAccount(createAccount, DOMAIN); + } + + @Test + public void shouldRemoveAccount() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(ACCOUNT_URI) + .respond() + .withStatus(204); + + gd.getAccountService().removeAccount(account); + } + + @Test(expectedExceptions = AccountNotFoundException.class) + public void shouldFailToFindAccountForRemoval() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(ACCOUNT_URI) + .respond() + .withStatus(404); + + gd.getAccountService().removeAccount(account); + } + + @Test + public void shouldGetCurrentAccount() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(CURRENT_ACCOUNT_URI) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(200); + + final Account current = gd.getAccountService().getCurrent(); + + assertThat(current, notNullValue()); + assertThat(current.getFirstName(), is("Blah")); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailToGetCurrentAccount() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(CURRENT_ACCOUNT_URI) + .respond() + .withStatus(400); + + gd.getAccountService().getCurrent(); + } + + @Test(expectedExceptions = AccountNotFoundException.class) + public void shouldFailToFindCurrentAccount() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(CURRENT_ACCOUNT_URI) + .respond() + .withStatus(404); + + gd.getAccountService().getCurrent(); + } + + @Test + public void shouldLogout() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(CURRENT_ACCOUNT_URI) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(200); + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(LOGOUT_CURRENT) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(204); + + gd.getAccountService().logout(); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailToLogout() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(CURRENT_ACCOUNT_URI) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(200); + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(LOGOUT_CURRENT) + .respond() + .withStatus(400); + + gd.getAccountService().logout(); + } + + @Test + public void shouldGetAccount() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(ACCOUNT_URI) + .respond() + .withBody(readFromResource(ACCOUNT)) + .withStatus(200); + + final Account created = gd.getAccountService().getAccount(ACCOUNT_ID); + + assertThat(created, notNullValue()); + assertThat(created.getFirstName(), is("Blah")); + } + + @Test(expectedExceptions = AccountNotFoundException.class) + public void shouldFailToFindAccount() { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(ACCOUNT_URI) + .respond() + .withStatus(404); + + gd.getAccountService().getAccount(ACCOUNT_ID); + } + +} diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 24ea11b53..c58a83f95 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -10,14 +10,18 @@ public class AccountTest { + private static final String MAIL = "fake@gooddata.com"; + private static final String FIRST_NAME = "Blah"; + private static final String LAST_NAME = "Muhehe"; + @Test public void testDeserialize() throws Exception { final Account account = new ObjectMapper() .readValue(getClass().getResourceAsStream("/account/account.json"), Account.class); assertThat(account, is(notNullValue())); - assertThat(account.getFirstName(), is("Blah")); - assertThat(account.getLastName(), is("Muhehe")); + assertThat(account.getFirstName(), is(FIRST_NAME)); + assertThat(account.getLastName(), is(LAST_NAME)); assertThat(account.getId(), is("ID")); assertThat(account.getUri(), is("/gdc/account/profile/ID")); assertThat(account.getProjectsLink(), is("/gdc/account/profile/ID/projects")); @@ -25,8 +29,14 @@ public void testDeserialize() throws Exception { @Test public void testSerialization() { - final Account account = new Account("Blah", "Muhehe"); + final Account account = new Account(FIRST_NAME, LAST_NAME, null); assertThat(account, serializesToJson("/account/account-input.json")); } -} \ No newline at end of file + @Test + public void testSerializationOfCreateAccount() { + final Account account = new Account(MAIL, "password", FIRST_NAME, LAST_NAME); + assertThat(account, serializesToJson("/account/create-account.json")); + } + +} diff --git a/src/test/resources/account/create-account-response.json b/src/test/resources/account/create-account-response.json new file mode 100644 index 000000000..aa39b07f8 --- /dev/null +++ b/src/test/resources/account/create-account-response.json @@ -0,0 +1,3 @@ +{ + "uri": "/gdc/account/profile/ID" +} diff --git a/src/test/resources/account/create-account.json b/src/test/resources/account/create-account.json new file mode 100644 index 000000000..090d518ad --- /dev/null +++ b/src/test/resources/account/create-account.json @@ -0,0 +1,10 @@ +{ + "accountSetting" : { + "login": "fake@gooddata.com", + "email": "fake@gooddata.com", + "password": "password", + "verifyPassword": "password", + "firstName" : "Blah", + "lastName" : "Muhehe" + } +} From ffea6b8605b7e4e3e04f6928983cb823bade5d0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Wed, 17 Aug 2016 11:39:28 +0200 Subject: [PATCH 0392/1191] Allow deploying processes from appstore --- .../dataload/processes/AsyncTask.java | 56 ++++++++++++++ .../dataload/processes/DataloadProcess.java | 13 +++- .../dataload/processes/ProcessService.java | 73 ++++++++++++++++++- .../dataload/processes/ProcessServiceAT.java | 23 +++++- .../dataload/processes/ProcessServiceIT.java | 64 +++++++++++++++- .../processes/ProcessServiceTest.java | 2 +- .../dataload/processes/appstoreProcess.json | 16 ++++ .../dataload/processes/asyncTask.json | 7 ++ 8 files changed, 244 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gooddata/dataload/processes/AsyncTask.java create mode 100644 src/test/resources/dataload/processes/appstoreProcess.json create mode 100644 src/test/resources/dataload/processes/asyncTask.json diff --git a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java new file mode 100644 index 000000000..a7be6a876 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ +package com.gooddata.dataload.processes; + +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; + +/** + * Asynchronous task containing link for polling. + * This task differs from {@link com.gooddata.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 { + + @JsonProperty + private Links links; + + @JsonCreator + private AsyncTask(@JsonProperty("links") Links links) { + this.links = links; + } + + public AsyncTask(final String uri) { + this.links = new Links(uri); + } + + @JsonIgnore + public String getUri() { + return links.getPoll(); + } + + private static class Links { + + private final String poll; + + @JsonCreator + private Links(@JsonProperty("poll") String poll) { + this.poll = poll; + } + + public String getPoll() { + return poll; + } + } + +} diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index ae0a7030b..7d83e1903 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -43,9 +43,16 @@ public DataloadProcess(String name, String type) { this.type = notEmpty(type, "type"); } - DataloadProcess(String name, String type, String path) { + /** + * Use this constructor, when you want to deploy process from appstore. + * + * @param name + * @param type + * @param appstorePath valid path to brick in appstore + */ + public DataloadProcess(String name, String type, String appstorePath) { this(name, type); - this.path = path; + this.path = appstorePath; } public DataloadProcess(String name, ProcessType type) { @@ -81,7 +88,7 @@ public String getPath() { return path; } - void setPath(String path) { + public void setPath(String path) { this.path = path; } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 9fbccf5b3..eb9bc78cb 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -6,6 +6,7 @@ import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; +import com.gooddata.SimplePollHandler; import com.gooddata.account.AccountService; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; @@ -38,6 +39,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Collections.emptyList; +import static org.apache.commons.lang.Validate.isTrue; /** * Service to manage dataload processes and process executions. @@ -65,6 +67,7 @@ public ProcessService(RestTemplate restTemplate, AccountService accountService, /** * Create new process with given data by given project. + * Process must have null path to prevent clashes with deploying from appstore. * * @param project project to which the process belongs * @param process to create @@ -75,13 +78,14 @@ public DataloadProcess createProcess(Project project, DataloadProcess process, F notNull(process, "process"); notNull(processData, "processData"); notNull(project, "project"); - + isTrue(process.getPath() == null, "Process path has to be null, use processData argument. If you want to create process from appstore, use method createProcessFromAppstore()"); return postProcess(process, processData, getProcessesUri(project)); } /** * Create new process without data. * Only some specific types of processes can be created without data. + * Process must have null path to prevent clashes with deploying from appstore. * * @param project project to which the process belongs * @param process to create @@ -90,12 +94,29 @@ public DataloadProcess createProcess(Project project, DataloadProcess process, F public DataloadProcess createProcess(Project project, DataloadProcess process) { notNull(project, "project"); notNull(process, "process"); - + isTrue(process.getPath() == null, "Process path has to be null. If you want to create process from appstore, use method createProcessFromAppstore()"); return postProcess(process, getProcessesUri(project)); } + /** + * Create new process from appstore. + * Process must have set path field to valid appstore path in order to deploy from appstore. + * This method is asynchronous, because when deploying from appstore, deployment worker can be triggered. + * + * @param project project to which the process belongs + * @param process to create + * @return created process + */ + public FutureResult createProcessFromAppstore(Project project, DataloadProcess process) { + notNull(project, "project"); + notNull(process, "process"); + notEmpty(process.getPath(), "process path must not be empty"); + return postProcess(process, getProcessesUri(project), HttpMethod.POST); + } + /** * Update process with given data by given project. + * Process must have null path to prevent clashes with deploying from appstore. * * @param project project to which the process belongs * @param process to create @@ -106,10 +127,26 @@ public DataloadProcess updateProcess(Project project, DataloadProcess process, F notNull(process, "process"); notNull(processData, "processData"); notNull(project, "project"); - + isTrue(process.getPath() == null, "Process path has to be null, use processData argument. If you want to update process from appstore, use method updateProcessFromAppstore()"); return postProcess(process, processData, getProcessUri(project, process.getId())); } + /** + * Update process with data from appstore by given project. + * Process must have set path field to valid appstore path in order to deploy from appstore. + * This method is asynchronous, because when deploying from appstore, deployment worker can be triggered. + * + * @param project project to which the process belongs + * @param process to update + * @return updated process + */ + public FutureResult updateProcessFromAppstore(Project project, DataloadProcess process) { + notNull(project, "project"); + notNull(process, "process"); + notEmpty(process.getPath(), "process path must not be empty"); + return postProcess(process, getProcessUri(project, process.getId()), HttpMethod.PUT); + } + /** * Get process by given URI. * @param uri process uri @@ -481,6 +518,35 @@ private DataloadProcess postProcess(DataloadProcess process, File processData, U } } + private FutureResult postProcess(DataloadProcess process, URI postUri, HttpMethod method) { + try { + ResponseEntity exchange = restTemplate.exchange(postUri, method, new HttpEntity<>(process), String.class); + if (exchange.getStatusCode() == HttpStatus.ACCEPTED) { //deployment worker will create process + AsyncTask asyncTask = mapper.readValue(exchange.getBody(), AsyncTask.class); + return new PollResult<>(this, new SimplePollHandler(asyncTask.getUri(), DataloadProcess.class) { + + @Override + public void handlePollException(GoodDataRestException e) { + throw new GoodDataException("Creating process failed", e); + } + }); + } else if (exchange.getStatusCode() == HttpStatus.OK) { //object has been found in package registry, deployment worker is not triggered + final DataloadProcess dataloadProcess = mapper.readValue(exchange.getBody(), DataloadProcess.class); + return new PollResult<>(this, new SimplePollHandler(dataloadProcess.getUri(), DataloadProcess.class) { + + @Override + public void handlePollException(GoodDataRestException e) { + throw new GoodDataException("Creating process failed", e); + } + }); + } else { + throw new IllegalStateException("Unexpected status code from resource: " + exchange.getStatusCode()); + } + } catch (RestClientException | IOException e) { + throw new GoodDataException("Creating process failed", e); + } + } + private DataloadProcess postProcess(DataloadProcess process, URI postUri) { try { return restTemplate.postForObject(postUri, process, DataloadProcess.class); @@ -504,5 +570,4 @@ private void deleteTempFile(File file) { notNull(file, "file"); file.delete(); } - } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index e5d088725..473b0efd0 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -17,6 +17,7 @@ import static java.nio.file.Files.createTempDirectory; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -24,6 +25,7 @@ import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.core.IsCollectionContaining.hasItem; +import static org.hamcrest.core.IsCollectionContaining.hasItems; /** * Dataload processes acceptance tests. @@ -31,6 +33,7 @@ public class ProcessServiceAT extends AbstractGoodDataAT { private DataloadProcess process; + private DataloadProcess processAppstore; @Test(groups = "process", dependsOnGroups = "project") public void createProcess() throws Exception { @@ -59,6 +62,23 @@ public void createProcess() throws Exception { } } + @Test(groups = "process", dependsOnGroups = "project") + public void createProcessFromGit() { + processAppstore = gd.getProcessService().createProcessFromAppstore(project, + new DataloadProcess("sdktest ruby appstore " + System.getenv("BUILD_NUMBER"), ProcessType.RUBY.toString(), + "${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello")).get(); + + assertThat(processAppstore.getExecutables(), contains("hello.rb")); + } + + @Test(groups = "process", dependsOnMethods = "createProcessFromGit") + public void updateProcessFromGit() { + processAppstore.setPath("${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyBonjour"); + processAppstore = gd.getProcessService().updateProcessFromAppstore(project, processAppstore).get(); + + assertThat(processAppstore.getExecutables(), contains("bonjour.rb")); + } + public void copy(final String file, final File dir) throws IOException { IOUtils.copy( new ClassPathResource("/dataload/processes/testgraph/" + file, getClass()).getInputStream(), @@ -92,8 +112,9 @@ public void failExecuteProcess() throws Exception { @Test(dependsOnGroups = "process") public void removeProcess() throws Exception { gd.getProcessService().removeProcess(process); + gd.getProcessService().removeProcess(processAppstore); final Collection processes = gd.getProcessService().listProcesses(project); - assertThat(processes, not(hasItem(hasSameIdAs(process)))); + assertThat(processes, not(hasItems(hasSameIdAs(process), hasSameIdAs(processAppstore)))); } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index ade1d99e7..522a7d57a 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -4,7 +4,6 @@ import com.gooddata.FutureResult; import com.gooddata.collections.PageableList; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -18,6 +17,7 @@ import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +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; @@ -38,6 +38,7 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private static final String SCHEDULE_ID = "SCHEDULE_ID"; private static final String SCHEDULE_PATH = Schedule.TEMPLATE.expand(PROJECT_ID, SCHEDULE_ID).toString(); private static final String EXECUTABLE = "test.groovy"; + private static final String PROCESS_DEPLOYMENT_POLLING_URI = "/gdc/projects/PROJECT_ID/dataload/processesDeploy/uri"; private Project project; @@ -302,4 +303,65 @@ public void shouldRemoveSchedule() throws Exception { gd.getProcessService().removeSchedule(schedule); } + + @Test + public void shouldCreateProcessFromAppstorePackageRegistryMiss() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROCESSES_PATH) + .respond() + .withBody(readFromResource("/dataload/processes/asyncTask.json")) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESS_DEPLOYMENT_POLLING_URI) + .respond() + .withStatus(200) + .withBody(readFromResource("/dataload/processes/appstoreProcess.json")); + DataloadProcess process = gd.getProcessService().createProcessFromAppstore(project, new DataloadProcess("appstoreProcess", ProcessType.RUBY.toString(), + "${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello")).get(); + assertThat(process, notNullValue()); + } + + @Test + public void shouldCreateProcessFromAppstorePackageRegistryHit() throws Exception { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(PROCESSES_PATH) + .respond() + .withStatus(200) + .withBody(readFromResource("/dataload/processes/appstoreProcess.json")); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESS_PATH) + .respond() + .withStatus(200) + .withBody(readFromResource("/dataload/processes/appstoreProcess.json")); + + DataloadProcess process = gd.getProcessService().createProcessFromAppstore(project, new DataloadProcess("appstoreProcess", ProcessType.RUBY.toString(), + "${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello")).get(); + assertThat(process, notNullValue()); + } + + @Test + public void shouldUpdateProcessFromAppstore() { + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(PROCESS_PATH) + .respond() + .withBody(readFromResource("/dataload/processes/asyncTask.json")) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(PROCESS_DEPLOYMENT_POLLING_URI) + .respond() + .withStatus(200) + .withBody(readFromResource("/dataload/processes/appstoreProcess.json")); + + process.setPath("${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello"); + DataloadProcess updatedProcess = gd.getProcessService().updateProcessFromAppstore(project, process).get(); + assertThat(updatedProcess, notNullValue()); + assertThat(updatedProcess.getType(), is(equalTo(ProcessType.RUBY.toString()))); + assertThat(updatedProcess.getExecutables(), contains("hello.rb") ); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 1a7295701..5a44c6712 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -143,7 +143,7 @@ public void testUpdateProcessWithNullProcess() throws Exception { @Test(expectedExceptions = IllegalArgumentException.class) public void testUpdateProcessWithNullFile() throws Exception { - processService.updateProcess(project, process, null); + processService.updateProcess(project, process, (File) null); } @Test(expectedExceptions = GoodDataException.class) diff --git a/src/test/resources/dataload/processes/appstoreProcess.json b/src/test/resources/dataload/processes/appstoreProcess.json new file mode 100644 index 000000000..63e217264 --- /dev/null +++ b/src/test/resources/dataload/processes/appstoreProcess.json @@ -0,0 +1,16 @@ +{ + "process" : { + "type" : "RUBY", + "name" : "processname", + "path" : "${SOME_PLACEHOLDER}:someIdentifier:somePath", + "graphs" : [ "hello.rb" ], + "executables" : [ "hello.rb" ], + "lastDeployed" : "2016-08-17T11:28:07.419Z", + "ownerLogin" : "some@login.com", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/dataload/processes/processId", + "executions" : "/gdc/projects/ProjectId/dataload/processes/ProcessId/executions", + "source" : "/gdc/projects/ProjectId/dataload/processes/ProcessId/source" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/asyncTask.json b/src/test/resources/dataload/processes/asyncTask.json new file mode 100644 index 000000000..f6da18eca --- /dev/null +++ b/src/test/resources/dataload/processes/asyncTask.json @@ -0,0 +1,7 @@ +{ + "asyncTask": { + "links": { + "poll": "/gdc/projects/PROJECT_ID/dataload/processesDeploy/uri" + } + } +} From 7c1670fcc3a99ebac058d019c25d57022541a311 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 28 Jul 2016 11:21:45 +0200 Subject: [PATCH 0393/1191] Align report Grid with reality * Distinguish included metrics from GridElement * Allow GridElement both for columns and rows * Introduce MetricGroup mark --- .../gooddata/md/report/AttributeInGrid.java | 21 +++++--- .../java/com/gooddata/md/report/Grid.java | 37 +++++++++----- .../com/gooddata/md/report/GridElement.java | 29 +---------- .../md/report/GridElementDeserializer.java | 36 ++++++++++++++ .../md/report/GridElementSerializer.java | 29 +++++++++++ .../report/GridReportDefinitionContent.java | 8 +-- .../com/gooddata/md/report/MetricElement.java | 33 +++++++++++++ .../com/gooddata/md/report/MetricGroup.java | 49 +++++++++++++++++++ .../OneNumberReportDefinitionContent.java | 8 +-- src/test/java/com/gooddata/Example.java | 8 ++- .../com/gooddata/md/MetadataServiceAT.java | 8 ++- .../report/GridElementDeserializerTest.java | 35 +++++++++++++ .../md/report/GridElementSerializerTest.java | 29 +++++++++++ .../GridReportDefinitionContentTest.java | 4 +- .../java/com/gooddata/md/report/GridTest.java | 12 +++-- ...lementTest.java => MetricElementTest.java} | 10 ++-- .../OneNumberReportDefinitionContentTest.java | 4 +- .../report/ReportDefinitionContentTest.java | 4 +- .../md/report/ReportDefinitionTest.java | 4 +- .../resources/md/report/gridElements.json | 10 ++++ .../{gridElement.json => metricElement.json} | 0 21 files changed, 305 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/gooddata/md/report/GridElementDeserializer.java create mode 100644 src/main/java/com/gooddata/md/report/GridElementSerializer.java create mode 100644 src/main/java/com/gooddata/md/report/MetricElement.java create mode 100644 src/main/java/com/gooddata/md/report/MetricGroup.java create mode 100644 src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java create mode 100644 src/test/java/com/gooddata/md/report/GridElementSerializerTest.java rename src/test/java/com/gooddata/md/report/{GridElementTest.java => MetricElementTest.java} (74%) create mode 100644 src/test/resources/md/report/gridElements.json rename src/test/resources/md/report/{gridElement.json => metricElement.json} (100%) diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 07b1e62f5..1058a6ac8 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -21,25 +21,26 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) -public class AttributeInGrid extends GridElement { +public class AttributeInGrid implements GridElement { + private final String uri; + private final String alias; private Collection> totals; @JsonCreator AttributeInGrid(@JsonProperty("uri") String uri, @JsonProperty("totals") Collection> totals, @JsonProperty("alias") String alias) { - super(uri, alias); + this.uri = uri; + this.alias = alias; this.totals = totals; } public AttributeInGrid(String uri) { - super(uri, ""); - totals = new ArrayList<>(); + this(uri, new ArrayList>(), null); } public AttributeInGrid(String uri, String alias) { - super(uri, alias); - totals = new ArrayList<>(); + this(uri, new ArrayList>(), alias); } public Collection> getTotals() { @@ -49,4 +50,12 @@ public Collection> getTotals() { } return result; } + + public String getUri() { + return uri; + } + + public String getAlias() { + return alias; + } } diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index a231d5bf0..9f921c751 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -7,6 +7,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import java.util.Collection; import java.util.Collections; @@ -21,16 +23,28 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class Grid { - private final Collection columns; - private final Collection rows; - private final Collection metrics; + private final List columns; + private final List rows; + private final List metrics; private final Map> sort; private final Collection> columnWidths; + /** + * Creates new instance. + * @param columns report's definition columns + * @param rows report's definition rows + * @param metrics report's definition metrics + * @param sort report's sort definition + * @param columnWidths report columns' widths definition + * + * @since 2.0.0 + */ @JsonCreator - public Grid(@JsonProperty("columns") Collection columns, - @JsonProperty("rows") Collection rows, - @JsonProperty("metrics") Collection metrics, + public Grid(@JsonProperty("columns") @JsonDeserialize(contentUsing = GridElementDeserializer.class) + List columns, + @JsonProperty("rows") @JsonDeserialize(contentUsing = GridElementDeserializer.class) + List rows, + @JsonProperty("metrics") List metrics, @JsonProperty("sort") Map> sort, @JsonProperty("columnWidths") Collection> columnWidths) { this.columns = columns; @@ -40,8 +54,7 @@ public Grid(@JsonProperty("columns") Collection columns, this.columnWidths = columnWidths; } - public Grid(final Collection columns, final Collection rows, - final Collection metrics) { + public Grid(List columns, List rows, List metrics) { this.columns = columns; this.rows = rows; this.metrics = metrics; @@ -51,15 +64,17 @@ public Grid(final Collection columns, final Collection columnWidths = Collections.emptyList(); } - public Collection getColumns() { + @JsonSerialize(contentUsing = GridElementSerializer.class) + public List getColumns() { return columns; } - public Collection getRows() { + @JsonSerialize(contentUsing = GridElementSerializer.class) + public List getRows() { return rows; } - public Collection getMetrics() { + public List getMetrics() { return metrics; } diff --git a/src/main/java/com/gooddata/md/report/GridElement.java b/src/main/java/com/gooddata/md/report/GridElement.java index 759e8a554..db247c5ef 100644 --- a/src/main/java/com/gooddata/md/report/GridElement.java +++ b/src/main/java/com/gooddata/md/report/GridElement.java @@ -3,35 +3,10 @@ */ package com.gooddata.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; - /** * Grid element - * (metricGroup | URI | AttributeInGrid ... URI is allowed for backward compatibility, metricGroup can be maximally + * (metricGroup | AttributeInGrid ... metricGroup can be maximally * one time in rows or columns) */ -@JsonIgnoreProperties(ignoreUnknown = true) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class GridElement { - - private final String uri; - private final String alias; - - @JsonCreator - public GridElement(@JsonProperty("uri") String uri, @JsonProperty("alias") String alias) { - this.uri = uri; - this.alias = alias; - } - - public String getUri() { - return uri; - } - - public String getAlias() { - return alias; - } - +public interface GridElement { } diff --git a/src/main/java/com/gooddata/md/report/GridElementDeserializer.java b/src/main/java/com/gooddata/md/report/GridElementDeserializer.java new file mode 100644 index 000000000..9a2d5335c --- /dev/null +++ b/src/main/java/com/gooddata/md/report/GridElementDeserializer.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; + +import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; + +/** + * Custom deserializer for {@link GridElement}'s implementations + */ +class GridElementDeserializer extends JsonDeserializer { + + @Override + public GridElement deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + switch (jp.currentToken()) { + case VALUE_STRING: + final String textValue = ctxt.readValue(jp, String.class); + if (MetricGroup.equals(textValue)) { + return METRIC_GROUP; + } else { + throw ctxt.mappingException("Unknown string representation of GridElement: %s", textValue); + } + case START_OBJECT: + return ctxt.readValue(jp, AttributeInGrid.class); + default: + throw ctxt.mappingException("Unknown type of GridElement"); + } + } +} diff --git a/src/main/java/com/gooddata/md/report/GridElementSerializer.java b/src/main/java/com/gooddata/md/report/GridElementSerializer.java new file mode 100644 index 000000000..3e5bcd4ad --- /dev/null +++ b/src/main/java/com/gooddata/md/report/GridElementSerializer.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import com.fasterxml.jackson.core.JsonGenerationException; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; + +/** + * Custom serializer for {@link GridElement}'s implementations + */ +class GridElementSerializer extends JsonSerializer { + + @Override + public void serialize(GridElement value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value instanceof AttributeInGrid) { + serializers.defaultSerializeValue(value, gen); + } else if (value instanceof MetricGroup) { + gen.writeString(((MetricGroup) value).getValue()); + } else { + throw new JsonGenerationException("Unsupported kind of GridElement: " + value.getClass().getName(), gen); + } + } +} diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index 291154046..b3504dcdf 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -40,13 +40,13 @@ public String getFormat() { return FORMAT; } - public static ReportDefinition create(String title, List columns, List rows, - List metrics) { + public static ReportDefinition create(String title, List columns, List rows, + List metrics) { return create(title, columns, rows, metrics, Collections.emptyList()); } - public static ReportDefinition create(String title, List columns, List rows, - List metrics, Collection filters) { + public static ReportDefinition create(String title, List columns, List rows, + List metrics, Collection filters) { return new ReportDefinition(new Meta(title), new GridReportDefinitionContent(new Grid(columns, rows, metrics), filters)); } } diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java new file mode 100644 index 000000000..d2cb542c3 --- /dev/null +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.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; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class MetricElement { + + private final String uri; + private final String alias; + + @JsonCreator + public MetricElement(@JsonProperty("uri") final String uri, + @JsonProperty("alias") final String alias) { + this.uri = uri; + this.alias = alias; + } + + public String getUri() { + return uri; + } + + public String getAlias() { + return alias; + } +} diff --git a/src/main/java/com/gooddata/md/report/MetricGroup.java b/src/main/java/com/gooddata/md/report/MetricGroup.java new file mode 100644 index 000000000..6cf1f2d1e --- /dev/null +++ b/src/main/java/com/gooddata/md/report/MetricGroup.java @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +/** + * 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 { + + private static final String JSON_VALUE = "metricGroup"; + + private final String value; + + public static final MetricGroup METRIC_GROUP = new MetricGroup(JSON_VALUE); + + private MetricGroup(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + + /** + * @param string string to compare whether is metricGroup + * @return true when the {@link #METRIC_GROUP}'s string value equals to the argument, false otherwise + */ + public static boolean equals(String string) { + return METRIC_GROUP.getValue().equals(string); + } + + @Override + public boolean equals(Object o) { + return this == o; + } + + @Override + public int hashCode() { + return getValue() != null ? getValue().hashCode() : 0; + } + + @Override + public String toString() { + return getValue(); + } +} diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index e81b5e77c..b98278c0f 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -74,13 +74,13 @@ public String getDescription() { } } - public static ReportDefinition create(String title, List columns, List rows, - List metrics) { + public static ReportDefinition create(String title, List columns, List rows, + List metrics) { return create(title, columns, rows, metrics, Collections.emptyList()); } - public static ReportDefinition create(String title, List columns, List rows, - List metrics, Collection filters) { + public static ReportDefinition create(String title, List columns, List rows, + List metrics, Collection filters) { return new ReportDefinition(new Meta(title), new OneNumberReportDefinitionContent( new Grid(columns, rows, metrics), title, filters)); } diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 2be0281e1..c4af1cf66 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -15,6 +15,8 @@ import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; +import com.gooddata.md.report.MetricElement; +import com.gooddata.md.report.MetricGroup; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; @@ -29,9 +31,11 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.Arrays; import java.util.Collection; import static com.gooddata.md.Restriction.identifier; +import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; import static java.util.Arrays.asList; public class Example { @@ -70,9 +74,9 @@ public static void main(String... args) throws FileNotFoundException { ReportDefinition definition = GridReportDefinitionContent.create( "Department avg shoe size", - asList("metricGroup"), + asList(METRIC_GROUP), asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), - asList(new GridElement(m.getUri(), "Avg shoe size")) + asList(new MetricElement(m.getUri(), "Avg shoe size")) ); definition = md.createObj(project, definition); Report report = md.createObj(project, new Report(definition.getTitle(), definition)); diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 91af4ae77..190dba0f4 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -1,6 +1,7 @@ package com.gooddata.md; import static com.gooddata.md.Restriction.identifier; +import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; import static com.gooddata.report.ReportExportFormat.PDF; import static com.gooddata.report.ReportExportFormat.XLS; import static java.util.Arrays.asList; @@ -13,10 +14,13 @@ import com.gooddata.md.report.Filter; import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; +import com.gooddata.md.report.MetricElement; +import com.gooddata.md.report.MetricGroup; import com.gooddata.md.report.Report; import org.joda.time.LocalDate; import org.testng.annotations.Test; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -60,9 +64,9 @@ public void createReport() throws Exception { reportDefinition = md.createObj(project, GridReportDefinitionContent.create( "Department avg shoe size", - asList("metricGroup"), + asList(METRIC_GROUP), asList(new AttributeInGrid(attr.getDefaultDisplayForm().getUri())), - asList(new GridElement(metric.getUri(), "Avg shoe size")), + asList(new MetricElement(metric.getUri(), "Avg shoe size")), asList(new Filter("(SELECT [" + metric.getUri() + "]) >= 0")) )); report = md.createObj(project, new Report(reportDefinition.getTitle(), reportDefinition)); diff --git a/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java new file mode 100644 index 000000000..d97fc7a1f --- /dev/null +++ b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import org.testng.annotations.Test; + +import java.util.ArrayList; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.instanceOf; + +public class GridElementDeserializerTest { + + @Test + public void testDeserializer() throws Exception { + final GridElements elems = new ObjectMapper().readValue( + getClass().getResourceAsStream("/md/report/gridElements.json"), GridElements.class); + + assertThat(elems, is(notNullValue())); + assertThat(elems, hasSize(2)); + assertThat(elems.get(0), instanceOf(AttributeInGrid.class)); + assertThat(elems.get(1), instanceOf(MetricGroup.class)); + } + + @JsonDeserialize(contentUsing = GridElementDeserializer.class) + private static class GridElements extends ArrayList {} + +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java b/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java new file mode 100644 index 000000000..c791d304b --- /dev/null +++ b/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import org.testng.annotations.Test; + +import java.util.ArrayList; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; +import static org.hamcrest.MatcherAssert.assertThat; + +public class GridElementSerializerTest { + + @Test + public void testSerializer() throws Exception { + final GridElements elems = new GridElements(); + elems.add(new AttributeInGrid("/uriValue", "aliasValue")); + elems.add(METRIC_GROUP); + assertThat(elems, serializesToJson("/md/report/gridElements.json")); + } + + @JsonSerialize(contentUsing = GridElementSerializer.class) + private static class GridElements extends ArrayList {} + +} \ 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 cdc6f548b..5e75c4727 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -28,8 +28,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final GridReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList())); + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 4916e620e..a799b5321 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -4,6 +4,7 @@ package com.gooddata.md.report; import com.fasterxml.jackson.databind.ObjectMapper; +import org.hamcrest.CoreMatchers; import org.testng.annotations.Test; import java.util.Collection; @@ -13,6 +14,7 @@ import java.util.Map; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -29,11 +31,11 @@ public void testDeserialization() throws Exception { assertThat(grid.getColumns(), is(notNullValue())); assertThat(grid.getColumns(), hasSize(1)); - assertThat(grid.getColumns().iterator().next(), is("metricGroup")); + assertThat(grid.getColumns().iterator().next(), CoreMatchers.is(METRIC_GROUP)); assertThat(grid.getRows(), is(notNullValue())); assertThat(grid.getRows(), hasSize(1)); - final AttributeInGrid attrInGrid = grid.getRows().iterator().next(); + final AttributeInGrid attrInGrid = (AttributeInGrid) grid.getRows().iterator().next(); assertThat(attrInGrid.getAlias(), is("attr")); assertThat(grid.getMetrics(), is(notNullValue())); @@ -54,11 +56,13 @@ public void testSerialization() throws Exception { colWidths.put("width", 343); sort.put("columns", Collections.emptyList()); sort.put("rows", Collections.emptyList()); - final Grid grid = new Grid(asList("metricGroup"), + final Grid grid = new Grid( + asList(METRIC_GROUP), asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", asList((Collection)Collections.emptyList()), "attr")), - asList(new GridElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); + asList(new MetricElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); + new ObjectMapper().writeValueAsString(grid); assertThat(grid, serializesToJson("/md/report/grid-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/GridElementTest.java b/src/test/java/com/gooddata/md/report/MetricElementTest.java similarity index 74% rename from src/test/java/com/gooddata/md/report/GridElementTest.java rename to src/test/java/com/gooddata/md/report/MetricElementTest.java index 19be6e010..bc72c545a 100644 --- a/src/test/java/com/gooddata/md/report/GridElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -13,15 +13,15 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -public class GridElementTest { +public class MetricElementTest { public static final String URI = "/ELEM_URI"; public static final String ALIAS = "ELEM_ALIAS"; @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/gridElement.json"); - final GridElement element = new ObjectMapper().readValue(is, GridElement.class); + final InputStream is = getClass().getResourceAsStream("/md/report/metricElement.json"); + final MetricElement element = new ObjectMapper().readValue(is, MetricElement.class); assertThat(element, is(notNullValue())); assertThat(element.getUri(), is(URI)); assertThat(element.getAlias(), is(ALIAS)); @@ -29,8 +29,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { - final GridElement element = new GridElement(URI, ALIAS); - assertThat(element, serializesToJson("/md/report/gridElement.json")); + final MetricElement element = new MetricElement(URI, ALIAS); + assertThat(element, serializesToJson("/md/report/metricElement.json")); } } \ 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 b97789cac..dd0337bf2 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -29,8 +29,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final OneNumberReportDefinitionContent def = new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc", Collections.emptyList() + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc", Collections.emptyList() ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index b2df4f354..d6469a1dd 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -28,8 +28,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final ReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList())); + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index ebf9ff985..e5fdb8a6c 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -33,8 +33,8 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final ReportDefinition def = new ReportDefinition("Untitled", new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc", asList(new Filter("(SELECT [/gdc/md/projectId/obj/123]) >= 2"))) + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc", asList(new Filter("(SELECT [/gdc/md/projectId/obj/123]) >= 2"))) ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); } diff --git a/src/test/resources/md/report/gridElements.json b/src/test/resources/md/report/gridElements.json new file mode 100644 index 000000000..2c5b163df --- /dev/null +++ b/src/test/resources/md/report/gridElements.json @@ -0,0 +1,10 @@ +[ + { + "attribute": { + "uri": "/uriValue", + "alias": "aliasValue", + "totals" : [] + } + }, + "metricGroup" +] \ No newline at end of file diff --git a/src/test/resources/md/report/gridElement.json b/src/test/resources/md/report/metricElement.json similarity index 100% rename from src/test/resources/md/report/gridElement.json rename to src/test/resources/md/report/metricElement.json From 93d3e07c2c53cc6a2dfb842df3e6b70043a624ef Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 28 Jul 2016 15:11:40 +0200 Subject: [PATCH 0394/1191] introduce full support of Grid's metric --- .../com/gooddata/md/report/MetricElement.java | 24 ++++++++++++++++++- src/test/java/com/gooddata/Example.java | 2 -- .../com/gooddata/md/MetadataServiceAT.java | 2 -- .../gooddata/md/report/MetricElementTest.java | 10 +++++--- .../resources/md/report/metricElement.json | 4 +++- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index d2cb542c3..b54943b16 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -9,18 +9,31 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +/** + * Metric used in {@link Grid} for report definition. + */ @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) public class MetricElement { private final String uri; private final String alias; + private final String format; + private final String drillAcrossStepAttributeDisplayFormUri; @JsonCreator public MetricElement(@JsonProperty("uri") final String uri, - @JsonProperty("alias") final String alias) { + @JsonProperty("alias") final String alias, + @JsonProperty("format") final String format, + @JsonProperty("drillAcrossStepAttributeDF") String drillAcrossStepAttributeDisplayFormUri) { this.uri = uri; this.alias = alias; + this.format = format; + this.drillAcrossStepAttributeDisplayFormUri = drillAcrossStepAttributeDisplayFormUri; + } + + public MetricElement(String uri, String alias) { + this(uri, alias, null, null); } public String getUri() { @@ -30,4 +43,13 @@ public String getUri() { public String getAlias() { return alias; } + + public String getFormat() { + return format; + } + + @JsonProperty("drillAcrossStepAttributeDF") + public String getDrillAcrossStepAttributeDisplayFormUri() { + return drillAcrossStepAttributeDisplayFormUri; + } } diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index c4af1cf66..775573849 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -13,7 +13,6 @@ import com.gooddata.md.MetadataService; import com.gooddata.md.Metric; import com.gooddata.md.report.AttributeInGrid; -import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; import com.gooddata.md.report.MetricElement; import com.gooddata.md.report.MetricGroup; @@ -31,7 +30,6 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.Arrays; import java.util.Collection; import static com.gooddata.md.Restriction.identifier; diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 190dba0f4..1bc8bd03d 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -12,7 +12,6 @@ import com.gooddata.AbstractGoodDataAT; import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.Filter; -import com.gooddata.md.report.GridElement; import com.gooddata.md.report.GridReportDefinitionContent; import com.gooddata.md.report.MetricElement; import com.gooddata.md.report.MetricGroup; @@ -20,7 +19,6 @@ import org.joda.time.LocalDate; import org.testng.annotations.Test; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; diff --git a/src/test/java/com/gooddata/md/report/MetricElementTest.java b/src/test/java/com/gooddata/md/report/MetricElementTest.java index bc72c545a..11365d06b 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -15,8 +15,10 @@ public class MetricElementTest { - public static final String URI = "/ELEM_URI"; - public static final String ALIAS = "ELEM_ALIAS"; + private static final String URI = "/ELEM_URI"; + private static final String ALIAS = "ELEM_ALIAS"; + private static final String FORMAT = "FORMAT"; + private static final String DRILL_URI = "/DRILL_URI"; @Test public void testDeserialization() throws Exception { @@ -25,11 +27,13 @@ public void testDeserialization() throws Exception { assertThat(element, is(notNullValue())); assertThat(element.getUri(), is(URI)); assertThat(element.getAlias(), is(ALIAS)); + assertThat(element.getFormat(), is(FORMAT)); + assertThat(element.getDrillAcrossStepAttributeDisplayFormUri(), is(DRILL_URI)); } @Test public void testSerialization() throws Exception { - final MetricElement element = new MetricElement(URI, ALIAS); + final MetricElement element = new MetricElement(URI, ALIAS, FORMAT, DRILL_URI); assertThat(element, serializesToJson("/md/report/metricElement.json")); } diff --git a/src/test/resources/md/report/metricElement.json b/src/test/resources/md/report/metricElement.json index 5366a7769..d71c54af4 100644 --- a/src/test/resources/md/report/metricElement.json +++ b/src/test/resources/md/report/metricElement.json @@ -1,4 +1,6 @@ { "uri": "/ELEM_URI", - "alias": "ELEM_ALIAS" + "alias": "ELEM_ALIAS", + "format": "FORMAT", + "drillAcrossStepAttributeDF": "/DRILL_URI" } From 9ac6bad977a208ea67a569b60f3bfa1c9deccf3a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 29 Jul 2016 09:32:24 +0200 Subject: [PATCH 0395/1191] introduce convenient constructors for elements in grid --- .../gooddata/md/report/AttributeInGrid.java | 20 +++++++++++++++++++ .../com/gooddata/md/report/MetricElement.java | 11 ++++++++++ .../md/report/AttributeInGridTest.java | 16 +++++++++++++++ .../gooddata/md/report/MetricElementTest.java | 13 ++++++++++++ 4 files changed, 60 insertions(+) diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 1058a6ac8..3865c2d9c 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -9,11 +9,15 @@ 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 java.util.ArrayList; import java.util.Collection; import java.util.LinkedList; +import static com.gooddata.util.Validate.notNull; + /** * Attribute in Grid */ @@ -43,6 +47,22 @@ public AttributeInGrid(String uri, String alias) { this(uri, new ArrayList>(), alias); } + /** + * Creates new AttributeInGrid using given DisplayForm's uri and it's title as alias. + * @param displayForm displayForm to create AttributeInGrid from + */ + public AttributeInGrid(final DisplayForm displayForm) { + this(notNull(notNull(displayForm, "displayForm").getUri(), "uri"), notNull(displayForm, "displayForm").getTitle()); + } + + /** + * Creates new AttributeInGrid using given Attribute's default DisplayForm's uri and it's title as alias. + * @param attribute attribute to create AttributeInGrid from + */ + public AttributeInGrid(final Attribute attribute) { + this(notNull(attribute, "attribute").getDefaultDisplayForm()); + } + public Collection> getTotals() { final LinkedList> result = new LinkedList<>(); for (final Collection t : totals) { diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index b54943b16..32ee6dbf7 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -8,6 +8,9 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.md.Metric; + +import static com.gooddata.util.Validate.notNull; /** * Metric used in {@link Grid} for report definition. @@ -36,6 +39,14 @@ public MetricElement(String uri, String alias) { this(uri, alias, null, null); } + /** + * Creates new instance using uri of given metric and it's title as alias. + * @param metric metric to create element from + */ + public MetricElement(final Metric metric) { + this(notNull(notNull(metric, "metric").getUri(), "uri"), notNull(metric, "metric").getTitle()); + } + public String getUri() { return uri; } diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 064dc1d34..1c831e506 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -4,6 +4,8 @@ package com.gooddata.md.report; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.md.Attribute; +import com.gooddata.md.DisplayForm; import org.testng.annotations.Test; import java.io.InputStream; @@ -17,6 +19,8 @@ import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class AttributeInGridTest { @@ -52,4 +56,16 @@ public void testSerialization() throws Exception { assertThat(attr, serializesToJson("/md/report/attributeInGrid.json")); } + @Test + public void testCreateFromAttribute() throws Exception { + final Attribute attr = mock(Attribute.class); + final DisplayForm displayForm = mock(DisplayForm.class); + when(attr.getDefaultDisplayForm()).thenReturn(displayForm); + when(displayForm.getUri()).thenReturn(URI); + when(displayForm.getTitle()).thenReturn(ALIAS); + + final AttributeInGrid attrInGrid = new AttributeInGrid(attr); + assertThat(attrInGrid.getUri(), is(URI)); + assertThat(attrInGrid.getAlias(), is(ALIAS)); + } } \ 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 11365d06b..a54d83a12 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -4,6 +4,7 @@ package com.gooddata.md.report; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.md.Metric; import org.testng.annotations.Test; import java.io.InputStream; @@ -12,6 +13,8 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class MetricElementTest { @@ -37,4 +40,14 @@ public void testSerialization() throws Exception { assertThat(element, serializesToJson("/md/report/metricElement.json")); } + @Test + public void testCreateFromMetric() throws Exception { + final Metric metric = mock(Metric.class); + when(metric.getTitle()).thenReturn(ALIAS); + when(metric.getUri()).thenReturn(URI); + + final MetricElement element = new MetricElement(metric); + assertThat(element.getUri(), is(URI)); + assertThat(element.getAlias(), is(ALIAS)); + } } \ No newline at end of file From 6325816bac24f86a5e3b7be8f18c8f7807405446 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 29 Jul 2016 11:00:43 +0200 Subject: [PATCH 0396/1191] introduce convenient enum for Totals in grid --- .../gooddata/md/report/AttributeInGrid.java | 60 ++++++++++++++++--- .../java/com/gooddata/md/report/Total.java | 40 +++++++++++++ .../md/report/AttributeInGridTest.java | 26 ++++---- .../java/com/gooddata/md/report/GridTest.java | 3 +- .../com/gooddata/md/report/TotalTest.java | 26 ++++++++ .../resources/md/report/attributeInGrid.json | 2 +- src/test/resources/md/report/grid-input.json | 4 +- 7 files changed, 133 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/gooddata/md/report/Total.java create mode 100644 src/test/java/com/gooddata/md/report/TotalTest.java diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 3865c2d9c..92d1df5c9 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -4,6 +4,7 @@ package com.gooddata.md.report; 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; @@ -13,10 +14,13 @@ import com.gooddata.md.DisplayForm; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.LinkedList; +import java.util.List; import static com.gooddata.util.Validate.notNull; +import static java.util.Arrays.asList; /** * Attribute in Grid @@ -29,22 +33,50 @@ public class AttributeInGrid implements GridElement { private final String uri; private final String alias; - private Collection> totals; + private List> totals; @JsonCreator - AttributeInGrid(@JsonProperty("uri") String uri, @JsonProperty("totals") Collection> totals, + AttributeInGrid(@JsonProperty("uri") String uri, @JsonProperty("totals") List> totals, @JsonProperty("alias") String alias) { this.uri = uri; this.alias = alias; this.totals = totals; } + /** + * Creates new instance. + * @param uri uri of displayForm of attribute to be in grid + */ public AttributeInGrid(String uri) { - this(uri, new ArrayList>(), null); + this(uri, null); } + /** + * Creates new instance. + * @param uri uri of displayForm of attribute to be in grid + * @param alias alias used to label the attribute + */ public AttributeInGrid(String uri, String alias) { - this(uri, new ArrayList>(), alias); + this(uri, new ArrayList>(), alias); + } + + /** + * Creates new instance. + * @param uri uri of displayForm of attribute to be in grid + * @param alias alias used to label the attribute + * @param totals totals for metrics used in grid - for each {@link MetricElement} in grid, there can be list + * of totals. The totals are evaluated in given order. + */ + public AttributeInGrid(String uri, String alias, List> totals) { + this(uri, alias); + notNull(totals, "totals"); + for (List totalList : totals) { + final List totalStringList = new ArrayList<>(totalList.size()); + for (Total total : totalList) { + totalStringList.add(total.toString()); + } + this.totals.add(totalStringList); + } } /** @@ -63,12 +95,22 @@ public AttributeInGrid(final Attribute attribute) { this(notNull(attribute, "attribute").getDefaultDisplayForm()); } - public Collection> getTotals() { - final LinkedList> result = new LinkedList<>(); - for (final Collection t : totals) { - result.add(t); + @JsonProperty("totals") + public List> getStringTotals() { + return totals; + } + + @JsonIgnore + public List> getTotals() { + final List> enumTotals = new ArrayList<>(totals.size()); + for (List totalList : totals) { + final List totalEnumList = new ArrayList<>(totalList.size()); + for (String total : totalList) { + totalEnumList.add(Total.of(total)); + } + enumTotals.add(totalEnumList); } - return result; + return enumTotals; } public String getUri() { diff --git a/src/main/java/com/gooddata/md/report/Total.java b/src/main/java/com/gooddata/md/report/Total.java new file mode 100644 index 000000000..8b5d2be1c --- /dev/null +++ b/src/main/java/com/gooddata/md/report/Total.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import static com.gooddata.util.Validate.notNull; +import static java.lang.String.format; + +/** + * Represents type of Total for {@link AttributeInGrid} + */ +public enum Total { + SUM, + AVG, + MAX, + MIN, + NAT, + MED; + + @Override + public String toString() { + return name().toLowerCase(); + } + + public static Total of(String total) { + notNull(total, "total"); + try { + return Total.valueOf(total.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new UnsupportedOperationException( + format("Unknown value for Grid's total: \"%s\", supported values are: [%s]", + total, StringUtils.arrayToCommaDelimitedString(Total.values())), + e); + } + } +} diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 1c831e506..110e82f05 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -11,6 +11,7 @@ import java.io.InputStream; import java.util.Collection; import java.util.Iterator; +import java.util.List; import static com.gooddata.JsonMatchers.serializesToJson; import static java.util.Arrays.asList; @@ -24,8 +25,8 @@ public class AttributeInGridTest { - public static final String URI = "/URI"; - public static final String ALIAS = "ALIAS"; + private static final String URI = "/URI"; + private static final String ALIAS = "ALIAS"; @Test public void testDeserialization() throws Exception { @@ -36,23 +37,22 @@ public void testDeserialization() throws Exception { assertThat(attr.getUri(), is(URI)); assertThat(attr.getAlias(), is(ALIAS)); - assertThat(attr.getTotals(), is(notNullValue())); - assertThat(attr.getTotals(), hasSize(2)); - final Iterator> i = attr.getTotals().iterator(); - final Collection subTotal1 = i.next(); + assertThat(attr.getStringTotals(), is(notNullValue())); + assertThat(attr.getStringTotals(), hasSize(2)); + final Iterator> i = attr.getTotals().iterator(); + final List subTotal1 = i.next(); assertThat(subTotal1, hasSize(1)); - assertThat(subTotal1.iterator().next(), is("TOTAL1")); - final Collection subTotal2 = i.next(); + assertThat(subTotal1.iterator().next(), is(Total.SUM)); + final List subTotal2 = i.next(); assertThat(subTotal2, hasSize(2)); - assertThat(subTotal2.iterator().next(), isOneOf("TOTAL2", "TOTAL3")); - assertThat(subTotal2.iterator().next(), isOneOf("TOTAL2", "TOTAL3")); + assertThat(subTotal2.get(0), is(Total.AVG)); + assertThat(subTotal2.get(1), is(Total.MED)); } @Test public void testSerialization() throws Exception { - final Collection> totals = asList((Collection) asList("TOTAL1"), - asList("TOTAL2", "TOTAL3")); - final AttributeInGrid attr = new AttributeInGrid(URI, totals, ALIAS); + final List> totals = asList(asList(Total.SUM), asList(Total.AVG, Total.MED)); + final AttributeInGrid attr = new AttributeInGrid(URI, ALIAS, totals); assertThat(attr, serializesToJson("/md/report/attributeInGrid.json")); } diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index a799b5321..befc64ecc 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -58,8 +58,7 @@ public void testSerialization() throws Exception { sort.put("rows", Collections.emptyList()); final Grid grid = new Grid( asList(METRIC_GROUP), - asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", - asList((Collection)Collections.emptyList()), "attr")), + asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", "attr")), asList(new MetricElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); new ObjectMapper().writeValueAsString(grid); diff --git a/src/test/java/com/gooddata/md/report/TotalTest.java b/src/test/java/com/gooddata/md/report/TotalTest.java new file mode 100644 index 000000000..6a1fc4f23 --- /dev/null +++ b/src/test/java/com/gooddata/md/report/TotalTest.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. + */ + +package com.gooddata.md.report; + +import org.testng.annotations.Test; + +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +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 diff --git a/src/test/resources/md/report/attributeInGrid.json b/src/test/resources/md/report/attributeInGrid.json index e6872fefa..efb204979 100644 --- a/src/test/resources/md/report/attributeInGrid.json +++ b/src/test/resources/md/report/attributeInGrid.json @@ -1,7 +1,7 @@ { "attribute": { "uri": "/URI", - "totals": [ ["TOTAL1"], ["TOTAL2", "TOTAL3"] ], + "totals": [ ["sum"], ["avg", "med"] ], "alias": "ALIAS" } } diff --git a/src/test/resources/md/report/grid-input.json b/src/test/resources/md/report/grid-input.json index b760b581a..c2a5d6240 100644 --- a/src/test/resources/md/report/grid-input.json +++ b/src/test/resources/md/report/grid-input.json @@ -21,9 +21,7 @@ { "attribute": { "alias": "attr", - "totals": [ - [] - ], + "totals": [], "uri": "/gdc/md/PROJECT_ID/obj/ATTR_ID" } } From 6366c6aeb0084f7246e08e511cb0d1e5e7ac23c5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 22 Aug 2016 18:23:12 +0200 Subject: [PATCH 0397/1191] rename getAccount() to getAccountById() and introduce getAccountByUri() This change is for the sake of consistency with project, data warehouse,... and it is not breaking backward compatibility, because it is introduced in unreleased version --- .../com/gooddata/account/AccountService.java | 17 ++++++++++++++--- .../com/gooddata/account/AccountServiceAT.java | 3 +-- .../com/gooddata/account/AccountServiceIT.java | 4 ++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index f3d978e6b..52058a2dd 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -35,7 +35,7 @@ public AccountService(RestTemplate restTemplate) { * @throws com.gooddata.GoodDataException when current account can't be accessed. */ public Account getCurrent() { - return getAccount(Account.CURRENT_ID); + return getAccountById(Account.CURRENT_ID); } /** @@ -66,7 +66,7 @@ public Account createAccount(Account account, String organizationName) { try { final UriResponse uriResponse = restTemplate.postForObject(Account.ACCOUNTS_URI, account, UriResponse.class, organizationName); - return getAccount(Account.getId(uriResponse.getUri())); + return getAccountByUri(uriResponse.getUri()); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to create account", e); } @@ -101,7 +101,7 @@ public void removeAccount(Account account) { * @throws AccountNotFoundException when account for given id can't be found * @throws GoodDataException */ - public Account getAccount(String id) { + public Account getAccountById(String id) { try { return restTemplate.getForObject(Account.URI, Account.class, id); } catch (GoodDataRestException e) { @@ -115,4 +115,15 @@ public Account getAccount(String id) { } } + /** + * Get account for given account id + * @param uri to search for + * @return account for uri + * @throws AccountNotFoundException when account for given uri can't be found + * @throws GoodDataException + */ + public Account getAccountByUri(String uri) { + return getAccountById(Account.getId(uri)); + } + } diff --git a/src/test/java/com/gooddata/account/AccountServiceAT.java b/src/test/java/com/gooddata/account/AccountServiceAT.java index b66b55e2d..2e4ebe01e 100644 --- a/src/test/java/com/gooddata/account/AccountServiceAT.java +++ b/src/test/java/com/gooddata/account/AccountServiceAT.java @@ -7,7 +7,6 @@ import java.util.UUID; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -42,7 +41,7 @@ public void createAccount() { @Test(groups = "isolated_domain", dependsOnMethods = "createAccount") public void getAccount() { - final Account foundAccount = accountService.getAccount(this.account.getId()); + final Account foundAccount = accountService.getAccountById(this.account.getId()); assertThat(foundAccount, is(notNullValue())); assertThat(foundAccount.getId(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/account/AccountServiceIT.java b/src/test/java/com/gooddata/account/AccountServiceIT.java index d01def336..f4ebebf5a 100644 --- a/src/test/java/com/gooddata/account/AccountServiceIT.java +++ b/src/test/java/com/gooddata/account/AccountServiceIT.java @@ -171,7 +171,7 @@ public void shouldGetAccount() { .withBody(readFromResource(ACCOUNT)) .withStatus(200); - final Account created = gd.getAccountService().getAccount(ACCOUNT_ID); + final Account created = gd.getAccountService().getAccountById(ACCOUNT_ID); assertThat(created, notNullValue()); assertThat(created.getFirstName(), is("Blah")); @@ -185,7 +185,7 @@ public void shouldFailToFindAccount() { .respond() .withStatus(404); - gd.getAccountService().getAccount(ACCOUNT_ID); + gd.getAccountService().getAccountById(ACCOUNT_ID); } } From 5d991cac9820691371eacde18ccc1bf93d203891 Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Thu, 18 Aug 2016 13:48:52 +0200 Subject: [PATCH 0398/1191] add function for removing user from warehouse close #354 --- .../gooddata/warehouse/WarehouseService.java | 48 +++++++++++++++- .../com/gooddata/warehouse/WarehouseUser.java | 5 ++ .../WarehouseUserNotFoundException.java | 21 +++++++ .../warehouse/WarehouseServiceAT.java | 43 ++++++++++++++- .../warehouse/WarehouseServiceIT.java | 55 ++++++++++++++++++- .../gooddata/warehouse/WarehouseUserTest.java | 8 ++- .../warehouse/removeUserTask-finished.json | 7 +++ 7 files changed, 183 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java create mode 100644 src/test/resources/warehouse/removeUserTask-finished.json diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index a9a1037c1..872adf8ca 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -8,9 +8,9 @@ import com.gooddata.PollResult; import com.gooddata.collections.Page; import com.gooddata.collections.PageableList; +import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.client.ClientHttpResponse; -import org.springframework.util.StringUtils; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; @@ -234,6 +234,52 @@ public void handlePollException(final GoodDataRestException e) { }); } + /** + * Remove given user from warehouse instance + * @param user to remove from warehouse + * @throws WarehouseUserNotFoundException when user for removal can't be found + * @throws GoodDataException any other reason + */ + public FutureResult removeUserFromWarehouse(final WarehouseUser user) { + notNull(user, "user"); + + final WarehouseTask task; + try { + task = restTemplate.exchange(user.getUri(), HttpMethod.DELETE, null, WarehouseTask.class).getBody(); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new WarehouseUserNotFoundException(user.getUri(), e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to remove Warehouse user from instance " + user.getUri(), e); + } + if (task == null) { + throw new GoodDataException("Empty response when user removed"); + } + + return new PollResult<>(this, + new AbstractPollHandler + (task.getPollLink(), WarehouseTask.class, Void.class) { + + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + return HttpStatus.CREATED.equals(response.getStatusCode()); + } + + @Override + public void handlePollResult(WarehouseTask pollResult) { + setResult(null); + } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new GoodDataException("Unable to remove user from warehouse", e); + } + }); + } + /** * Updates given Warehouse. * diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index bb1a96bba..c9a7880b4 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -69,6 +69,11 @@ public Map getLinks() { return links; } + @JsonIgnore + public String getId() { + return TEMPLATE.match(getUri()).get("userId"); + } + @JsonIgnore public String getUri() { return links != null ? links.get(SELF_LINK): null; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java new file mode 100644 index 000000000..6534339d8 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java @@ -0,0 +1,21 @@ +package com.gooddata.warehouse; + +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; + +/** + * Warehouse instance doesn't exist. + */ +public class WarehouseUserNotFoundException extends GoodDataException { + + private final String userUri; + + public WarehouseUserNotFoundException(String uri, GoodDataRestException cause) { + super("Warehouse user " + uri + " was not found", cause); + this.userUri = uri; + } + + public String getUserUri() { + return userUri; + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index 56c8c15f6..2122176ef 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -1,14 +1,18 @@ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataAT; +import com.gooddata.account.Account; import com.gooddata.collections.Page; import com.gooddata.collections.PageRequest; import com.gooddata.collections.PageableList; import com.gooddata.project.Environment; import org.testng.annotations.AfterClass; +import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import java.util.Collection; +import java.util.UUID; +import java.util.concurrent.TimeUnit; import static com.gooddata.warehouse.WarehouseIdMatcher.hasSameIdAs; import static org.hamcrest.MatcherAssert.assertThat; @@ -21,24 +25,35 @@ /** * Warehouse acceptance tests */ + public class WarehouseServiceAT extends AbstractGoodDataAT { + private static final String LOGIN = "john.smith." + UUID.randomUUID() + "@gooddata.com"; + private final String warehouseToken; private final WarehouseService service; private Warehouse warehouse; private Warehouse warehouse2; + private Account account; + private WarehouseUser warehouseUser; + public WarehouseServiceAT() { warehouseToken = getProperty("warehouseToken"); service = gd.getWarehouseService(); } + @BeforeClass(groups = "isolated_domain") + 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(); + warehouse = service.createWarehouse(wh).get(60, TimeUnit.MINUTES); String jdbc = warehouse.getConnectionUrl(); } @@ -85,6 +100,19 @@ public void shouldListUsers() throws Exception { assertThat(users.getNextPage(), is(nullValue())); } + @Test(groups = { "warehouse", "isolated_domain" }, dependsOnMethods = "shouldListUsers") + public void shouldAddUserToWarehouse() { + warehouseUser = service.addUserToWarehouse(warehouse, new WarehouseUser(WarehouseUser.ADMIN_ROLE, null, LOGIN)).get(60, TimeUnit.SECONDS); + + assertThat(warehouseUser, is(notNullValue())); + } + + @Test(groups = { "warehouse", "isolated_domain" }, dependsOnMethods = "shouldAddUserToWarehouse") + public void shouldRemoveUserFromWarehouse() { + service.removeUserFromWarehouse(warehouseUser).get(60, TimeUnit.SECONDS); + warehouseUser = null; + } + @Test(dependsOnGroups = "warehouse") public void removeWarehouse() throws Exception { service.removeWarehouse(warehouse); @@ -105,6 +133,19 @@ public void tearDown() throws Exception { service.removeWarehouse(warehouse2); } } catch (Exception ignored) {} + } + @AfterClass(groups = "isolated_domain") + public void tearDownIsolatedDomainGroup() { + try { + if (warehouseUser != null) { + service.removeUserFromWarehouse(warehouseUser); + } + } catch (Exception ignored) {} + try { + if (account != null) { + gd.getAccountService().removeAccount(account); + } + } catch (Exception ignored) {} } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index e7ef9e1d7..401c9c169 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -11,10 +11,10 @@ import org.testng.annotations.Test; import java.io.IOException; +import java.util.Collections; import static com.gooddata.util.ResourceUtils.readFromResource; import static net.jadler.Jadler.onRequest; -import static net.jadler.Jadler.port; import static net.jadler.Jadler.verifyThatRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; @@ -33,6 +33,7 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { 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 REMOVE_USER_TASK_DONE = "/warehouse/removeUserTask-finished.json"; private static final String CONNECTION_URL = "CONNECTION_URL"; @@ -243,4 +244,56 @@ public void shouldFailToAddUserToWarehouse() throws Exception { gd.getWarehouseService().addUserToWarehouse(warehouse, new WarehouseUser("role", "profile", null)).get(); } + @Test + public void shouldRemoveUserFromWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(WAREHOUSE_USER_URI) + .respond() + .withBody(readFromResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(202) + .thenRespond() + .withBody(readFromResource(REMOVE_USER_TASK_DONE)) + .withStatus(201); + + gd.getWarehouseService() + .removeUserFromWarehouse(new WarehouseUser("role", "profile", "login", Collections.singletonMap("self", WAREHOUSE_USER_URI))) + .get(); + } + + @Test(expectedExceptions = WarehouseUserNotFoundException.class) + public void shouldFailToFindUserForRemovalFromWarehouse() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(WAREHOUSE_USER_URI) + .respond() + .withStatus(404); + + gd.getWarehouseService().removeUserFromWarehouse(new WarehouseUser("role", "profile", "login", Collections.singletonMap("self", WAREHOUSE_USER_URI))); + } + + @Test(expectedExceptions = GoodDataException.class) + public void shouldFailWhenRemoveUserTaskFails() throws Exception { + onRequest() + .havingMethodEqualTo("DELETE") + .havingPathEqualTo(WAREHOUSE_USER_URI) + .respond() + .withBody(readFromResource(TASK_POLL)) + .withStatus(202); + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(pollingTask.getPollLink()) + .respond() + .withStatus(409); + + gd.getWarehouseService() + .removeUserFromWarehouse(new WarehouseUser("role", "profile", "login", Collections.singletonMap("self", WAREHOUSE_USER_URI))) + .get(); + } + } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index 2cb76b5d9..15495c854 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -50,4 +50,10 @@ public void testDeserialization() throws Exception { assertThat(user.getUri(), is(SELF_LINK)); assertThat(user.getLinks(), is(LINKS)); } -} \ No newline at end of file + + @Test + public void testGetId() throws Exception { + final WarehouseUser user = new WarehouseUser(ROLE, PROFILE, LOGIN, LINKS); + assertThat(user.getId(), is("{profile-id}")); + } +} diff --git a/src/test/resources/warehouse/removeUserTask-finished.json b/src/test/resources/warehouse/removeUserTask-finished.json new file mode 100644 index 000000000..b48b33b6f --- /dev/null +++ b/src/test/resources/warehouse/removeUserTask-finished.json @@ -0,0 +1,7 @@ +{ + "asyncTask": { + "links": { + "users": "/gdc/datawarehouse/instances/instanceId/users" + } + } +} From 2aa88442d552d5350325f0f2dffa7471c57ca418 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 23 Aug 2016 11:11:55 +0200 Subject: [PATCH 0399/1191] fix: remove junit static import from TotalTest --- src/test/java/com/gooddata/md/report/TotalTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/md/report/TotalTest.java b/src/test/java/com/gooddata/md/report/TotalTest.java index 6a1fc4f23..443e4362d 100644 --- a/src/test/java/com/gooddata/md/report/TotalTest.java +++ b/src/test/java/com/gooddata/md/report/TotalTest.java @@ -6,8 +6,8 @@ import org.testng.annotations.Test; +import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; public class TotalTest { From ecd09ad3d5b8ce2141d4bca9470b45f5c0a27890 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Wed, 24 Aug 2016 10:31:25 +0200 Subject: [PATCH 0400/1191] Refactor getting project uploads info in DatasetService --- .../com/gooddata/dataset/DatasetService.java | 83 ++++++----- .../gooddata/dataset/DatasetUploadsInfo.java | 130 ------------------ .../gooddata/dataset/ProjectUploadsInfo.java | 66 --------- .../com/gooddata/dataset/UploadsInfo.java | 120 ++++++++++++++++ .../gooddata/dataset/DatasetServiceAT.java | 24 +--- .../gooddata/dataset/DatasetServiceIT.java | 31 ++--- .../gooddata/dataset/DatasetServiceTest.java | 71 +++++++--- .../dataset/ProjectUploadsInfoTest.java | 56 -------- .../com/gooddata/dataset/UploadsInfoTest.java | 38 +++++ 9 files changed, 272 insertions(+), 347 deletions(-) delete mode 100644 src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java delete mode 100644 src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java create mode 100644 src/main/java/com/gooddata/dataset/UploadsInfo.java delete mode 100644 src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java create mode 100644 src/test/java/com/gooddata/dataset/UploadsInfoTest.java diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index b64477bbb..d327e1249 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; +import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -326,65 +327,55 @@ public void handlePollException(final GoodDataRestException e) { } /** - * Returns {@link ProjectUploadsInfo} object containing upload information for every single dataset - * in the given project. + * Lists all uploads for the dataset with the given identifier in the given project. Returns empty list if there + * are no uploads for the given dataset. * * @param project GoodData project - * @return information about dataset uploads - */ - public ProjectUploadsInfo getProjectUploadsInfo(Project project) { - notNull(project, "project"); - - try { - return restTemplate.getForObject(ProjectUploadsInfo.URI, ProjectUploadsInfo.class, project.getId()); - } catch (RestClientException e) { - throw new GoodDataException("Unable to get dataset uploads for project '" + project.getId() + "'.", e); - } - } - - /** - * Lists all uploads for the given dataset. Returns empty list if there are no uploads for the given dataset. - * - * @param datasetUploadsInfo {@link DatasetUploadsInfo} object for the given dataset + * @param datasetId dataset identifier * @return collection of {@link Upload} objects or empty list */ - public Collection listUploadsForDataset(DatasetUploadsInfo datasetUploadsInfo) { - notNull(datasetUploadsInfo, "datasetUploadsInfo"); + public Collection listUploadsForDataset(Project project, String datasetId) { + final UploadsInfo.DataSet dataSet = getDataSetInfo(project, datasetId); - if (isEmpty(datasetUploadsInfo.getUploadsUri())) { - throw new GoodDataException("Uploads link for dataset '" + datasetUploadsInfo.getDatasetId() - + "' does not exist."); + if (isEmpty(dataSet.getUploadsUri())) { + return emptyList(); } try { - final Uploads result = restTemplate.getForObject(datasetUploadsInfo.getUploadsUri(), Uploads.class); + final Uploads result = restTemplate.getForObject(dataSet.getUploadsUri(), Uploads.class); if (result == null) { - throw new GoodDataException("empty response from API call"); + throw new GoodDataException("Empty response from '" + dataSet.getUploadsUri() + "'."); } else if (result.items() == null){ return emptyList(); } return result.items(); } catch (RestClientException e) { - throw new GoodDataException("Unable to get uploads for dataset '" + datasetUploadsInfo.getDatasetId() - + "'.", e); + throw new GoodDataException("Unable to get '" + dataSet.getUploadsUri() + "'.", e); } } /** - * Lists all uploads for the dataset with the given identifier in the given project. Returns empty list if there - * are no uploads for the given dataset. + * Returns last upload for the dataset with given identifier in the given project. Returns null if the last upload + * doesn't exist. * - * @param project GD project + * @param project GoodData project * @param datasetId dataset identifier - * @return collection of {@link Upload} objects or empty list + * @return last dataset upload or {@code null} if the upload doesn't exist */ - public Collection listUploadsForDataset(Project project, String datasetId) { - final ProjectUploadsInfo projectUploadsInfo = getProjectUploadsInfo(project); - final DatasetUploadsInfo datasetUploadsInfo = projectUploadsInfo.getDatasetUploadsInfo(datasetId); + public Upload getLastUploadForDataset(Project project, String datasetId) { + final UploadsInfo.DataSet dataSet = getDataSetInfo(project, datasetId); - return listUploadsForDataset(datasetUploadsInfo); + if (isEmpty(dataSet.getLastUploadUri())) { + return null; + } + + try { + return restTemplate.getForObject(dataSet.getLastUploadUri(), Upload.class); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get '" + dataSet.getLastUploadUri() + "'."); + } } /** @@ -402,4 +393,26 @@ public UploadStatistics getUploadStatistics(Project project) { throw new GoodDataException("Unable to get dataset uploads statistics.", e); } } + + /** + * Returns {@link UploadsInfo.DataSet} object containing upload information for the given dataset in the given project. + * + * Package-private for testing purposes. + */ + UploadsInfo.DataSet getDataSetInfo(Project project, String datasetId) { + notNull(project, "project"); + notEmpty(datasetId, "datasetId"); + + final URI uploadsInfoUri = UploadsInfo.URI_TEMPLATE.expand(project.getId()); + try { + final UploadsInfo uploadsInfo = restTemplate.getForObject(uploadsInfoUri, UploadsInfo.class); + if (uploadsInfo == null) { + throw new GoodDataException("Empty response from '" + uploadsInfoUri.toString() + "'."); + } + + return uploadsInfo.getDataSet(datasetId); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get '" + uploadsInfoUri.toString() + "'.", e); + } + } } diff --git a/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java b/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java deleted file mode 100644 index a3c459310..000000000 --- a/src/main/java/com/gooddata/dataset/DatasetUploadsInfo.java +++ /dev/null @@ -1,130 +0,0 @@ -package com.gooddata.dataset; - -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.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.gooddata.md.Meta; -import com.gooddata.util.GDDateTimeDeserializer; -import org.joda.time.DateTime; - -/** - * Contains information about dataset uploads for one dataset in the project. Information contain: - *
    - *
  • dataset ID
  • - *
  • uri to all uploads for the given dataset
  • - *
  • date of the last successful upload
  • - *
  • last upload
  • - *
- * - * Deserialization only. - */ -@JsonIgnoreProperties(ignoreUnknown = true) -public class DatasetUploadsInfo { - - private final Meta meta; - private final String datasetUploadsUri; - private final DateTime lastSuccess; - private final LastUpload lastUpload; - - private DatasetUploadsInfo( - @JsonProperty("meta") Meta meta, - @JsonProperty("dataUploads") String datasetUploadsUri, - @JsonProperty("lastSuccess") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime lastSuccess, - @JsonProperty("lastUpload") LastUpload lastUpload) { - this.meta = meta; - this.datasetUploadsUri = datasetUploadsUri; - this.lastSuccess = lastSuccess; - this.lastUpload = lastUpload; - } - - /** - * @return dataset identifier - */ - public String getDatasetId() { - return meta.getIdentifier(); - } - - /** - * @return dataset's author - */ - public String getDatasetAuthor() { - return meta.getAuthor(); - } - - /** - * @return dataset created date - */ - public DateTime getDatasetCreated() { - return meta.getCreated(); - } - - /** - * @return dataset title - */ - public String getDatasetTitle() { - return meta.getTitle(); - } - - /** - * @return dataset URI link - */ - public String getDatasetUri() { - return meta.getUri(); - } - - /** - * @return dataset's summary - */ - public String getDatasetSummary() { - return meta.getSummary(); - } - - /** - * @return URI for all uploads of this dataset - */ - public String getUploadsUri() { - return datasetUploadsUri; - } - - /** - * @return date of the last successful upload of this dataset - */ - public DateTime getLastSuccess() { - return lastSuccess; - } - - /** - * Returns object containing information about last dataset upload. This upload doesn't contain information - * about upload mode, size of data and date when this upload was processed. If you want to get more information about - * dataset uploads, use {@link DatasetService#listUploadsForDataset(DatasetUploadsInfo)} method. - * - * @return {@link Upload} object - */ - public Upload getLastUpload() { - return lastUpload.upload; - } - - /** - * Wrapper class for the last upload. - * Only for deserialization. For internal use only. - */ - @JsonIgnoreProperties(ignoreUnknown = true) - @JsonTypeName("dataUploadShort") - @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) - private static class LastUpload { - - private final Upload upload; - - private LastUpload( - @JsonProperty("uri") String uri, - @JsonProperty("status") String status, - @JsonProperty("progress") Double progress, - @JsonProperty("msg") String message, - @JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) DateTime date) { - - this.upload = new Upload(message, progress, status, null, uri, date, null, null); - } - } -} diff --git a/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java b/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java deleted file mode 100644 index bab0b8662..000000000 --- a/src/main/java/com/gooddata/dataset/ProjectUploadsInfo.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gooddata.dataset; - -import static com.gooddata.util.Validate.notEmpty; - -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 org.springframework.web.util.UriTemplate; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -/** - * Contains information about dataset uploads for every single dataset in the project. - * For more about dataset uploads information, see {@link DatasetUploadsInfo}. - * Deserialization only. - */ -@JsonTypeName("dataSetsInfo") -@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) -@JsonIgnoreProperties(ignoreUnknown = true) -public class ProjectUploadsInfo { - - 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<>(); - - //for deserialization and testing purposes only - ProjectUploadsInfo(@JsonProperty("sets") Collection datasets) { - if (datasets != null) { - for (DatasetUploadsInfo dataset : datasets) { - this.datasets.put(dataset.getDatasetId(), dataset); - } - } - } - - /** - * Returns dataset uploads information for a dataset with the given ID. - * - * @param datasetId dataset identifier - * @return {@link DatasetUploadsInfo} object - */ - public DatasetUploadsInfo getDatasetUploadsInfo(String datasetId) { - notEmpty(datasetId, "datasetId"); - - if (hasDataset(datasetId)) { - return datasets.get(datasetId); - } else { - throw new DatasetNotFoundException(datasetId); - } - } - - /** - * Returns if dataset with the given identifier exists in the project dataset uploads. - * - * @param datasetId dataset identifier - * @return {@code true} if the dataset exists, {@code false} otherwise - */ - public boolean hasDataset(String datasetId) { - notEmpty(datasetId, "datasetId"); - - return datasets.containsKey(datasetId); - } -} diff --git a/src/main/java/com/gooddata/dataset/UploadsInfo.java b/src/main/java/com/gooddata/dataset/UploadsInfo.java new file mode 100644 index 000000000..ba1823413 --- /dev/null +++ b/src/main/java/com/gooddata/dataset/UploadsInfo.java @@ -0,0 +1,120 @@ +package com.gooddata.dataset; + +import static com.gooddata.util.Validate.notEmpty; + +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.md.Meta; +import org.springframework.web.util.UriTemplate; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * Contains information about dataset uploads for every single dataset in the project. + * For more about dataset uploads information, see {@link DataSet}. + * Deserialization only. Internal use only + */ +@JsonTypeName("dataSetsInfo") +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonIgnoreProperties(ignoreUnknown = true) +class UploadsInfo { + + static final String URI = "/gdc/md/{projectId}/data/sets"; + static final UriTemplate URI_TEMPLATE = new UriTemplate(URI); + + private final Map datasets = new HashMap<>(); + + //for deserialization and testing purposes only + UploadsInfo(@JsonProperty("sets") Collection datasets) { + if (datasets != null) { + for (DataSet dataset : datasets) { + this.datasets.put(dataset.getDatasetId(), dataset); + } + } + } + + /** + * Returns dataset uploads information for a dataset with the given ID. + * + * @param datasetId dataset identifier + * @return {@link DataSet} object + */ + DataSet getDataSet(String datasetId) { + notEmpty(datasetId, "datasetId"); + + final DataSet dataSet = datasets.get(datasetId); + if (dataSet != null) { + return dataSet; + } else { + throw new DatasetNotFoundException(datasetId); + } + } + + /** + * Contains information about dataset uploads for one dataset in the project. Information contain: + *
    + *
  • dataset ID
  • + *
  • uri to all uploads for the given dataset
  • + *
  • last upload
  • + *
+ * + * Deserialization only. + */ + @JsonIgnoreProperties(ignoreUnknown = true) + static class DataSet { + + private final Meta meta; + private final String datasetUploadsUri; + private final LastUpload lastUpload; + + private DataSet( + @JsonProperty("meta") Meta meta, + @JsonProperty("dataUploads") String datasetUploadsUri, + @JsonProperty("lastUpload") LastUpload lastUpload) { + this.meta = meta; + this.datasetUploadsUri = datasetUploadsUri; + this.lastUpload = lastUpload; + } + + /** + * @return dataset identifier + */ + String getDatasetId() { + return meta.getIdentifier(); + } + + /** + * @return URI for all uploads of this dataset + */ + String getUploadsUri() { + return datasetUploadsUri; + } + + /** + * @return {@link Upload} uri of the last upload + */ + String getLastUploadUri() { + return lastUpload.uri; + } + } + + /** + * Wrapper class for the last upload. + * Only for deserialization. For internal use only. + */ + @JsonIgnoreProperties(ignoreUnknown = true) + @JsonTypeName("dataUploadShort") + @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) + private static class LastUpload { + + private final String uri; + + private LastUpload(@JsonProperty("uri") String uri) { + this.uri = uri; + } + } +} diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index 8d0628825..e08af9f64 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -76,32 +76,18 @@ public void loadDatasetBatchFail() throws Exception { } @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) - public void getProjectsUploadsInfo() throws Exception { - final ProjectUploadsInfo projectUploadsInfo = gd.getDatasetService().getProjectUploadsInfo(project); - - assertThat(projectUploadsInfo, notNullValue()); - assertTrue(projectUploadsInfo.hasDataset("dataset.person")); - assertThat(projectUploadsInfo.getDatasetUploadsInfo("dataset.person").getLastUpload(), notNullValue()); - } - - @Test(groups = "dataset", dependsOnMethods = {"getProjectsUploadsInfo"}) public void listUploadsForDataset() throws Exception { - final DatasetService datasetService = gd.getDatasetService(); - - final DatasetUploadsInfo datasetUploadsInfo = - datasetService.getProjectUploadsInfo(project).getDatasetUploadsInfo("dataset.person"); - final Collection uploads = datasetService.listUploadsForDataset(datasetUploadsInfo); + final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.person"); assertThat(uploads, notNullValue()); assertFalse(uploads.isEmpty()); } - @Test(groups = "dataset", dependsOnMethods = {"getProjectsUploadsInfo"}) - public void listUploadsForDatasetId() throws Exception { - final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.person"); + @Test(groups = "dataset", dependsOnMethods = {"loadDataset"}) + public void getLastUploadForDataset() throws Exception { + final Upload lastUpload = gd.getDatasetService().getLastUploadForDataset(project, "dataset.person"); - assertThat(uploads, notNullValue()); - assertFalse(uploads.isEmpty()); + assertThat(lastUpload, notNullValue()); } @Test(groups = "dataset", dependsOnMethods = {"loadDataset", "loadDatasetFail"}) diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index e1e6e3cb1..ce0c7e724 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -255,40 +255,27 @@ public void shouldFailUpdateProjectData() throws IOException { } @Test - public void shouldGetProjectUploadsInfo() { + public void shouldListUploadsForDataset() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/PROJECT_ID/data/sets") .respond() .withStatus(200) .withBody(readFromResource("/dataset/uploads/data-sets.json")); - final ProjectUploadsInfo projectUploadsInfo = gd.getDatasetService().getProjectUploadsInfo(project); - - assertThat(projectUploadsInfo, notNullValue()); - assertTrue(projectUploadsInfo.hasDataset("dataset.campaign")); - } - - @Test - public void shouldListUploadsForDataset() { - final String datasetUploadsUri = "/gdc/md/PROJECT_ID/uploads/DATASET_ID"; - onRequest() - .havingPathEqualTo(datasetUploadsUri) + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/uploads/814") .respond() .withStatus(200) .withBody(readFromResource("/dataset/uploads/uploads.json")); - final DatasetUploadsInfo info = mock(DatasetUploadsInfo.class); - when(info.getUploadsUri()).thenReturn(datasetUploadsUri); - - final Collection uploads = gd.getDatasetService().listUploadsForDataset(info); + final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.campaign"); assertThat(uploads, notNullValue()); assertThat(uploads, hasSize(2)); } @Test - public void shouldListUploadsForDatasetId() throws Exception { + public void shouldGetLastUploadForDataset() throws Exception { onRequest() .havingPathEqualTo("/gdc/md/PROJECT_ID/data/sets") .respond() @@ -296,15 +283,15 @@ public void shouldListUploadsForDatasetId() throws Exception { .withBody(readFromResource("/dataset/uploads/data-sets.json")); onRequest() - .havingPathEqualTo("/gdc/md/PROJECT_ID/data/uploads/814") + .havingPathEqualTo("/gdc/md/PROJECT_ID/data/upload/1076") .respond() .withStatus(200) - .withBody(readFromResource("/dataset/uploads/uploads.json")); + .withBody(readFromResource("/dataset/uploads/upload.json")); - final Collection uploads = gd.getDatasetService().listUploadsForDataset(project, "dataset.campaign"); + final Upload upload = gd.getDatasetService().getLastUploadForDataset(project, "dataset.campaign"); - assertThat(uploads, notNullValue()); - assertThat(uploads, hasSize(2)); + assertThat(upload, notNullValue()); + assertThat(upload.getStatus(), is("OK")); } @Test diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index 64adbb8d3..af51f952f 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -23,6 +23,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; @@ -176,44 +177,71 @@ public void testListDatasetsWithEmptyResponse() throws Exception { } @Test(expectedExceptions = GoodDataException.class) - public void testGetProjectsUploadsInfoWithRestClientError() throws Exception { - when(restTemplate.getForObject(ProjectUploadsInfo.URI, ProjectUploadsInfo.class, PROJECT_ID)) + public void testGetDataSetInfoRestClientError() throws Exception { + when(restTemplate.getForObject(UploadsInfo.URI, UploadsInfo.class, PROJECT_ID)) .thenThrow(new RestClientException("")); - service.getProjectUploadsInfo(project); + service.getDataSetInfo(project, "dataset.id"); } @Test(expectedExceptions = GoodDataException.class) - public void testListUploadsForDatasetWhenMissingUploadsUri() throws Exception { - final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(null); + public void testGetDataSetInfoEmptyResponse() throws Exception { + when(restTemplate.getForObject(UploadsInfo.URI, UploadsInfo.class, PROJECT_ID)).thenReturn(null); + service.getDataSetInfo(project, "dataset.id"); + } + + @Test + public void testListUploadsForDatasetMissingUri() throws Exception { + mockDataSetInfo(); - service.listUploadsForDataset(uploadsInfo); + assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); } @Test(expectedExceptions = GoodDataException.class) - public void testListUploadsForDatasetWhenRestClientError() throws Exception { - final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + public void testListUploadsForDatasetRestClientError() throws Exception { + final UploadsInfo.DataSet dataSetInfo = mockDataSetInfo(); + when(dataSetInfo.getUploadsUri()).thenReturn(DATASET_UPLOADS_URI); when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenThrow(new RestClientException("")); - service.listUploadsForDataset(uploadsInfo); + service.listUploadsForDataset(project, DATASET_ID); } @Test(expectedExceptions = GoodDataException.class) - public void testListUploadsForDatasetWithNoResponse() throws Exception { - final DatasetUploadsInfo uploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + public void testListUploadsForDatasetEmptyResponse() throws Exception { + final UploadsInfo.DataSet dataSetInfo = mockDataSetInfo(); + when(dataSetInfo.getUploadsUri()).thenReturn(DATASET_UPLOADS_URI); when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenReturn(null); - service.listUploadsForDataset(uploadsInfo); + service.listUploadsForDataset(project, DATASET_ID); } @Test - public void testListUploadsForDatasetWithEmptyResponseBody() throws Exception { - final DatasetUploadsInfo datasetUploadsInfo = mockDatasetUploadsInfo(DATASET_UPLOADS_URI); + public void testListUploadsForDatasetEmptyResponseBody() throws Exception { + final UploadsInfo.DataSet dataSetInfo = mockDataSetInfo(); + when(dataSetInfo.getUploadsUri()).thenReturn(DATASET_UPLOADS_URI); when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenReturn(new Uploads(null)); - assertThat(service.listUploadsForDataset(datasetUploadsInfo), Matchers.empty()); + assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); + } + + @Test + public void testGetLastUploadForDatasetMissingUri() throws Exception { + mockDataSetInfo(); + + assertThat(service.getLastUploadForDataset(project, DATASET_ID), nullValue()); + } + + @Test(expectedExceptions = GoodDataException.class) + public void testGetLastUploadForDatasetRestClientError() throws Exception { + final UploadsInfo.DataSet dataSetInfo = mockDataSetInfo(); + final String lastUploadUri = "last/upload/uri"; + when(dataSetInfo.getLastUploadUri()).thenReturn(lastUploadUri); + + when(restTemplate.getForObject(lastUploadUri, Upload.class)).thenThrow(new RestClientException("")); + + service.getLastUploadForDataset(project, DATASET_ID); } @Test(expectedExceptions = GoodDataException.class) @@ -224,10 +252,15 @@ public void testGetUploadStatisticsWhenRestClientError() throws Exception { service.getUploadStatistics(project); } - private DatasetUploadsInfo mockDatasetUploadsInfo(String uploadsUri) { - final DatasetUploadsInfo uploadsInfo = mock(DatasetUploadsInfo.class); - when(uploadsInfo.getUploadsUri()).thenReturn(uploadsUri); + private UploadsInfo.DataSet mockDataSetInfo() { + final UploadsInfo.DataSet dataSetInfo = mock(UploadsInfo.DataSet.class); + when(dataSetInfo.getDatasetId()).thenReturn(DATASET_ID); + + final UploadsInfo uploadsInfo = new UploadsInfo(singletonList(dataSetInfo)); + + when(restTemplate.getForObject(UploadsInfo.URI_TEMPLATE.expand(PROJECT_ID), UploadsInfo.class)) + .thenReturn(uploadsInfo); - return uploadsInfo; + return dataSetInfo; } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java b/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java deleted file mode 100644 index d1d3a919d..000000000 --- a/src/test/java/com/gooddata/dataset/ProjectUploadsInfoTest.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gooddata.dataset; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.closeTo; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; -import static org.testng.Assert.assertTrue; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.testng.annotations.Test; - -import java.io.InputStream; -import java.util.Collections; - -public class ProjectUploadsInfoTest { - - @Test - public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); - final ProjectUploadsInfo projectUploadsInfo = new ObjectMapper().readValue(input, ProjectUploadsInfo.class); - - assertThat(projectUploadsInfo, notNullValue()); - assertTrue(projectUploadsInfo.hasDataset("dataset.campaign"), - "ProjectUploadsInfo must contain dataset with id: 'dataset.campaign'."); - - final DatasetUploadsInfo dataset = projectUploadsInfo.getDatasetUploadsInfo("dataset.campaign"); - - assertThat(dataset, notNullValue()); - - assertThat(dataset.getDatasetId(), is("dataset.campaign")); - assertThat(dataset.getDatasetUri(), is("/gdc/md/PROJECT_ID/obj/814")); - assertThat(dataset.getDatasetTitle(), is("Campaign")); - assertThat(dataset.getDatasetAuthor(), is("/gdc/account/profile/1")); - assertThat(dataset.getDatasetCreated(), is(new DateTime(2010, 11, 23, 10, 37, 54, DateTimeZone.UTC))); - assertThat(dataset.getDatasetSummary(), - is("Information about Medium, Campaign, Keyword, Ad Slot, Source and Referral Path")); - - assertThat(dataset.getUploadsUri(), is("/gdc/md/PROJECT_ID/data/uploads/814")); - assertThat(dataset.getLastSuccess(), is(new DateTime(2011, 9, 12, 13, 36, 27, DateTimeZone.UTC))); - - final Upload lastUpload = dataset.getLastUpload(); - assertThat(lastUpload, notNullValue()); - assertThat(lastUpload.getUri(), is("/gdc/md/PROJECT_ID/data/upload/1076")); - assertThat(lastUpload.getStatus(), is("WARNING")); - assertThat(lastUpload.getProgress(), closeTo(1, 0.0001)); - assertThat(lastUpload.getMessage(), is("1 of 7 parts went with warnings")); - assertThat(lastUpload.getCreatedAt(), is(new DateTime(2011, 10, 4, 10, 35, 5, DateTimeZone.UTC))); - } - - @Test(expectedExceptions = DatasetNotFoundException.class) - public void getDatasetUploadInfoFails() throws Exception { - new ProjectUploadsInfo(Collections.emptyList()).getDatasetUploadsInfo("dataset.non_existing_one"); - } -} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java new file mode 100644 index 000000000..7bc42e95c --- /dev/null +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -0,0 +1,38 @@ +package com.gooddata.dataset; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.closeTo; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.testng.Assert.assertTrue; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.Collections; + +public class UploadsInfoTest { + + @Test + public void shouldDeserialize() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); + final UploadsInfo uploadsInfo = new ObjectMapper().readValue(input, UploadsInfo.class); + + assertThat(uploadsInfo, notNullValue()); + + final UploadsInfo.DataSet dataset = uploadsInfo.getDataSet("dataset.campaign"); + + assertThat(dataset, notNullValue()); + assertThat(dataset.getDatasetId(), is("dataset.campaign")); + assertThat(dataset.getUploadsUri(), is("/gdc/md/PROJECT_ID/data/uploads/814")); + assertThat(dataset.getLastUploadUri(), is("/gdc/md/PROJECT_ID/data/upload/1076")); + } + + @Test(expectedExceptions = DatasetNotFoundException.class) + public void getDatasetUploadInfoFails() throws Exception { + new UploadsInfo(Collections.emptyList()).getDataSet("dataset.non_existing_one"); + } +} \ No newline at end of file From bb0c87af950ccd59c716e08fb8869fd96a5114b9 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 24 Aug 2016 11:25:32 +0200 Subject: [PATCH 0401/1191] [maven-release-plugin] prepare release gooddata-java-1.7.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8cb01ce07..ea0f16e7f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.6.1-SNAPSHOT + 1.7.0 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 02b89cc352d72551386d623d9914e69d5fa07c99 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 24 Aug 2016 11:25:32 +0200 Subject: [PATCH 0402/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ea0f16e7f..5b7b337a8 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 1.7.0 + 1.7.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 0c3827fafa1a90cf6cef6e036bb82397a1d7a5bb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 24 Aug 2016 13:00:41 +0200 Subject: [PATCH 0403/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50cde79a8..5742635e5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 1.6.0 + 1.7.0 ``` From 2339f4636d8b161d82b51b48ec7d46c6a1a09123 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 24 Aug 2016 13:09:02 +0200 Subject: [PATCH 0404/1191] [maven-release-plugin] prepare release gooddata-java-2.0.0-RC.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c0fd2471a..d7f8c4e5c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0.RC-SNAPSHOT + 2.0.0-RC.1 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From dee3d346c1e69db5d08ff598671dbfe21feff690 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 24 Aug 2016 13:09:02 +0200 Subject: [PATCH 0405/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d7f8c4e5c..d6e918624 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0-RC.1 + 2.0.0-RC.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From ba3e35583bbb054c200856c3e08edc786ab1d333 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Aug 2016 15:06:02 +0200 Subject: [PATCH 0406/1191] make MetricElement constructor package private This doesn't break compatibility as this class is new in 2.0 --- src/main/java/com/gooddata/md/report/MetricElement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index 32ee6dbf7..1f2bee5ee 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -25,7 +25,7 @@ public class MetricElement { private final String drillAcrossStepAttributeDisplayFormUri; @JsonCreator - public MetricElement(@JsonProperty("uri") final String uri, + MetricElement(@JsonProperty("uri") final String uri, @JsonProperty("alias") final String alias, @JsonProperty("format") final String format, @JsonProperty("drillAcrossStepAttributeDF") String drillAcrossStepAttributeDisplayFormUri) { From fea22d98a30ceb34df837b8e345d797948edb52e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 29 Aug 2016 16:01:59 +0200 Subject: [PATCH 0407/1191] add: convenient MetricElement constructors --- .../com/gooddata/md/report/MetricElement.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index 1f2bee5ee..ce042aa8f 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -35,16 +35,33 @@ public class MetricElement { this.drillAcrossStepAttributeDisplayFormUri = drillAcrossStepAttributeDisplayFormUri; } + /** + * Creates a new metric element + * @param uri metric uri + * @param alias metric alias + * @deprecated for compatibility with 1.x only, + * use {@link #MetricElement(Metric, String)} or {@link #MetricElement(Metric)} + */ + @Deprecated public MetricElement(String uri, String alias) { this(uri, alias, null, null); } + /** + * Creates new instance using uri of given metric and alias. + * @param metric metric to create element from + * @param alias metric alias + */ + public MetricElement(final Metric metric, final String alias) { + this(notNull(notNull(metric, "metric").getUri(), "uri"), notNull(alias, "alias"), null, null); + } + /** * Creates new instance using uri of given metric and it's title as alias. * @param metric metric to create element from */ public MetricElement(final Metric metric) { - this(notNull(notNull(metric, "metric").getUri(), "uri"), notNull(metric, "metric").getTitle()); + this(metric, notNull(metric, "metric").getTitle()); } public String getUri() { From 3d7729b0a101be90f9d3ef2e6f4f1ec47be3f24c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Mon, 29 Aug 2016 16:33:44 +0200 Subject: [PATCH 0408/1191] Get rid of some deprecated API usage warnings --- .../com/gooddata/dataset/DatasetService.java | 2 +- .../com/gooddata/warehouse/WarehouseService.java | 2 +- .../java/com/gooddata/account/AccountTest.java | 1 + .../dataload/processes/DataloadProcessTest.java | 1 + .../processes/ProcessExecutionTaskTest.java | 1 + .../com/gooddata/dataset/DatasetServiceIT.java | 1 + .../com/gooddata/dataset/DatasetServiceTest.java | 16 ++++++++++------ .../java/com/gooddata/dataset/DatasetTest.java | 1 + .../java/com/gooddata/dataset/DatasetsTest.java | 1 + src/test/java/com/gooddata/gdc/GdcServiceIT.java | 4 +++- src/test/java/com/gooddata/gdc/GdcTest.java | 1 + .../java/com/gooddata/gdc/LinkEntriesTest.java | 1 + .../java/com/gooddata/gdc/RootLinksTest.java | 14 ++++++++++++++ .../gooddata/md/AttributeDisplayFormTest.java | 1 + src/test/java/com/gooddata/md/AttributeTest.java | 1 + src/test/java/com/gooddata/md/DatasetTest.java | 1 + .../java/com/gooddata/md/DisplayFormTest.java | 1 + src/test/java/com/gooddata/md/EntryTest.java | 1 + .../com/gooddata/md/NestedAttributeTest.java | 1 + .../com/gooddata/model/MaqlDdlLinksTest.java | 1 + .../java/com/gooddata/project/ProjectTest.java | 1 + .../gooddata/warehouse/WarehouseServiceIT.java | 4 ++-- .../gooddata/warehouse/WarehouseTaskTest.java | 2 ++ 23 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 4a00b931b..c546e7e2c 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -237,7 +237,7 @@ public Collection listDatasets(Project project) { public Collection listDatasetLinks(final Project project) { notNull(project, "project"); try { - final Datasets result = restTemplate.getForObject(Datasets.URI, Datasets.class, project.getId()); + final DatasetLinks result = restTemplate.getForObject(DatasetLinks.URI, DatasetLinks.class, project.getId()); if (result == null) { throw new GoodDataException("Empty response from API call"); } else if (result.getLinks() == null) { diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 2de495c14..19d01d828 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -261,7 +261,7 @@ public FutureResult removeUserFromWarehouse(final WarehouseUser user) { return new PollResult<>(this, new AbstractPollHandler - (task.getPollLink(), WarehouseTask.class, Void.class) { + (task.getPollUri(), WarehouseTask.class, Void.class) { @Override public boolean isFinished(ClientHttpResponse response) throws IOException { diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index a5b1893c9..9a888b54e 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -14,6 +14,7 @@ public class AccountTest { private static final String FIRST_NAME = "Blah"; private static final String LAST_NAME = "Muhehe"; + @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { final Account account = new ObjectMapper() diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 7132ff308..3a3745c75 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -12,6 +12,7 @@ public class DataloadProcessTest { + @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { final DataloadProcess process = new ObjectMapper() diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index 3e36044e1..77c128ca2 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -8,6 +8,7 @@ public class ProcessExecutionTaskTest { + @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { final ProcessExecutionTask task = new ObjectMapper() diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index b9f30258a..8d916e986 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -135,6 +135,7 @@ public void shouldGetDatasetManifest() throws Exception { assertThat(manifest, is(notNullValue())); } + @SuppressWarnings("deprecation") @Test public void shouldListDatasets() throws Exception { onRequest() diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index aa669a443..790ce1e8d 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -150,27 +150,31 @@ public void testLoadDatasetByIdWithNullInputStream() throws Exception { service.loadDataset(project, DATASET_ID, null); } + @SuppressWarnings("deprecation") @Test(expectedExceptions = IllegalArgumentException.class) public void testListDatasetsWithNullProject() throws Exception { service.listDatasets(null); } + @SuppressWarnings("deprecation") @Test(expectedExceptions = GoodDataException.class) public void testListDatasetsWithNullResponse() throws Exception { when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenReturn(null); service.listDatasets(project); } + @SuppressWarnings("deprecation") @Test(expectedExceptions = GoodDataException.class) public void testListDatasetsWithRestClientError() throws Exception { when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenThrow(new RestClientException("")); service.listDatasets(project); } + @SuppressWarnings("deprecation") @Test public void testListDatasetsWithEmptyResponse() throws Exception { - final Datasets datasets = mock(Datasets.class); - when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); + final DatasetLinks datasets = mock(DatasetLinks.class); + when(restTemplate.getForObject(DatasetLinks.URI, DatasetLinks.class, PROJECT_ID)).thenReturn(datasets); when(datasets.getLinks()).thenReturn(singletonList(datasetLink)); when(datasetLink.getIdentifier()).thenReturn("ID"); @@ -188,20 +192,20 @@ public void testListDatasetLinksWithNullProject() throws Exception { @Test(expectedExceptions = GoodDataException.class) public void testListDatasetLinksWithNullResponse() throws Exception { - when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenReturn(null); + when(restTemplate.getForObject(DatasetLinks.URI, Link.class, PROJECT_ID)).thenReturn(null); service.listDatasetLinks(project); } @Test(expectedExceptions = GoodDataException.class) public void testListDatasetLinksWithRestClientError() throws Exception { - when(restTemplate.getForObject(Datasets.URI, Link.class, PROJECT_ID)).thenThrow(new RestClientException("")); + when(restTemplate.getForObject(DatasetLinks.URI, Link.class, PROJECT_ID)).thenThrow(new RestClientException("")); service.listDatasetLinks(project); } @Test public void testListDatasetLinksWithEmptyResponse() throws Exception { - final Datasets datasets = mock(Datasets.class); - when(restTemplate.getForObject(Datasets.URI, Datasets.class, PROJECT_ID)).thenReturn(datasets); + final DatasetLinks datasets = mock(DatasetLinks.class); + when(restTemplate.getForObject(DatasetLinks.URI, DatasetLinks.class, PROJECT_ID)).thenReturn(datasets); when(datasets.getLinks()).thenReturn(singletonList(datasetLink)); final Collection result = service.listDatasetLinks(project); diff --git a/src/test/java/com/gooddata/dataset/DatasetTest.java b/src/test/java/com/gooddata/dataset/DatasetTest.java index 9763bff61..cc6ea375e 100644 --- a/src/test/java/com/gooddata/dataset/DatasetTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetTest.java @@ -16,6 +16,7 @@ public class DatasetTest { + @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataset/dataset.json"); diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index 2a53d9d6d..a534d2589 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -14,6 +14,7 @@ public class DatasetsTest { + @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index 655c208d6..bb3b3893a 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -12,6 +12,7 @@ public class GdcServiceIT extends AbstractGoodDataIT { + @SuppressWarnings("deprecation") @Test public void shouldReturnGdc() throws Exception { onRequest() @@ -26,6 +27,7 @@ public void shouldReturnGdc() throws Exception { assertThat(gdc.getUserStagingUri(), is("/uploads")); } + @SuppressWarnings("deprecation") @Test public void shouldUseProperVersionHeader() throws Exception { onRequest() @@ -51,7 +53,7 @@ public void shouldReturnRootLinks() throws Exception { final RootLinks rootLinks = gd.getGdcService().getRootLinks(); assertThat(rootLinks, is(notNullValue())); - assertThat(rootLinks.getUserStagingLink(), is("/uploads")); + assertThat(rootLinks.getUserStagingUri(), is("/uploads")); } @Test diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 7178f56df..8f483fdd1 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -11,6 +11,7 @@ public class GdcTest { + @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index b831793b9..7bdf95b53 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -15,6 +15,7 @@ public class LinkEntriesTest { + @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/gdc/linkEntries.json"); diff --git a/src/test/java/com/gooddata/gdc/RootLinksTest.java b/src/test/java/com/gooddata/gdc/RootLinksTest.java index 59ec65d9b..5caa6c1a2 100644 --- a/src/test/java/com/gooddata/gdc/RootLinksTest.java +++ b/src/test/java/com/gooddata/gdc/RootLinksTest.java @@ -14,6 +14,7 @@ public class RootLinksTest { + @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); @@ -21,17 +22,30 @@ public void deserialize() throws Exception { assertThat(rootLinks, is(notNullValue())); assertThat(rootLinks.getHomeLink(), is("/gdc/")); + assertThat(rootLinks.getHomeUri(), is("/gdc/")); assertThat(rootLinks.getTokenLink(), is("/gdc/account/token")); + assertThat(rootLinks.getTokenUri(), is("/gdc/account/token")); assertThat(rootLinks.getLoginLink(), is("/gdc/account/login")); + assertThat(rootLinks.getLoginUri(), is("/gdc/account/login")); assertThat(rootLinks.getMetadataLink(), is("/gdc/md")); + assertThat(rootLinks.getMetadataUri(), is("/gdc/md")); assertThat(rootLinks.getXTabLink(), is("/gdc/xtab2")); + assertThat(rootLinks.getXTabUri(), is("/gdc/xtab2")); assertThat(rootLinks.getAvailableElementsLink(), is("/gdc/availableelements")); + assertThat(rootLinks.getAvailableElementsUri(), is("/gdc/availableelements")); assertThat(rootLinks.getReportExporterLink(), is("/gdc/exporter")); + assertThat(rootLinks.getReportExporterUri(), is("/gdc/exporter")); assertThat(rootLinks.getAccountLink(), is("/gdc/account")); + assertThat(rootLinks.getAccountUri(), is("/gdc/account")); assertThat(rootLinks.getProjectsLink(), is("/gdc/projects")); + assertThat(rootLinks.getProjectsUri(), is("/gdc/projects")); assertThat(rootLinks.getToolLink(), is("/gdc/tool")); + assertThat(rootLinks.getToolUri(), is("/gdc/tool")); assertThat(rootLinks.getTemplatesLink(), is("/gdc/templates")); + assertThat(rootLinks.getTemplatesUri(), is("/gdc/templates")); assertThat(rootLinks.getReleaseInfoLink(), is("/gdc/releaseInfo")); + assertThat(rootLinks.getReleaseInfoUri(), is("/gdc/releaseInfo")); assertThat(rootLinks.getUserStagingLink(), is("/uploads")); + assertThat(rootLinks.getUserStagingUri(), is("/uploads")); } } \ 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 eeaf26b6b..a7d412039 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -20,6 +20,7 @@ public class AttributeDisplayFormTest { private static final String TYPE = "TYPE"; private static final String ELEMENTS_LINK = "/gdc/md/PROJECT_ID/obj/DF_ID/elements"; + @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/attributeDisplayForm.json"); diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index f83696990..ae7bf8dce 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -20,6 +20,7 @@ public class AttributeTest { public static final String TITLE = "Person ID"; + @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/attribute.json"); diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index 4a685d245..e8a9b8aff 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -19,6 +19,7 @@ public class DatasetTest { + @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/dataset.json"); diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index aedae527f..78b96c0a1 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -21,6 +21,7 @@ public class DisplayFormTest { public static final String LDM_EXPRESSION = ""; private static final String ELEMENTS_LINK = "/gdc/md/PROJECT_ID/obj/DF_ID/elements"; + @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { final InputStream stream = getClass().getResourceAsStream("/md/displayForm.json"); diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 792b462dc..15483c500 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -33,6 +33,7 @@ public class EntryTest { public static final boolean LOCKED = true; public static final boolean UNLISTED = false; + @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { final Entry entry = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/entry.json"), Entry.class); diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index 9276e2edb..a2358062f 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -16,6 +16,7 @@ public class NestedAttributeTest { + @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { final NestedAttribute attribute = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/dimensionAttribute.json"), NestedAttribute.class); diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index b4d2fb3eb..e30f757d9 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -14,6 +14,7 @@ public class MaqlDdlLinksTest { + @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/model/maqlDdlLinks.json"); diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index a22664932..621d6dd59 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -12,6 +12,7 @@ public class ProjectTest { + @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { final Project project = new ObjectMapper() diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index b6898d521..94be7eef5 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -254,7 +254,7 @@ public void shouldRemoveUserFromWarehouse() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(202) .thenRespond() @@ -287,7 +287,7 @@ public void shouldFailWhenRemoveUserTaskFails() throws Exception { .withStatus(202); onRequest() .havingMethodEqualTo("GET") - .havingPathEqualTo(pollingTask.getPollLink()) + .havingPathEqualTo(pollingTask.getPollUri()) .respond() .withStatus(409); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 6c1a40d10..d766aebad 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -10,6 +10,7 @@ public class WarehouseTaskTest { + @SuppressWarnings("deprecation") @Test public void testDeserializePoll() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-poll.json"); @@ -17,6 +18,7 @@ public void testDeserializePoll() throws Exception { assertThat(warehouseTask.getPollUri(), is("/gdc/datawarehouse/executions/executionId")); } + @SuppressWarnings("deprecation") @Test public void testDeserializeInstance() throws Exception { final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-finished.json"); From 292d1445eba3cae77a3060db2612667ef2d6f9c6 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 31 Aug 2016 13:40:19 +0200 Subject: [PATCH 0409/1191] switch build to java 8 --- .travis.yml | 1 - pom.xml | 2 +- .../java/com/gooddata/md/MetadataServiceTest.java | 11 ++++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3f65c6ac0..1a21b9291 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: java install: true script: mvn verify javadoc:javadoc coveralls:report -Pcoverage jdk: - - openjdk7 - oraclejdk8 branches: only: diff --git a/pom.xml b/pom.xml index d6e918624..dbeb647e4 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 1.7 + 1.8 UTF-8 UTF-8 4.3.3 diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index 08af25241..b1bc9fc9d 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -96,7 +96,8 @@ public void testUpdateObj() throws Exception { final Updatable resultObj = mock(Updatable.class); when(obj.getUri()).thenReturn(URI); - when(restTemplate.getForObject(URI, obj.getClass())).thenReturn(resultObj); + final Updatable forObject = restTemplate.getForObject(URI, obj.getClass()); + when(forObject).thenReturn(resultObj); final Obj result = service.updateObj(obj); @@ -149,9 +150,9 @@ public void testGetObjByUriNotFound() throws Exception { @Test public void testGetObjByUri() throws Exception { final Obj resultObj = mock(Obj.class); - when(restTemplate.getForObject(URI, resultObj.getClass())).thenReturn(resultObj); + when(restTemplate.getForObject(URI, Obj.class)).thenReturn(resultObj); - final Obj result = service.getObjByUri(URI, resultObj.getClass()); + final Obj result = service.getObjByUri(URI, Obj.class); assertThat(result, is(resultObj)); } @@ -191,9 +192,9 @@ public void testGetObjByIdNullCls() throws Exception { public void testGetObjById() throws Exception { final Obj resultObj = mock(Obj.class); final String uri = format("/gdc/md/%s/obj/%s", PROJECT_ID, ID); - when(restTemplate.getForObject(uri, resultObj.getClass())).thenReturn(resultObj); + when(restTemplate.getForObject(uri, Obj.class)).thenReturn(resultObj); - final Obj result = service.getObjById(project, ID, resultObj.getClass()); + final Obj result = service.getObjById(project, ID, Obj.class); assertThat(result, is(resultObj)); } From 03ec29e7e9d838796f397a87d91d54685d5f1ddf Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 1 Sep 2016 10:22:52 +0200 Subject: [PATCH 0410/1191] fix: AttributeInGrid has always alias set Also deprecate the constructor without alias, since empty String is not very useful value for alias. --- src/main/java/com/gooddata/md/report/AttributeInGrid.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 92d1df5c9..e728125ab 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -44,11 +44,13 @@ public class AttributeInGrid implements GridElement { } /** - * Creates new instance. + * Creates new instance from given uri with empty alias * @param uri uri of displayForm of attribute to be in grid + * @deprecated because empty alias does not make much sense */ + @Deprecated public AttributeInGrid(String uri) { - this(uri, null); + this(uri, ""); } /** From 18ae3a14690790ee6c306ad445f79ce4b560967f Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 2 Sep 2016 07:37:00 +0200 Subject: [PATCH 0411/1191] adjust README (JDK 8 and correct RC version) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2b699d91e..e21fe0012 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.0.0.RC + 2.0.0-RC.1 ``` @@ -30,7 +30,7 @@ The *GoodData Java SDK* uses: * the *Apache HTTP Client* version 4.3 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 7 or later +* the *Java Development Kit (JDK)* version 8 or later ## License The *GoodData Java SDK* is free and open-source software under [BSD License](LICENSE.txt). From 91853eb142e93721fd77904f04dc8da297b36010 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 5 Sep 2016 16:26:02 +0200 Subject: [PATCH 0412/1191] use Attribute's title as alias in grid when creating AttributeInGrid from Attribute additionally add constructor with explicit alias to be used --- .../gooddata/md/report/AttributeInGrid.java | 22 +++++++++++++++++-- .../md/report/AttributeInGridTest.java | 13 +++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index e728125ab..7167aed2b 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -90,11 +90,29 @@ public AttributeInGrid(final DisplayForm displayForm) { } /** - * Creates new AttributeInGrid using given Attribute's default DisplayForm's uri and it's title as alias. + * Creates new AttributeInGrid using given DisplayForm's uri and given alias. + * @param displayForm displayForm to create AttributeInGrid from + * @param alias alias used to label the attribute + */ + public AttributeInGrid(final DisplayForm displayForm, final String alias) { + this(notNull(notNull(displayForm, "displayForm").getUri(), "uri"), alias); + } + + /** + * Creates new AttributeInGrid using given Attribute's default DisplayForm's uri and Attribute's title as alias. * @param attribute attribute to create AttributeInGrid from */ public AttributeInGrid(final Attribute attribute) { - this(notNull(attribute, "attribute").getDefaultDisplayForm()); + this(notNull(attribute, "attribute").getDefaultDisplayForm(), notNull(attribute, "attribute").getTitle()); + } + + /** + * Creates new AttributeInGrid using given Attribute's default DisplayForm's uri and given alias. + * @param attribute attribute to create AttributeInGrid from + * @param alias alias used to label the attribute + */ + public AttributeInGrid(final Attribute attribute, final String alias) { + this(notNull(attribute, "attribute").getDefaultDisplayForm(), alias); } @JsonProperty("totals") diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 110e82f05..f29f60846 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -27,6 +27,7 @@ public class AttributeInGridTest { private static final String URI = "/URI"; private static final String ALIAS = "ALIAS"; + private static final String ATTR_TITLE = "attrTitle"; @Test public void testDeserialization() throws Exception { @@ -61,11 +62,23 @@ public void testCreateFromAttribute() throws Exception { final Attribute attr = mock(Attribute.class); final DisplayForm displayForm = mock(DisplayForm.class); when(attr.getDefaultDisplayForm()).thenReturn(displayForm); + when(attr.getTitle()).thenReturn(ATTR_TITLE); when(displayForm.getUri()).thenReturn(URI); when(displayForm.getTitle()).thenReturn(ALIAS); final AttributeInGrid attrInGrid = new AttributeInGrid(attr); assertThat(attrInGrid.getUri(), is(URI)); + assertThat(attrInGrid.getAlias(), is(ATTR_TITLE)); + } + + @Test + public void testCreateFromDisplayForm() throws Exception { + final DisplayForm displayForm = mock(DisplayForm.class); + when(displayForm.getUri()).thenReturn(URI); + when(displayForm.getTitle()).thenReturn(ALIAS); + + final AttributeInGrid attrInGrid = new AttributeInGrid(displayForm); + assertThat(attrInGrid.getUri(), is(URI)); assertThat(attrInGrid.getAlias(), is(ALIAS)); } } \ No newline at end of file From 97fea660226558bc213c975fb601b2798caba229 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 5 Sep 2016 16:26:48 +0200 Subject: [PATCH 0413/1191] fix AttributeInGrid's import and remove redundant generics --- src/main/java/com/gooddata/md/report/AttributeInGrid.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 7167aed2b..635cb9e84 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -14,13 +14,9 @@ import com.gooddata.md.DisplayForm; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.LinkedList; import java.util.List; import static com.gooddata.util.Validate.notNull; -import static java.util.Arrays.asList; /** * Attribute in Grid @@ -59,7 +55,7 @@ public AttributeInGrid(String uri) { * @param alias alias used to label the attribute */ public AttributeInGrid(String uri, String alias) { - this(uri, new ArrayList>(), alias); + this(uri, new ArrayList<>(), alias); } /** From 8b0111d341ca9281e0601ad58db2377262395b4a Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 6 Sep 2016 09:20:40 +0200 Subject: [PATCH 0414/1191] add SuppressWarnings unchecked instead of SafeVarargs to usedBy methods SafeVarargs implies final methods, however that would prevent mocking of such methods --- src/main/java/com/gooddata/md/MetadataService.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 3b94ecc02..db5f46b39 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -300,8 +300,8 @@ public Collection findUris(Project project, * 'table'...) * @return objects using given objects. */ - @SafeVarargs - public final Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { + @SuppressWarnings("unchecked") + public Collection usedBy(Project project, Obj obj, boolean nearest, Class... types) { notNull(obj, "obj"); return usedBy(project, obj.getUri(), nearest, types); } @@ -316,8 +316,8 @@ public final Collection usedBy(Project project, Obj obj, boolean nearest, * @return objects using given objects. * @see #usedBy(Project, Collection, boolean, Class[]) */ - @SafeVarargs - public final Collection usedBy(Project project, String uri, boolean nearest, Class... types) { + @SuppressWarnings("unchecked") + public Collection usedBy(Project project, String uri, boolean nearest, Class... types) { notNull(uri, "uri"); notNull(project, "project"); @@ -335,8 +335,8 @@ public final Collection usedBy(Project project, String uri, boolean neare * @return objects usages * @see #usedBy(Project, String, boolean, Class[]) */ - @SafeVarargs - public final Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { + @SuppressWarnings("unchecked") + public Collection usedBy(Project project, Collection uris, boolean nearest, Class... types) { notNull(uris, "uris"); notNull(project, "project"); From 2b6dbe3aee3da438f8eaab3b6b7bf43d9a4d752d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 9 Sep 2016 09:11:46 +0200 Subject: [PATCH 0415/1191] [maven-release-plugin] prepare release gooddata-java-2.0.0-RC.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index dbeb647e4..83f3de0f9 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0-RC.2-SNAPSHOT + 2.0.0-RC.2 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From a91195ff96e17fe01bf35951dda84e1d3559034c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 9 Sep 2016 09:11:46 +0200 Subject: [PATCH 0416/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 83f3de0f9..7d0f8243e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0-RC.2 + 2.0.0-RC.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 0f27677424638aca00b226acdf2f9cc64f7d78f2 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 9 Sep 2016 13:07:12 +0200 Subject: [PATCH 0417/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e21fe0012..a781fd94f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from com.gooddata gooddata-java - 2.0.0-RC.1 + 2.0.0-RC.2 ``` From dfb50275517cd671bc529f035dc1580a57f6ae60 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 12 Sep 2016 12:26:11 +0200 Subject: [PATCH 0418/1191] add: license plugin and missing licenses --- pom.xml | 29 +++++++++++++++++++ .../java/com/gooddata/GoodDataSettings.java | 3 ++ .../java/com/gooddata/SimplePollHandler.java | 3 ++ .../account/AccountNotFoundException.java | 3 ++ .../java/com/gooddata/collections/Page.java | 3 ++ .../com/gooddata/collections/PageRequest.java | 3 ++ .../gooddata/collections/PageableList.java | 3 ++ .../collections/PageableListDeserializer.java | 3 ++ .../java/com/gooddata/collections/Paging.java | 3 ++ .../com/gooddata/collections/UriPage.java | 3 ++ .../connector/ConnectorException.java | 3 ++ .../IntegrationNotFoundException.java | 3 ++ .../java/com/gooddata/connector/Status.java | 3 ++ .../dataload/processes/DataloadProcess.java | 3 ++ .../dataload/processes/ProcessExecution.java | 3 ++ .../processes/ProcessExecutionDetail.java | 3 ++ .../processes/ProcessExecutionException.java | 3 ++ .../processes/ProcessExecutionTask.java | 3 ++ .../processes/ProcessNotFoundException.java | 3 ++ .../dataload/processes/ProcessService.java | 3 ++ .../dataload/processes/ProcessType.java | 3 ++ .../gooddata/dataload/processes/Schedule.java | 3 ++ .../processes/ScheduleNotFoundException.java | 3 ++ .../dataload/processes/ScheduleState.java | 3 ++ .../processes/SchedulesDeserializer.java | 3 ++ .../java/com/gooddata/dataset/Dataset.java | 3 ++ .../java/com/gooddata/dataset/EtlMode.java | 3 ++ .../com/gooddata/dataset/EtlModeType.java | 3 ++ .../java/com/gooddata/dataset/LookupMode.java | 3 ++ .../java/com/gooddata/dataset/Upload.java | 3 ++ .../java/com/gooddata/dataset/UploadMode.java | 3 ++ .../gooddata/dataset/UploadStatistics.java | 3 ++ .../java/com/gooddata/dataset/Uploads.java | 3 ++ .../com/gooddata/dataset/UploadsInfo.java | 3 ++ .../com/gooddata/gdc/DataStoreException.java | 3 ++ .../java/com/gooddata/gdc/ErrorStructure.java | 3 ++ .../java/com/gooddata/gdc/TaskStatus.java | 3 ++ .../com/gooddata/md/AttributeDisplayForm.java | 3 ++ src/main/java/com/gooddata/md/Entry.java | 3 ++ .../com/gooddata/md/IdentifierAndUri.java | 3 ++ .../java/com/gooddata/md/IdentifierToUri.java | 3 ++ .../com/gooddata/md/IdentifiersAndUris.java | 3 ++ src/main/java/com/gooddata/md/InUseMany.java | 3 ++ src/main/java/com/gooddata/md/Key.java | 3 ++ .../gooddata/md/NonUniqueObjException.java | 3 ++ src/main/java/com/gooddata/md/Obj.java | 3 ++ .../com/gooddata/md/ObjCreateException.java | 3 ++ .../com/gooddata/md/ObjNotFoundException.java | 3 ++ .../com/gooddata/md/ObjUpdateException.java | 3 ++ .../com/gooddata/md/ProjectDashboard.java | 3 ++ src/main/java/com/gooddata/md/Query.java | 3 ++ src/main/java/com/gooddata/md/Queryable.java | 3 ++ .../java/com/gooddata/md/Restriction.java | 3 ++ src/main/java/com/gooddata/md/Updatable.java | 3 ++ src/main/java/com/gooddata/md/Usage.java | 3 ++ src/main/java/com/gooddata/md/UseMany.java | 3 ++ .../java/com/gooddata/md/UseManyEntries.java | 3 ++ .../md/maintenance/ExportImportException.java | 3 ++ .../md/maintenance/PartialMdArtifact.java | 3 ++ .../md/maintenance/PartialMdExport.java | 3 ++ .../md/maintenance/PartialMdExportToken.java | 3 ++ .../java/com/gooddata/md/report/Filter.java | 3 ++ .../com/gooddata/project/Environment.java | 3 ++ .../gooddata/project/ProjectEnvironment.java | 3 ++ .../project/ProjectNotFoundException.java | 3 ++ .../project/ProjectValidationResult.java | 3 ++ ...ProjectValidationResultGdcTimeElParam.java | 3 ++ .../project/ProjectValidationResultItem.java | 3 ++ .../ProjectValidationResultObjectParam.java | 3 ++ .../project/ProjectValidationResultParam.java | 3 ++ .../ProjectValidationResultSliElParam.java | 3 ++ .../ProjectValidationResultStringParam.java | 3 ++ .../project/ProjectValidationResults.java | 3 ++ .../project/ProjectValidationType.java | 3 ++ .../gooddata/project/ProjectValidations.java | 3 ++ src/main/java/com/gooddata/project/Role.java | 3 ++ .../project/RoleNotFoundException.java | 3 ++ src/main/java/com/gooddata/project/Roles.java | 3 ++ src/main/java/com/gooddata/project/User.java | 3 ++ .../gooddata/project/UsersDeserializer.java | 3 ++ .../gooddata/report/ExecuteDefinition.java | 3 ++ .../com/gooddata/report/ExecuteReport.java | 3 ++ .../report/NoDataReportException.java | 3 ++ .../com/gooddata/report/ReportException.java | 3 ++ .../gooddata/report/ReportExportFormat.java | 3 ++ .../gooddata/util/BooleanDeserializer.java | 3 ++ .../util/BooleanIntegerSerializer.java | 3 ++ .../util/BooleanStringSerializer.java | 3 ++ .../gooddata/util/GDDateTimeDeserializer.java | 3 ++ .../gooddata/util/GDDateTimeSerializer.java | 3 ++ .../util/ISODateTimeDeserializer.java | 3 ++ .../gooddata/util/ISODateTimeSerializer.java | 3 ++ .../com/gooddata/util/TagsDeserializer.java | 3 ++ src/main/java/com/gooddata/util/Validate.java | 3 ++ .../java/com/gooddata/util/ZipHelper.java | 3 ++ .../com/gooddata/warehouse/Warehouse.java | 3 ++ .../warehouse/WarehouseNotFoundException.java | 3 ++ .../gooddata/warehouse/WarehouseService.java | 3 ++ .../com/gooddata/warehouse/WarehouseTask.java | 3 ++ .../com/gooddata/warehouse/WarehouseUser.java | 3 ++ .../WarehouseUserNotFoundException.java | 3 ++ .../gooddata/warehouse/WarehouseUsers.java | 3 ++ .../com/gooddata/warehouse/Warehouses.java | 3 ++ .../java/com/gooddata/AbstractGoodDataAT.java | 3 ++ .../com/gooddata/AbstractServiceTest.java | 3 ++ .../gooddata/GoodDataRestExceptionTest.java | 3 ++ .../com/gooddata/GoodDataSettingsTest.java | 3 ++ src/test/java/com/gooddata/JsonMatchers.java | 3 ++ .../gooddata/account/AccountServiceAT.java | 3 ++ .../com/gooddata/account/AccountTest.java | 3 ++ .../gooddata/collections/PageRequestTest.java | 3 ++ .../collections/PageableListTest.java | 3 ++ .../com/gooddata/collections/PagingTest.java | 3 ++ .../com/gooddata/collections/UriPageTest.java | 3 ++ .../connector/ConnectorServiceIT.java | 3 ++ .../gooddata/connector/IntegrationTest.java | 3 ++ .../gooddata/connector/ProcessStatusTest.java | 3 ++ .../processes/DataloadProcessTest.java | 3 ++ .../processes/ProcessExecutionDetailTest.java | 3 ++ .../processes/ProcessExecutionTaskTest.java | 3 ++ .../processes/ProcessExecutionTest.java | 3 ++ .../dataload/processes/ProcessIdMatcher.java | 3 ++ .../dataload/processes/ProcessServiceAT.java | 3 ++ .../dataload/processes/ProcessServiceIT.java | 3 ++ .../dataload/processes/ScheduleTest.java | 3 ++ .../dataload/processes/SchedulesTest.java | 3 ++ .../gooddata/dataset/DatasetServiceAT.java | 3 ++ .../gooddata/dataset/DatasetServiceIT.java | 3 ++ .../com/gooddata/dataset/DatasetsTest.java | 3 ++ .../com/gooddata/dataset/PullTaskTest.java | 3 ++ .../java/com/gooddata/dataset/PullTest.java | 3 ++ .../dataset/UploadStatisticsTest.java | 3 ++ .../java/com/gooddata/dataset/UploadTest.java | 3 ++ .../com/gooddata/dataset/UploadsInfoTest.java | 3 ++ .../com/gooddata/dataset/UploadsTest.java | 3 ++ .../com/gooddata/gdc/DataStoreServiceIT.java | 3 ++ .../com/gooddata/gdc/DatastoreServiceAT.java | 3 ++ .../com/gooddata/gdc/ErrorStructureTest.java | 3 ++ .../java/com/gooddata/gdc/GdcServiceIT.java | 3 ++ src/test/java/com/gooddata/gdc/GdcTest.java | 3 ++ .../java/com/gooddata/gdc/TaskStatusTest.java | 3 ++ .../gooddata/md/AttributeDisplayFormTest.java | 3 ++ .../com/gooddata/md/MetadataServiceAT.java | 3 ++ .../com/gooddata/md/ProjectDashboardTest.java | 3 ++ .../md/maintenance/PartialMdArtifactTest.java | 3 ++ .../md/maintenance/PartialMdExportTest.java | 3 ++ .../maintenance/PartialMdExportTokenTest.java | 3 ++ .../gooddata/md/report/ReportServiceAT.java | 3 ++ .../com/gooddata/model/ModelServiceAT.java | 3 ++ .../com/gooddata/model/ModelServiceIT.java | 3 ++ .../gooddata/project/ProjectIdMatcher.java | 3 ++ .../gooddata/project/ProjectServiceAT.java | 3 ++ .../gooddata/project/ProjectServiceIT.java | 3 ++ .../com/gooddata/project/ProjectTest.java | 3 ++ .../ProjectValidationResultItemTest.java | 3 ++ .../ProjectValidationResultParamTest.java | 3 ++ ...ProjectValidationResultSliElParamTest.java | 3 ++ .../project/ProjectValidationResultTest.java | 3 ++ .../project/ProjectValidationResultsTest.java | 3 ++ .../project/ProjectValidationTypeTest.java | 3 ++ .../project/ProjectValidationsTest.java | 3 ++ .../java/com/gooddata/project/RoleTest.java | 3 ++ .../java/com/gooddata/project/RolesTest.java | 3 ++ .../java/com/gooddata/project/UserTest.java | 3 ++ .../java/com/gooddata/project/UsersTest.java | 3 ++ .../com/gooddata/report/ReportServiceIT.java | 3 ++ .../util/BooleanDeserializerTest.java | 3 ++ .../gooddata/util/BooleanIntegerClass.java | 3 ++ .../util/BooleanIntegerSerializerTest.java | 3 ++ .../com/gooddata/util/BooleanStringClass.java | 3 ++ .../util/BooleanStringSerializerTest.java | 3 ++ .../java/com/gooddata/util/GDDateClass.java | 3 ++ .../gooddata/util/GDDateDeserializerTest.java | 3 ++ .../gooddata/util/GDDateSerializerTest.java | 3 ++ .../com/gooddata/util/GDDateTimeClass.java | 3 ++ .../util/GDDateTimeDeserializerTest.java | 3 ++ .../util/GDDateTimeSerializerTest.java | 3 ++ .../java/com/gooddata/util/ISODateClass.java | 3 ++ .../util/ISODateTimeDeserializerTest.java | 3 ++ .../util/ISODateTimeSerializerTest.java | 3 ++ .../gooddata/util/TagsDeserializerTest.java | 3 ++ .../java/com/gooddata/util/ZipHelperTest.java | 3 ++ .../warehouse/WarehouseIdMatcher.java | 3 ++ .../warehouse/WarehouseServiceAT.java | 3 ++ .../warehouse/WarehouseServiceIT.java | 3 ++ .../gooddata/warehouse/WarehouseTaskTest.java | 3 ++ .../com/gooddata/warehouse/WarehouseTest.java | 3 ++ .../gooddata/warehouse/WarehouseUserTest.java | 3 ++ .../warehouse/WarehouseUsersTest.java | 3 ++ .../gooddata/warehouse/WarehousesTest.java | 3 ++ 190 files changed, 596 insertions(+) diff --git a/pom.xml b/pom.xml index 7d0f8243e..1cc61db08 100644 --- a/pom.xml +++ b/pom.xml @@ -47,6 +47,8 @@ 4.3.1.RELEASE 1.1.1 1.5.3 + yyyy + ${maven.build.timestamp} @@ -159,6 +161,33 @@ true
+ + com.mycila + license-maven-plugin + 3.0 + + Copyright (C) ${inceptionYear}-${currentYear}, GoodData(R) Corporation. All rights reserved. + true + true + true + + 2004 + ${currentYear} + + + src/**/*.java + + + + + package + + check + + + + + diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index 8e919bb11..4a385989d 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import java.util.concurrent.TimeUnit; diff --git a/src/main/java/com/gooddata/SimplePollHandler.java b/src/main/java/com/gooddata/SimplePollHandler.java index 62fbdae1a..c6fb41c4c 100644 --- a/src/main/java/com/gooddata/SimplePollHandler.java +++ b/src/main/java/com/gooddata/SimplePollHandler.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; /** diff --git a/src/main/java/com/gooddata/account/AccountNotFoundException.java b/src/main/java/com/gooddata/account/AccountNotFoundException.java index 9567d8cb3..9006d9b2e 100644 --- a/src/main/java/com/gooddata/account/AccountNotFoundException.java +++ b/src/main/java/com/gooddata/account/AccountNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.account; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/collections/Page.java b/src/main/java/com/gooddata/collections/Page.java index 6216455d7..e40e72f79 100644 --- a/src/main/java/com/gooddata/collections/Page.java +++ b/src/main/java/com/gooddata/collections/Page.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.springframework.web.client.RestOperations; diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index fa6f6fe59..8393f392d 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java index 03b19eed6..18cd669aa 100644 --- a/src/main/java/com/gooddata/collections/PageableList.java +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import java.util.Collection; diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index cbb611a3c..3e76f1d04 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index f03e4c3c6..6f56bc75b 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index 19228a4d3..3922c0116 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.springframework.web.util.UriComponents; diff --git a/src/main/java/com/gooddata/connector/ConnectorException.java b/src/main/java/com/gooddata/connector/ConnectorException.java index cd7b8f136..f3232f279 100644 --- a/src/main/java/com/gooddata/connector/ConnectorException.java +++ b/src/main/java/com/gooddata/connector/ConnectorException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java index f705320b8..6b3253f6c 100644 --- a/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java +++ b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java index f6d6f5aaf..5ed38d3c6 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/src/main/java/com/gooddata/connector/Status.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 897189c17..1a479af72 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 79335cab0..036811338 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index b6c736f04..43ecae2d5 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.annotation.*; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java index 5f5120d01..62cc3d114 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java index 7809f5874..ba9ca1e30 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java index bf1572d1d..1875082e0 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 28ed73289..83c74b9dd 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.AbstractPollHandler; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessType.java b/src/main/java/com/gooddata/dataload/processes/ProcessType.java index f0ff8b142..cea285927 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessType.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessType.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; /** diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 24bf66de9..f8c15ead5 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java index d8a165aac..72ec80e76 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java index 0fcc8a89b..de30f1641 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; /** diff --git a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java index b6d9f0e6f..1d3b6a118 100644 --- a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java +++ b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.collections.PageableListDeserializer; diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java index 85068d532..54288302a 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java index 7f5522084..e018e6036 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataset/EtlModeType.java b/src/main/java/com/gooddata/dataset/EtlModeType.java index f6f27d9d0..c4f643547 100644 --- a/src/main/java/com/gooddata/dataset/EtlModeType.java +++ b/src/main/java/com/gooddata/dataset/EtlModeType.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/dataset/LookupMode.java b/src/main/java/com/gooddata/dataset/LookupMode.java index b3753f2e8..03e55a81c 100644 --- a/src/main/java/com/gooddata/dataset/LookupMode.java +++ b/src/main/java/com/gooddata/dataset/LookupMode.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonValue; diff --git a/src/main/java/com/gooddata/dataset/Upload.java b/src/main/java/com/gooddata/dataset/Upload.java index 77a819b83..ca9b6b39c 100644 --- a/src/main/java/com/gooddata/dataset/Upload.java +++ b/src/main/java/com/gooddata/dataset/Upload.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/dataset/UploadMode.java b/src/main/java/com/gooddata/dataset/UploadMode.java index a44e0759e..b10b502c4 100644 --- a/src/main/java/com/gooddata/dataset/UploadMode.java +++ b/src/main/java/com/gooddata/dataset/UploadMode.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; public enum UploadMode { diff --git a/src/main/java/com/gooddata/dataset/UploadStatistics.java b/src/main/java/com/gooddata/dataset/UploadStatistics.java index 61d7c6f94..80fdfe1a1 100644 --- a/src/main/java/com/gooddata/dataset/UploadStatistics.java +++ b/src/main/java/com/gooddata/dataset/UploadStatistics.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/src/main/java/com/gooddata/dataset/Uploads.java index 3eb507764..26a0080df 100644 --- a/src/main/java/com/gooddata/dataset/Uploads.java +++ b/src/main/java/com/gooddata/dataset/Uploads.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/dataset/UploadsInfo.java b/src/main/java/com/gooddata/dataset/UploadsInfo.java index ba1823413..43fab465a 100644 --- a/src/main/java/com/gooddata/dataset/UploadsInfo.java +++ b/src/main/java/com/gooddata/dataset/UploadsInfo.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/gdc/DataStoreException.java b/src/main/java/com/gooddata/gdc/DataStoreException.java index 36ee49300..7a3316004 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreException.java +++ b/src/main/java/com/gooddata/gdc/DataStoreException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 1d573b883..ff7ef3309 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index 96e5d1c7f..dfff658e6 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index d870861d4..4e00f3a92 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 89051cb03..58f19dcab 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.*; diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index f9c95672b..ef562b1f3 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index aab23d6de..60acdfa2f 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index ef414b4a9..82228b48c 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 1794508cd..87edc6e5e 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index 74a6f1011..98c64b43a 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/NonUniqueObjException.java b/src/main/java/com/gooddata/md/NonUniqueObjException.java index 8ff744e2c..329baac1a 100644 --- a/src/main/java/com/gooddata/md/NonUniqueObjException.java +++ b/src/main/java/com/gooddata/md/NonUniqueObjException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 814dbcd4d..1da39a679 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/md/ObjCreateException.java b/src/main/java/com/gooddata/md/ObjCreateException.java index 53bf176d9..c72e17528 100644 --- a/src/main/java/com/gooddata/md/ObjCreateException.java +++ b/src/main/java/com/gooddata/md/ObjCreateException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index 7bf4d475d..75df30815 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/md/ObjUpdateException.java b/src/main/java/com/gooddata/md/ObjUpdateException.java index 8a909e8f7..9af2dba14 100644 --- a/src/main/java/com/gooddata/md/ObjUpdateException.java +++ b/src/main/java/com/gooddata/md/ObjUpdateException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/src/main/java/com/gooddata/md/ProjectDashboard.java index f9917de9e..4558cde0a 100644 --- a/src/main/java/com/gooddata/md/ProjectDashboard.java +++ b/src/main/java/com/gooddata/md/ProjectDashboard.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index 5fa92a96c..628600b1b 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/Queryable.java b/src/main/java/com/gooddata/md/Queryable.java index 0f3af2efe..03259c5e7 100644 --- a/src/main/java/com/gooddata/md/Queryable.java +++ b/src/main/java/com/gooddata/md/Queryable.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; /** diff --git a/src/main/java/com/gooddata/md/Restriction.java b/src/main/java/com/gooddata/md/Restriction.java index 097d3ea30..6b04fa590 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/src/main/java/com/gooddata/md/Restriction.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; /** diff --git a/src/main/java/com/gooddata/md/Updatable.java b/src/main/java/com/gooddata/md/Updatable.java index 71800487f..f3c4f4717 100644 --- a/src/main/java/com/gooddata/md/Updatable.java +++ b/src/main/java/com/gooddata/md/Updatable.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; /** diff --git a/src/main/java/com/gooddata/md/Usage.java b/src/main/java/com/gooddata/md/Usage.java index 422e6ebed..f26c9bf9a 100644 --- a/src/main/java/com/gooddata/md/Usage.java +++ b/src/main/java/com/gooddata/md/Usage.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import java.util.Collection; diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java index f8e09b3ab..14ef0cce3 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java index 74d74c9ee..ca8c54681 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportException.java b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java index 24f56d6ef..b640e6c03 100644 --- a/src/main/java/com/gooddata/md/maintenance/ExportImportException.java +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java index 0835c52b6..ab09d1b61 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import com.fasterxml.jackson.annotation.*; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java index ed72f6b6f..338b0ed02 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java index d5536c2da..e7bea63bb 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index 1282dba65..4130f64ab 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.report; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/Environment.java b/src/main/java/com/gooddata/project/Environment.java index be54f9eca..7181e466d 100644 --- a/src/main/java/com/gooddata/project/Environment.java +++ b/src/main/java/com/gooddata/project/Environment.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; /** diff --git a/src/main/java/com/gooddata/project/ProjectEnvironment.java b/src/main/java/com/gooddata/project/ProjectEnvironment.java index b96697dc0..d9aebfe48 100644 --- a/src/main/java/com/gooddata/project/ProjectEnvironment.java +++ b/src/main/java/com/gooddata/project/ProjectEnvironment.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; /** diff --git a/src/main/java/com/gooddata/project/ProjectNotFoundException.java b/src/main/java/com/gooddata/project/ProjectNotFoundException.java index 106a6a1a4..08e1cbd95 100644 --- a/src/main/java/com/gooddata/project/ProjectNotFoundException.java +++ b/src/main/java/com/gooddata/project/ProjectNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/src/main/java/com/gooddata/project/ProjectValidationResult.java index cbc68e73a..abf2b7f42 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResult.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResult.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index b39350e0f..26965d95a 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java index 16d14ec8c..c0e37f298 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java index 7b3e72b56..e4a59499c 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java index aabc34bb2..1ed82d9a5 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index 626c278c9..7ef574111 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import static java.lang.String.format; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java index c83a5f14c..92b374b4b 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java index 5a96adf5a..0a35dfbd5 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.util.BooleanDeserializer; diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/src/main/java/com/gooddata/project/ProjectValidationType.java index 65e3419d6..c9fec0f33 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationType.java +++ b/src/main/java/com/gooddata/project/ProjectValidationType.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java index f2eae87ca..ce55281d3 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index c3664e59c..b74453927 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/project/RoleNotFoundException.java b/src/main/java/com/gooddata/project/RoleNotFoundException.java index 0eda92536..74346e12e 100644 --- a/src/main/java/com/gooddata/project/RoleNotFoundException.java +++ b/src/main/java/com/gooddata/project/RoleNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/project/Roles.java b/src/main/java/com/gooddata/project/Roles.java index 85754bc39..081624f4f 100644 --- a/src/main/java/com/gooddata/project/Roles.java +++ b/src/main/java/com/gooddata/project/Roles.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index 4d5e987c9..d8a777ee0 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/src/main/java/com/gooddata/project/UsersDeserializer.java index 855fe3b57..0a45e5de4 100644 --- a/src/main/java/com/gooddata/project/UsersDeserializer.java +++ b/src/main/java/com/gooddata/project/UsersDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.collections.PageableListDeserializer; diff --git a/src/main/java/com/gooddata/report/ExecuteDefinition.java b/src/main/java/com/gooddata/report/ExecuteDefinition.java index 7e43f7b2c..a354afb85 100644 --- a/src/main/java/com/gooddata/report/ExecuteDefinition.java +++ b/src/main/java/com/gooddata/report/ExecuteDefinition.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ExecuteReport.java b/src/main/java/com/gooddata/report/ExecuteReport.java index 79c521f76..d2bdf7c07 100644 --- a/src/main/java/com/gooddata/report/ExecuteReport.java +++ b/src/main/java/com/gooddata/report/ExecuteReport.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/NoDataReportException.java b/src/main/java/com/gooddata/report/NoDataReportException.java index 955d4e74c..2af3445bf 100644 --- a/src/main/java/com/gooddata/report/NoDataReportException.java +++ b/src/main/java/com/gooddata/report/NoDataReportException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; /** diff --git a/src/main/java/com/gooddata/report/ReportException.java b/src/main/java/com/gooddata/report/ReportException.java index 8fd9b827d..02c1bf25d 100644 --- a/src/main/java/com/gooddata/report/ReportException.java +++ b/src/main/java/com/gooddata/report/ReportException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/report/ReportExportFormat.java b/src/main/java/com/gooddata/report/ReportExportFormat.java index ef3ab5453..c017e3945 100644 --- a/src/main/java/com/gooddata/report/ReportExportFormat.java +++ b/src/main/java/com/gooddata/report/ReportExportFormat.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; /** diff --git a/src/main/java/com/gooddata/util/BooleanDeserializer.java b/src/main/java/com/gooddata/util/BooleanDeserializer.java index 4465b233e..8107e45e2 100644 --- a/src/main/java/com/gooddata/util/BooleanDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java index cc8b3ed99..527a99aba 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/util/BooleanStringSerializer.java b/src/main/java/com/gooddata/util/BooleanStringSerializer.java index 4bf8fd161..d6d243379 100644 --- a/src/main/java/com/gooddata/util/BooleanStringSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanStringSerializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java index 5f17e7abc..26092e82e 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java index 556c2cafd..4a909702c 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java index 186895615..a2ac81b8c 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import java.io.IOException; diff --git a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java index 1a6d5a2e3..fb38942d9 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/src/main/java/com/gooddata/util/TagsDeserializer.java b/src/main/java/com/gooddata/util/TagsDeserializer.java index 7e9a2ed17..98127c613 100644 --- a/src/main/java/com/gooddata/util/TagsDeserializer.java +++ b/src/main/java/com/gooddata/util/TagsDeserializer.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/gooddata/util/Validate.java b/src/main/java/com/gooddata/util/Validate.java index f83d85f51..16cb0ec3f 100644 --- a/src/main/java/com/gooddata/util/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import java.util.Collection; diff --git a/src/main/java/com/gooddata/util/ZipHelper.java b/src/main/java/com/gooddata/util/ZipHelper.java index 1fa7fcbe2..5c793034f 100644 --- a/src/main/java/com/gooddata/util/ZipHelper.java +++ b/src/main/java/com/gooddata/util/ZipHelper.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index d6967cc00..1298be7a9 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java index cdcbe9ed6..4b3010397 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 19d01d828..7edac4b7b 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.AbstractPollHandler; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index 6d9db65b8..1ba9dd875 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index c9a7880b4..d71a5136c 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java index 6534339d8..b7aadb017 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.GoodDataException; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java index 2a55c6670..434e7dec1 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.collections.PageableList; diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index 38b0c61de..4ece0b196 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.collections.PageableList; diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 47200d329..8f9552a0d 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import com.gooddata.http.client.GoodDataHttpClient; diff --git a/src/test/java/com/gooddata/AbstractServiceTest.java b/src/test/java/com/gooddata/AbstractServiceTest.java index 78a96bc39..3f797c34d 100644 --- a/src/test/java/com/gooddata/AbstractServiceTest.java +++ b/src/test/java/com/gooddata/AbstractServiceTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import org.mockito.Mock; diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index 6bc002b1f..f400bb378 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import com.gooddata.gdc.GdcError; diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java index 0a1ba8753..5c92d912d 100644 --- a/src/test/java/com/gooddata/GoodDataSettingsTest.java +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import org.testng.annotations.BeforeMethod; diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index a45fee411..2acb95c9a 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata; import static java.lang.String.format; diff --git a/src/test/java/com/gooddata/account/AccountServiceAT.java b/src/test/java/com/gooddata/account/AccountServiceAT.java index 2e4ebe01e..80abd1a46 100644 --- a/src/test/java/com/gooddata/account/AccountServiceAT.java +++ b/src/test/java/com/gooddata/account/AccountServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.account; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 9a888b54e..daa873f14 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.account; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index a21c49180..6424a6426 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.springframework.web.util.UriComponentsBuilder; diff --git a/src/test/java/com/gooddata/collections/PageableListTest.java b/src/test/java/com/gooddata/collections/PageableListTest.java index ac9b278a6..86debeb89 100644 --- a/src/test/java/com/gooddata/collections/PageableListTest.java +++ b/src/test/java/com/gooddata/collections/PageableListTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java index c47f5bfb9..e59bac7f2 100644 --- a/src/test/java/com/gooddata/collections/PagingTest.java +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index 7af35a5f7..5259d67a9 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.collections; import org.springframework.web.util.UriComponents; diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 28471e76f..98e35a21e 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index d3aa02784..23b3ca595 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/connector/ProcessStatusTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java index d51d285cc..1808436ac 100644 --- a/src/test/java/com/gooddata/connector/ProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.connector; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 3a3745c75..76a54d773 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 13f5636a3..067dc67a8 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index 77c128ca2..6134d18fd 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import static org.hamcrest.core.Is.is; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index e93ca303d..133f069f2 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java index 9ca460576..7a396511d 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import org.hamcrest.Description; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 473b0efd0..a91520643 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 522a7d57a..02f763261 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index d0ca412fd..101128017 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java index c12bab0fc..60b6054dc 100644 --- a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataload.processes; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index e08af9f64..f6103fc9f 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static org.hamcrest.CoreMatchers.equalTo; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 8d916e986..194208309 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index a534d2589..081c7aecc 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index 2c9058fc1..32d97ab25 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java index 4ebce51bf..35df78883 100644 --- a/src/test/java/com/gooddata/dataset/PullTest.java +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java index 27638562b..ecd7b491d 100644 --- a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/dataset/UploadTest.java b/src/test/java/com/gooddata/dataset/UploadTest.java index 6aac22e12..0e1a53e33 100644 --- a/src/test/java/com/gooddata/dataset/UploadTest.java +++ b/src/test/java/com/gooddata/dataset/UploadTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index 7bc42e95c..fbccc47b5 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java index 41904c24c..12f9cf29a 100644 --- a/src/test/java/com/gooddata/dataset/UploadsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.dataset; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 67da5e316..52f6301a6 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 65180c2e0..b3c8cfbd2 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index b889d7bd7..29c71a7c6 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index bb3b3893a..b67b8421f 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 8f483fdd1..8433d0dab 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/gdc/TaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java index a5d0910b9..a71edff77 100644 --- a/src/test/java/com/gooddata/gdc/TaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.gdc; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index a7d412039..47ed6b601 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 1bc8bd03d..2e0ed8c25 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import static com.gooddata.md.Restriction.identifier; diff --git a/src/test/java/com/gooddata/md/ProjectDashboardTest.java b/src/test/java/com/gooddata/md/ProjectDashboardTest.java index a4612d520..fb43e91d0 100644 --- a/src/test/java/com/gooddata/md/ProjectDashboardTest.java +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java index c1b0f7336..e21a7f645 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java index 4d750a573..e0179c54e 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java index 863628ffd..dce9b5fba 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.maintenance; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/report/ReportServiceAT.java b/src/test/java/com/gooddata/md/report/ReportServiceAT.java index 45f46c4fc..b215634b1 100644 --- a/src/test/java/com/gooddata/md/report/ReportServiceAT.java +++ b/src/test/java/com/gooddata/md/report/ReportServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.md.report; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/model/ModelServiceAT.java b/src/test/java/com/gooddata/model/ModelServiceAT.java index 911fbf708..9e6f29729 100644 --- a/src/test/java/com/gooddata/model/ModelServiceAT.java +++ b/src/test/java/com/gooddata/model/ModelServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.model; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 90945e0c4..874bce75d 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.model; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/project/ProjectIdMatcher.java b/src/test/java/com/gooddata/project/ProjectIdMatcher.java index 9205efc7a..72adc82aa 100644 --- a/src/test/java/com/gooddata/project/ProjectIdMatcher.java +++ b/src/test/java/com/gooddata/project/ProjectIdMatcher.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import org.hamcrest.Description; diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index a881186c7..aa2232338 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index a54f654f2..d6017797f 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 621d6dd59..2d2655d40 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java index ff90a90be..eee2d5fbe 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java index 4a3ece4cc..42861df47 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java index 8077d46e6..f52c7de27 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import static java.util.Arrays.asList; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java index 38e2a6cc5..35c857e54 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java index 5fb29b036..7287a1d97 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java index d0de73a3e..f91b6f018 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/ProjectValidationsTest.java b/src/test/java/com/gooddata/project/ProjectValidationsTest.java index 9e632c474..cc05c8d28 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationsTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/RoleTest.java b/src/test/java/com/gooddata/project/RoleTest.java index 524aaa2a2..434c7572a 100644 --- a/src/test/java/com/gooddata/project/RoleTest.java +++ b/src/test/java/com/gooddata/project/RoleTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java index 8410f1f2c..f85d11893 100644 --- a/src/test/java/com/gooddata/project/RolesTest.java +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java index 2c52644ff..70b1a7c17 100644 --- a/src/test/java/com/gooddata/project/UserTest.java +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/project/UsersTest.java b/src/test/java/com/gooddata/project/UsersTest.java index 279197690..5f7a6924e 100644 --- a/src/test/java/com/gooddata/project/UsersTest.java +++ b/src/test/java/com/gooddata/project/UsersTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.project; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 956abe4a1..4bc5bc5b9 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.report; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java index 47a392eb6..f03a0b757 100644 --- a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerClass.java b/src/test/java/com/gooddata/util/BooleanIntegerClass.java index b485c6cbb..e54b87da7 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerClass.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerClass.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java index 6a70fa107..97576577a 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/BooleanStringClass.java b/src/test/java/com/gooddata/util/BooleanStringClass.java index 8104c59bc..ba8085fb2 100644 --- a/src/test/java/com/gooddata/util/BooleanStringClass.java +++ b/src/test/java/com/gooddata/util/BooleanStringClass.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java index 5a2f2f32f..7fac2055d 100644 --- a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index 4c1714faa..983b94f49 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java index 8cf5507aa..919565890 100644 --- a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java index 73f1b5ec6..1667c61cf 100644 --- a/src/test/java/com/gooddata/util/GDDateSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/GDDateTimeClass.java b/src/test/java/com/gooddata/util/GDDateTimeClass.java index 0da6b1fdc..80dc20bbc 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeClass.java +++ b/src/test/java/com/gooddata/util/GDDateTimeClass.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java index ec4c5ab7d..ce30473c5 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java index aa6f5a522..9b87bb730 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/ISODateClass.java b/src/test/java/com/gooddata/util/ISODateClass.java index f3d742008..e9c6eb1f4 100644 --- a/src/test/java/com/gooddata/util/ISODateClass.java +++ b/src/test/java/com/gooddata/util/ISODateClass.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java index 53a04606b..21f4e24d7 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java index 606dec32e..c73593291 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; diff --git a/src/test/java/com/gooddata/util/TagsDeserializerTest.java b/src/test/java/com/gooddata/util/TagsDeserializerTest.java index 047d9b71a..a801bad2f 100644 --- a/src/test/java/com/gooddata/util/TagsDeserializerTest.java +++ b/src/test/java/com/gooddata/util/TagsDeserializerTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/util/ZipHelperTest.java b/src/test/java/com/gooddata/util/ZipHelperTest.java index 255f347f7..3cf1e8441 100644 --- a/src/test/java/com/gooddata/util/ZipHelperTest.java +++ b/src/test/java/com/gooddata/util/ZipHelperTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.util; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java index 6bf558e41..7c5e17d51 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import org.hamcrest.Description; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index 2122176ef..b1e13c4b0 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index 94be7eef5..c3df7a56e 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.gooddata.AbstractGoodDataIT; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index d766aebad..f23372040 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import static org.hamcrest.core.Is.is; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 3e45bae87..065512b39 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index 15495c854..1bcf5be0f 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java index 52f3f9f6b..3c2d9bab6 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index aea53cfb8..b18c5244c 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -1,3 +1,6 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + */ package com.gooddata.warehouse; import static com.gooddata.JsonMatchers.serializesToJson; From e8f8b291ed034193df2ceebf8aed3ab48d702408 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 13 Sep 2016 13:43:37 +0200 Subject: [PATCH 0419/1191] chg: license header --- README.md | 2 ++ pom.xml | 2 +- src/license_header.txt | 3 +++ src/main/java/com/gooddata/AbstractPollHandler.java | 6 ++++-- src/main/java/com/gooddata/AbstractPollHandlerBase.java | 6 ++++-- src/main/java/com/gooddata/AbstractService.java | 6 ++++-- src/main/java/com/gooddata/FutureResult.java | 6 ++++-- src/main/java/com/gooddata/GoodData.java | 6 ++++-- src/main/java/com/gooddata/GoodDataException.java | 6 ++++-- src/main/java/com/gooddata/GoodDataRestException.java | 6 ++++-- src/main/java/com/gooddata/GoodDataSettings.java | 2 ++ .../java/com/gooddata/HeaderSettingRequestInterceptor.java | 6 ++++-- src/main/java/com/gooddata/PollHandler.java | 6 ++++-- src/main/java/com/gooddata/PollResult.java | 6 ++++-- src/main/java/com/gooddata/SimplePollHandler.java | 2 ++ src/main/java/com/gooddata/UriPrefixer.java | 6 ++++-- .../com/gooddata/UriPrefixingClientHttpRequestFactory.java | 6 ++++-- src/main/java/com/gooddata/account/Account.java | 6 ++++-- .../com/gooddata/account/AccountNotFoundException.java | 2 ++ src/main/java/com/gooddata/account/AccountService.java | 6 ++++-- src/main/java/com/gooddata/collections/Page.java | 2 ++ src/main/java/com/gooddata/collections/PageRequest.java | 2 ++ src/main/java/com/gooddata/collections/PageableList.java | 2 ++ .../com/gooddata/collections/PageableListDeserializer.java | 2 ++ .../com/gooddata/collections/PageableListSerializer.java | 6 ++++-- src/main/java/com/gooddata/collections/Paging.java | 2 ++ src/main/java/com/gooddata/collections/UriPage.java | 2 ++ .../java/com/gooddata/connector/ConnectorException.java | 2 ++ src/main/java/com/gooddata/connector/ConnectorService.java | 6 ++++-- src/main/java/com/gooddata/connector/ConnectorType.java | 6 ++++-- src/main/java/com/gooddata/connector/Integration.java | 6 ++++-- .../gooddata/connector/IntegrationNotFoundException.java | 2 ++ .../com/gooddata/connector/IntegrationProcessStatus.java | 6 ++++-- src/main/java/com/gooddata/connector/ProcessExecution.java | 6 ++++-- src/main/java/com/gooddata/connector/ProcessStatus.java | 6 ++++-- src/main/java/com/gooddata/connector/Settings.java | 6 ++++-- src/main/java/com/gooddata/connector/Status.java | 2 ++ .../com/gooddata/connector/Zendesk4ProcessExecution.java | 6 ++++-- src/main/java/com/gooddata/connector/Zendesk4Settings.java | 6 ++++-- .../java/com/gooddata/dataload/processes/AsyncTask.java | 6 ++++-- .../com/gooddata/dataload/processes/DataloadProcess.java | 2 ++ .../com/gooddata/dataload/processes/DataloadProcesses.java | 6 ++++-- .../com/gooddata/dataload/processes/ProcessExecution.java | 2 ++ .../dataload/processes/ProcessExecutionDetail.java | 2 ++ .../dataload/processes/ProcessExecutionException.java | 2 ++ .../gooddata/dataload/processes/ProcessExecutionTask.java | 2 ++ .../dataload/processes/ProcessNotFoundException.java | 2 ++ .../com/gooddata/dataload/processes/ProcessService.java | 2 ++ .../java/com/gooddata/dataload/processes/ProcessType.java | 2 ++ .../java/com/gooddata/dataload/processes/Schedule.java | 2 ++ .../dataload/processes/ScheduleNotFoundException.java | 2 ++ .../com/gooddata/dataload/processes/ScheduleState.java | 2 ++ .../java/com/gooddata/dataload/processes/Schedules.java | 6 ++++-- .../gooddata/dataload/processes/SchedulesDeserializer.java | 2 ++ src/main/java/com/gooddata/dataset/Dataset.java | 2 ++ src/main/java/com/gooddata/dataset/DatasetException.java | 6 ++++-- src/main/java/com/gooddata/dataset/DatasetLinks.java | 6 ++++-- src/main/java/com/gooddata/dataset/DatasetManifest.java | 6 ++++-- src/main/java/com/gooddata/dataset/DatasetManifests.java | 7 ++++--- .../com/gooddata/dataset/DatasetNotFoundException.java | 6 ++++-- src/main/java/com/gooddata/dataset/DatasetService.java | 6 ++++-- src/main/java/com/gooddata/dataset/Datasets.java | 6 ++++-- src/main/java/com/gooddata/dataset/EtlMode.java | 2 ++ src/main/java/com/gooddata/dataset/EtlModeType.java | 2 ++ src/main/java/com/gooddata/dataset/LookupMode.java | 2 ++ src/main/java/com/gooddata/dataset/MaqlDml.java | 7 ++++--- src/main/java/com/gooddata/dataset/Pull.java | 6 ++++-- src/main/java/com/gooddata/dataset/PullTask.java | 6 ++++-- src/main/java/com/gooddata/dataset/TaskState.java | 7 ++++--- src/main/java/com/gooddata/dataset/Upload.java | 2 ++ src/main/java/com/gooddata/dataset/UploadMode.java | 2 ++ src/main/java/com/gooddata/dataset/UploadStatistics.java | 2 ++ src/main/java/com/gooddata/dataset/Uploads.java | 2 ++ src/main/java/com/gooddata/dataset/UploadsInfo.java | 2 ++ src/main/java/com/gooddata/featureflag/FeatureFlag.java | 6 ++++-- .../java/com/gooddata/featureflag/FeatureFlagService.java | 6 ++++-- src/main/java/com/gooddata/featureflag/FeatureFlags.java | 6 ++++-- .../java/com/gooddata/featureflag/ProjectFeatureFlag.java | 6 ++++-- .../java/com/gooddata/featureflag/ProjectFeatureFlags.java | 6 ++++-- src/main/java/com/gooddata/gdc/AboutLinks.java | 6 ++++-- src/main/java/com/gooddata/gdc/AbstractMaql.java | 6 ++++-- src/main/java/com/gooddata/gdc/AsyncTask.java | 6 ++++-- src/main/java/com/gooddata/gdc/DataStoreException.java | 2 ++ src/main/java/com/gooddata/gdc/DataStoreService.java | 6 ++++-- src/main/java/com/gooddata/gdc/ErrorStructure.java | 2 ++ src/main/java/com/gooddata/gdc/Gdc.java | 6 ++++-- src/main/java/com/gooddata/gdc/GdcError.java | 6 ++++-- src/main/java/com/gooddata/gdc/GdcSardine.java | 6 ++++-- src/main/java/com/gooddata/gdc/GdcService.java | 6 ++++-- src/main/java/com/gooddata/gdc/LinkEntries.java | 6 ++++-- src/main/java/com/gooddata/gdc/RootLinks.java | 6 ++++-- src/main/java/com/gooddata/gdc/TaskStatus.java | 2 ++ src/main/java/com/gooddata/gdc/UriResponse.java | 6 ++++-- src/main/java/com/gooddata/md/AbstractObj.java | 6 ++++-- src/main/java/com/gooddata/md/Attachment.java | 6 ++++-- src/main/java/com/gooddata/md/Attribute.java | 6 ++++-- src/main/java/com/gooddata/md/AttributeDisplayForm.java | 2 ++ src/main/java/com/gooddata/md/AttributeElement.java | 7 ++++--- src/main/java/com/gooddata/md/AttributeElements.java | 7 ++++--- src/main/java/com/gooddata/md/AttributeSort.java | 7 ++++--- src/main/java/com/gooddata/md/Column.java | 7 ++++--- src/main/java/com/gooddata/md/DashboardAttachment.java | 6 ++++-- src/main/java/com/gooddata/md/DataLoadingColumn.java | 7 ++++--- src/main/java/com/gooddata/md/Dataset.java | 7 ++++--- src/main/java/com/gooddata/md/Dimension.java | 6 ++++-- src/main/java/com/gooddata/md/DisplayForm.java | 6 ++++-- src/main/java/com/gooddata/md/Entry.java | 2 ++ src/main/java/com/gooddata/md/Expression.java | 6 ++++-- src/main/java/com/gooddata/md/Fact.java | 6 ++++-- src/main/java/com/gooddata/md/IdentifierAndUri.java | 2 ++ src/main/java/com/gooddata/md/IdentifierToUri.java | 2 ++ src/main/java/com/gooddata/md/IdentifiersAndUris.java | 2 ++ src/main/java/com/gooddata/md/InUseMany.java | 2 ++ src/main/java/com/gooddata/md/Key.java | 2 ++ src/main/java/com/gooddata/md/MaqlAst.java | 6 ++++-- src/main/java/com/gooddata/md/Meta.java | 6 ++++-- src/main/java/com/gooddata/md/MetadataService.java | 6 ++++-- src/main/java/com/gooddata/md/Metric.java | 6 ++++-- src/main/java/com/gooddata/md/NestedAttribute.java | 6 ++++-- src/main/java/com/gooddata/md/NonUniqueObjException.java | 2 ++ src/main/java/com/gooddata/md/Obj.java | 2 ++ src/main/java/com/gooddata/md/ObjCreateException.java | 2 ++ src/main/java/com/gooddata/md/ObjNotFoundException.java | 2 ++ src/main/java/com/gooddata/md/ObjUpdateException.java | 2 ++ src/main/java/com/gooddata/md/ProjectDashboard.java | 2 ++ src/main/java/com/gooddata/md/Query.java | 2 ++ src/main/java/com/gooddata/md/Queryable.java | 2 ++ src/main/java/com/gooddata/md/ReportAttachment.java | 6 ++++-- src/main/java/com/gooddata/md/Restriction.java | 2 ++ src/main/java/com/gooddata/md/ScheduledMail.java | 6 ++++-- src/main/java/com/gooddata/md/ScheduledMailWhen.java | 6 ++++-- src/main/java/com/gooddata/md/Table.java | 7 ++++--- src/main/java/com/gooddata/md/TableDataLoad.java | 7 ++++--- src/main/java/com/gooddata/md/Updatable.java | 2 ++ src/main/java/com/gooddata/md/Usage.java | 2 ++ src/main/java/com/gooddata/md/UseMany.java | 2 ++ src/main/java/com/gooddata/md/UseManyEntries.java | 2 ++ .../com/gooddata/md/maintenance/ExportImportException.java | 2 ++ .../com/gooddata/md/maintenance/ExportImportService.java | 7 ++++--- .../com/gooddata/md/maintenance/PartialMdArtifact.java | 2 ++ .../java/com/gooddata/md/maintenance/PartialMdExport.java | 2 ++ .../com/gooddata/md/maintenance/PartialMdExportToken.java | 2 ++ src/main/java/com/gooddata/md/report/AttributeInGrid.java | 6 ++++-- src/main/java/com/gooddata/md/report/Filter.java | 2 ++ src/main/java/com/gooddata/md/report/Grid.java | 6 ++++-- src/main/java/com/gooddata/md/report/GridElement.java | 6 ++++-- .../com/gooddata/md/report/GridElementDeserializer.java | 7 ++++--- .../java/com/gooddata/md/report/GridElementSerializer.java | 7 ++++--- .../gooddata/md/report/GridReportDefinitionContent.java | 6 ++++-- src/main/java/com/gooddata/md/report/MetricElement.java | 7 ++++--- src/main/java/com/gooddata/md/report/MetricGroup.java | 7 ++++--- .../md/report/OneNumberReportDefinitionContent.java | 6 ++++-- src/main/java/com/gooddata/md/report/Report.java | 6 ++++-- src/main/java/com/gooddata/md/report/ReportDefinition.java | 6 ++++-- .../com/gooddata/md/report/ReportDefinitionContent.java | 6 ++++-- src/main/java/com/gooddata/md/report/Total.java | 7 ++++--- src/main/java/com/gooddata/model/DiffRequest.java | 6 ++++-- src/main/java/com/gooddata/model/MaqlDdl.java | 6 ++++-- src/main/java/com/gooddata/model/MaqlDdlLinks.java | 6 ++++-- src/main/java/com/gooddata/model/ModelDiff.java | 6 ++++-- src/main/java/com/gooddata/model/ModelException.java | 6 ++++-- src/main/java/com/gooddata/model/ModelService.java | 6 ++++-- .../com/gooddata/notification/NotificationService.java | 7 ++++--- src/main/java/com/gooddata/notification/ProjectEvent.java | 7 ++++--- src/main/java/com/gooddata/project/Environment.java | 2 ++ src/main/java/com/gooddata/project/Project.java | 6 ++++-- src/main/java/com/gooddata/project/ProjectDriver.java | 7 ++++--- src/main/java/com/gooddata/project/ProjectEnvironment.java | 2 ++ .../com/gooddata/project/ProjectNotFoundException.java | 2 ++ src/main/java/com/gooddata/project/ProjectService.java | 6 ++++-- src/main/java/com/gooddata/project/ProjectTemplate.java | 6 ++++-- src/main/java/com/gooddata/project/ProjectTemplates.java | 6 ++++-- .../java/com/gooddata/project/ProjectValidationResult.java | 2 ++ .../project/ProjectValidationResultGdcTimeElParam.java | 2 ++ .../com/gooddata/project/ProjectValidationResultItem.java | 2 ++ .../project/ProjectValidationResultObjectParam.java | 2 ++ .../com/gooddata/project/ProjectValidationResultParam.java | 2 ++ .../project/ProjectValidationResultSliElParam.java | 2 ++ .../project/ProjectValidationResultStringParam.java | 2 ++ .../com/gooddata/project/ProjectValidationResults.java | 2 ++ .../java/com/gooddata/project/ProjectValidationType.java | 2 ++ src/main/java/com/gooddata/project/ProjectValidations.java | 2 ++ src/main/java/com/gooddata/project/Projects.java | 6 ++++-- src/main/java/com/gooddata/project/Role.java | 2 ++ .../java/com/gooddata/project/RoleNotFoundException.java | 2 ++ src/main/java/com/gooddata/project/Roles.java | 2 ++ src/main/java/com/gooddata/project/User.java | 2 ++ src/main/java/com/gooddata/project/Users.java | 6 ++++-- src/main/java/com/gooddata/project/UsersDeserializer.java | 2 ++ src/main/java/com/gooddata/report/ExecuteDefinition.java | 2 ++ src/main/java/com/gooddata/report/ExecuteReport.java | 2 ++ .../java/com/gooddata/report/NoDataReportException.java | 2 ++ src/main/java/com/gooddata/report/ReportException.java | 2 ++ src/main/java/com/gooddata/report/ReportExportFormat.java | 2 ++ src/main/java/com/gooddata/report/ReportRequest.java | 6 ++++-- src/main/java/com/gooddata/report/ReportService.java | 6 ++++-- src/main/java/com/gooddata/util/BooleanDeserializer.java | 2 ++ .../java/com/gooddata/util/BooleanIntegerSerializer.java | 2 ++ .../java/com/gooddata/util/BooleanStringSerializer.java | 2 ++ src/main/java/com/gooddata/util/GDDateDeserializer.java | 6 ++++-- src/main/java/com/gooddata/util/GDDateSerializer.java | 6 ++++-- .../java/com/gooddata/util/GDDateTimeDeserializer.java | 2 ++ src/main/java/com/gooddata/util/GDDateTimeSerializer.java | 2 ++ .../java/com/gooddata/util/ISODateTimeDeserializer.java | 2 ++ src/main/java/com/gooddata/util/ISODateTimeSerializer.java | 2 ++ src/main/java/com/gooddata/util/ResponseErrorHandler.java | 6 ++++-- src/main/java/com/gooddata/util/TagsDeserializer.java | 2 ++ src/main/java/com/gooddata/util/TagsSerializer.java | 6 ++++-- src/main/java/com/gooddata/util/Validate.java | 2 ++ src/main/java/com/gooddata/util/ZipHelper.java | 2 ++ src/main/java/com/gooddata/warehouse/Warehouse.java | 2 ++ .../com/gooddata/warehouse/WarehouseNotFoundException.java | 2 ++ src/main/java/com/gooddata/warehouse/WarehouseService.java | 2 ++ src/main/java/com/gooddata/warehouse/WarehouseTask.java | 2 ++ src/main/java/com/gooddata/warehouse/WarehouseUser.java | 2 ++ .../gooddata/warehouse/WarehouseUserNotFoundException.java | 2 ++ src/main/java/com/gooddata/warehouse/WarehouseUsers.java | 2 ++ .../com/gooddata/warehouse/WarehouseUsersDeserializer.java | 6 ++++-- .../com/gooddata/warehouse/WarehouseUsersSerializer.java | 6 ++++-- src/main/java/com/gooddata/warehouse/Warehouses.java | 2 ++ .../com/gooddata/warehouse/WarehousesDeserializer.java | 6 ++++-- .../java/com/gooddata/warehouse/WarehousesSerializer.java | 6 ++++-- src/test/java/com/gooddata/AbstractGoodDataAT.java | 2 ++ src/test/java/com/gooddata/AbstractGoodDataIT.java | 6 ++++-- src/test/java/com/gooddata/AbstractServiceTest.java | 2 ++ src/test/java/com/gooddata/Example.java | 6 ++++-- src/test/java/com/gooddata/GoodDataRestExceptionTest.java | 2 ++ src/test/java/com/gooddata/GoodDataSettingsTest.java | 2 ++ src/test/java/com/gooddata/JsonMatchers.java | 2 ++ src/test/java/com/gooddata/UriPrefixerTest.java | 6 ++++-- src/test/java/com/gooddata/account/AccountServiceAT.java | 2 ++ src/test/java/com/gooddata/account/AccountServiceIT.java | 6 ++++-- src/test/java/com/gooddata/account/AccountTest.java | 2 ++ .../java/com/gooddata/collections/PageRequestTest.java | 2 ++ .../java/com/gooddata/collections/PageableListTest.java | 2 ++ src/test/java/com/gooddata/collections/PagingTest.java | 2 ++ src/test/java/com/gooddata/collections/UriPageTest.java | 2 ++ .../java/com/gooddata/connector/ConnectorServiceIT.java | 2 ++ .../gooddata/connector/IntegrationProcessStatusTest.java | 6 ++++-- src/test/java/com/gooddata/connector/IntegrationTest.java | 2 ++ .../java/com/gooddata/connector/ProcessExecutionTest.java | 6 ++++-- .../java/com/gooddata/connector/ProcessStatusTest.java | 2 ++ src/test/java/com/gooddata/connector/StatusTest.java | 6 ++++-- .../gooddata/connector/Zendesk4ProcessExecutionTest.java | 6 ++++-- .../java/com/gooddata/connector/Zendesk4SettingsTest.java | 6 ++++-- .../gooddata/dataload/processes/DataloadProcessTest.java | 2 ++ .../gooddata/dataload/processes/DataloadProcessesTest.java | 6 ++++-- .../dataload/processes/ProcessExecutionDetailTest.java | 2 ++ .../dataload/processes/ProcessExecutionTaskTest.java | 2 ++ .../gooddata/dataload/processes/ProcessExecutionTest.java | 2 ++ .../com/gooddata/dataload/processes/ProcessIdMatcher.java | 2 ++ .../com/gooddata/dataload/processes/ProcessServiceAT.java | 2 ++ .../com/gooddata/dataload/processes/ProcessServiceIT.java | 2 ++ .../gooddata/dataload/processes/ProcessServiceTest.java | 6 ++++-- .../java/com/gooddata/dataload/processes/ScheduleTest.java | 2 ++ .../com/gooddata/dataload/processes/SchedulesTest.java | 2 ++ src/test/java/com/gooddata/dataset/DatasetLinksTest.java | 6 ++++-- .../java/com/gooddata/dataset/DatasetManifestTest.java | 6 ++++-- src/test/java/com/gooddata/dataset/DatasetServiceAT.java | 2 ++ src/test/java/com/gooddata/dataset/DatasetServiceIT.java | 2 ++ src/test/java/com/gooddata/dataset/DatasetServiceTest.java | 6 ++++-- src/test/java/com/gooddata/dataset/DatasetTest.java | 6 ++++-- src/test/java/com/gooddata/dataset/DatasetsTest.java | 2 ++ src/test/java/com/gooddata/dataset/MaqlDmlTest.java | 6 ++++-- src/test/java/com/gooddata/dataset/PullTaskTest.java | 2 ++ src/test/java/com/gooddata/dataset/PullTest.java | 2 ++ src/test/java/com/gooddata/dataset/TaskStateTest.java | 7 ++++--- .../java/com/gooddata/dataset/UploadStatisticsTest.java | 2 ++ src/test/java/com/gooddata/dataset/UploadTest.java | 2 ++ src/test/java/com/gooddata/dataset/UploadsInfoTest.java | 2 ++ src/test/java/com/gooddata/dataset/UploadsTest.java | 2 ++ .../com/gooddata/featureflag/FeatureFlagServiceAT.java | 7 ++++--- .../com/gooddata/featureflag/FeatureFlagServiceIT.java | 6 ++++-- .../com/gooddata/featureflag/FeatureFlagServiceTest.java | 6 ++++-- .../java/com/gooddata/featureflag/FeatureFlagsTest.java | 6 ++++-- .../com/gooddata/featureflag/ProjectFeatureFlagTest.java | 6 ++++-- .../com/gooddata/featureflag/ProjectFeatureFlagsTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/AboutLinksTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/AsyncTaskTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/DataStoreServiceIT.java | 2 ++ src/test/java/com/gooddata/gdc/DatastoreServiceAT.java | 2 ++ src/test/java/com/gooddata/gdc/ErrorStructureTest.java | 2 ++ src/test/java/com/gooddata/gdc/GdcErrorTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/GdcServiceIT.java | 2 ++ src/test/java/com/gooddata/gdc/GdcTest.java | 2 ++ src/test/java/com/gooddata/gdc/LinkEntriesTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/RootLinksTest.java | 6 ++++-- src/test/java/com/gooddata/gdc/TaskStatusTest.java | 2 ++ src/test/java/com/gooddata/gdc/UriResponseTest.java | 6 ++++-- .../java/com/gooddata/md/AttributeDisplayFormTest.java | 2 ++ src/test/java/com/gooddata/md/AttributeElementTest.java | 7 ++++--- src/test/java/com/gooddata/md/AttributeElementsTest.java | 7 ++++--- src/test/java/com/gooddata/md/AttributeSortTest.java | 7 ++++--- src/test/java/com/gooddata/md/AttributeTest.java | 6 ++++-- src/test/java/com/gooddata/md/ColumnTest.java | 7 ++++--- src/test/java/com/gooddata/md/DataLoadingColumnTest.java | 7 ++++--- src/test/java/com/gooddata/md/DatasetTest.java | 7 ++++--- src/test/java/com/gooddata/md/DimensionTest.java | 6 ++++-- src/test/java/com/gooddata/md/DisplayFormTest.java | 6 ++++-- src/test/java/com/gooddata/md/EntryTest.java | 6 ++++-- src/test/java/com/gooddata/md/ExportImportServiceAT.java | 7 ++++--- src/test/java/com/gooddata/md/ExpressionTest.java | 6 ++++-- src/test/java/com/gooddata/md/FactTest.java | 6 ++++-- src/test/java/com/gooddata/md/KeyTest.java | 6 ++++-- src/test/java/com/gooddata/md/MetaTest.java | 6 ++++-- src/test/java/com/gooddata/md/MetadataServiceAT.java | 2 ++ src/test/java/com/gooddata/md/MetadataServiceIT.java | 6 ++++-- src/test/java/com/gooddata/md/MetadataServiceTest.java | 6 ++++-- src/test/java/com/gooddata/md/MetricTest.java | 6 ++++-- src/test/java/com/gooddata/md/NestedAttributeTest.java | 6 ++++-- src/test/java/com/gooddata/md/ObjTest.java | 6 ++++-- src/test/java/com/gooddata/md/ProjectDashboardTest.java | 2 ++ src/test/java/com/gooddata/md/QueryTest.java | 6 ++++-- src/test/java/com/gooddata/md/RestrictionTest.java | 6 ++++-- src/test/java/com/gooddata/md/ScheduledMailTest.java | 6 ++++-- src/test/java/com/gooddata/md/TableDataLoadTest.java | 7 ++++--- src/test/java/com/gooddata/md/TableTest.java | 7 ++++--- .../com/gooddata/md/maintenance/ExportImportServiceIT.java | 7 ++++--- .../gooddata/md/maintenance/ExportImportServiceTest.java | 7 ++++--- .../com/gooddata/md/maintenance/PartialMdArtifactTest.java | 2 ++ .../com/gooddata/md/maintenance/PartialMdExportTest.java | 2 ++ .../gooddata/md/maintenance/PartialMdExportTokenTest.java | 2 ++ .../java/com/gooddata/md/report/AttributeInGridTest.java | 6 ++++-- .../gooddata/md/report/GridElementDeserializerTest.java | 7 ++++--- .../com/gooddata/md/report/GridElementSerializerTest.java | 7 ++++--- .../md/report/GridReportDefinitionContentTest.java | 6 ++++-- src/test/java/com/gooddata/md/report/GridTest.java | 6 ++++-- .../java/com/gooddata/md/report/MetricElementTest.java | 6 ++++-- .../md/report/OneNumberReportDefinitionContentTest.java | 6 ++++-- .../gooddata/md/report/ReportDefinitionContentTest.java | 6 ++++-- .../java/com/gooddata/md/report/ReportDefinitionTest.java | 6 ++++-- src/test/java/com/gooddata/md/report/ReportServiceAT.java | 2 ++ src/test/java/com/gooddata/md/report/ReportTest.java | 6 ++++-- src/test/java/com/gooddata/md/report/TotalTest.java | 7 ++++--- src/test/java/com/gooddata/model/DiffRequestTest.java | 6 ++++-- src/test/java/com/gooddata/model/MaqlDdlLinksTest.java | 6 ++++-- src/test/java/com/gooddata/model/MaqlDdlTest.java | 6 ++++-- src/test/java/com/gooddata/model/ModelDiffTest.java | 6 ++++-- src/test/java/com/gooddata/model/ModelServiceAT.java | 2 ++ src/test/java/com/gooddata/model/ModelServiceIT.java | 2 ++ .../com/gooddata/notification/NotificationServiceAT.java | 7 ++++--- .../com/gooddata/notification/NotificationServiceIT.java | 7 ++++--- .../com/gooddata/notification/NotificationServiceTest.java | 7 ++++--- .../java/com/gooddata/notification/ProjectEventTest.java | 7 ++++--- src/test/java/com/gooddata/project/ProjectIdMatcher.java | 2 ++ src/test/java/com/gooddata/project/ProjectServiceAT.java | 2 ++ src/test/java/com/gooddata/project/ProjectServiceIT.java | 2 ++ src/test/java/com/gooddata/project/ProjectServiceTest.java | 6 ++++-- .../java/com/gooddata/project/ProjectTemplateTest.java | 6 ++++-- .../java/com/gooddata/project/ProjectTemplatesTest.java | 6 ++++-- src/test/java/com/gooddata/project/ProjectTest.java | 2 ++ .../gooddata/project/ProjectValidationResultItemTest.java | 2 ++ .../gooddata/project/ProjectValidationResultParamTest.java | 2 ++ .../project/ProjectValidationResultSliElParamTest.java | 2 ++ .../com/gooddata/project/ProjectValidationResultTest.java | 2 ++ .../com/gooddata/project/ProjectValidationResultsTest.java | 2 ++ .../com/gooddata/project/ProjectValidationTypeTest.java | 2 ++ .../java/com/gooddata/project/ProjectValidationsTest.java | 2 ++ src/test/java/com/gooddata/project/RoleTest.java | 2 ++ src/test/java/com/gooddata/project/RolesTest.java | 2 ++ src/test/java/com/gooddata/project/UserTest.java | 2 ++ src/test/java/com/gooddata/project/UsersTest.java | 2 ++ .../java/com/gooddata/report/ExecuteDefinitionTest.java | 6 ++++-- src/test/java/com/gooddata/report/ExecuteReportTest.java | 6 ++++-- src/test/java/com/gooddata/report/ReportServiceIT.java | 2 ++ .../java/com/gooddata/util/BooleanDeserializerTest.java | 2 ++ src/test/java/com/gooddata/util/BooleanIntegerClass.java | 2 ++ .../com/gooddata/util/BooleanIntegerSerializerTest.java | 2 ++ src/test/java/com/gooddata/util/BooleanStringClass.java | 2 ++ .../com/gooddata/util/BooleanStringSerializerTest.java | 2 ++ src/test/java/com/gooddata/util/GDDateClass.java | 2 ++ .../java/com/gooddata/util/GDDateDeserializerTest.java | 2 ++ src/test/java/com/gooddata/util/GDDateSerializerTest.java | 2 ++ src/test/java/com/gooddata/util/GDDateTimeClass.java | 2 ++ .../java/com/gooddata/util/GDDateTimeDeserializerTest.java | 2 ++ .../java/com/gooddata/util/GDDateTimeSerializerTest.java | 2 ++ src/test/java/com/gooddata/util/ISODateClass.java | 2 ++ .../com/gooddata/util/ISODateTimeDeserializerTest.java | 2 ++ .../java/com/gooddata/util/ISODateTimeSerializerTest.java | 2 ++ src/test/java/com/gooddata/util/ResourceUtils.java | 7 ++++--- src/test/java/com/gooddata/util/TagsDeserializerTest.java | 2 ++ src/test/java/com/gooddata/util/TagsSerializerTest.java | 6 ++++-- src/test/java/com/gooddata/util/TagsTestClass.java | 6 ++++-- src/test/java/com/gooddata/util/ZipHelperTest.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseIdMatcher.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseServiceAT.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseServiceIT.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseTaskTest.java | 2 ++ src/test/java/com/gooddata/warehouse/WarehouseTest.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseUserTest.java | 2 ++ .../java/com/gooddata/warehouse/WarehouseUsersTest.java | 2 ++ src/test/java/com/gooddata/warehouse/WarehousesTest.java | 2 ++ 392 files changed, 1184 insertions(+), 442 deletions(-) create mode 100644 src/license_header.txt diff --git a/README.md b/README.md index a781fd94f..3a2a06b59 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 and currently the SDK is transitioned to be an official GoodData project. +GoodData Corporation provides this software "as-is" under conditions +specified in the [license](LICENSE.txt). ## Usage diff --git a/pom.xml b/pom.xml index 1cc61db08..0699f595f 100644 --- a/pom.xml +++ b/pom.xml @@ -166,7 +166,7 @@ license-maven-plugin 3.0 - Copyright (C) ${inceptionYear}-${currentYear}, GoodData(R) Corporation. All rights reserved. +
src/license_header.txt
true true true diff --git a/src/license_header.txt b/src/license_header.txt new file mode 100644 index 000000000..b12ff63d8 --- /dev/null +++ b/src/license_header.txt @@ -0,0 +1,3 @@ +Copyright (C) ${inceptionYear}-${currentYear}, GoodData(R) Corporation. All rights reserved. +This source code is licensed under the BSD-style license found in the +LICENSE.txt file in the root directory of this source tree. \ No newline at end of file diff --git a/src/main/java/com/gooddata/AbstractPollHandler.java b/src/main/java/com/gooddata/AbstractPollHandler.java index 304343c47..f07ba6403 100644 --- a/src/main/java/com/gooddata/AbstractPollHandler.java +++ b/src/main/java/com/gooddata/AbstractPollHandler.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/AbstractPollHandlerBase.java b/src/main/java/com/gooddata/AbstractPollHandlerBase.java index 086cc8364..61b2f7bff 100644 --- a/src/main/java/com/gooddata/AbstractPollHandlerBase.java +++ b/src/main/java/com/gooddata/AbstractPollHandlerBase.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 8d728411c..642d42b32 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/FutureResult.java b/src/main/java/com/gooddata/FutureResult.java index b5458e810..d35076444 100644 --- a/src/main/java/com/gooddata/FutureResult.java +++ b/src/main/java/com/gooddata/FutureResult.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index bc952736d..fe069ee71 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/GoodDataException.java b/src/main/java/com/gooddata/GoodDataException.java index 0b88ab4cb..c3dd877a5 100644 --- a/src/main/java/com/gooddata/GoodDataException.java +++ b/src/main/java/com/gooddata/GoodDataException.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 897f2406c..8d5fffdcd 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index 4a385989d..46ccd30ff 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java index f534a9d77..ab9528204 100644 --- a/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java +++ b/src/main/java/com/gooddata/HeaderSettingRequestInterceptor.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/PollHandler.java b/src/main/java/com/gooddata/PollHandler.java index b06b2ca8c..a73aff3ec 100644 --- a/src/main/java/com/gooddata/PollHandler.java +++ b/src/main/java/com/gooddata/PollHandler.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/PollResult.java b/src/main/java/com/gooddata/PollResult.java index 9781a9aa4..a3c41c3e6 100644 --- a/src/main/java/com/gooddata/PollResult.java +++ b/src/main/java/com/gooddata/PollResult.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/SimplePollHandler.java b/src/main/java/com/gooddata/SimplePollHandler.java index c6fb41c4c..6285e927a 100644 --- a/src/main/java/com/gooddata/SimplePollHandler.java +++ b/src/main/java/com/gooddata/SimplePollHandler.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index a3bfe7e95..ed0f74a79 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java index fdf3f4ba3..e3428cf04 100644 --- a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java +++ b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 0b701cd00..a8fea9ef0 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/account/AccountNotFoundException.java b/src/main/java/com/gooddata/account/AccountNotFoundException.java index 9006d9b2e..40b3b1482 100644 --- a/src/main/java/com/gooddata/account/AccountNotFoundException.java +++ b/src/main/java/com/gooddata/account/AccountNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index 52058a2dd..caa5ef867 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/Page.java b/src/main/java/com/gooddata/collections/Page.java index e40e72f79..aa0430326 100644 --- a/src/main/java/com/gooddata/collections/Page.java +++ b/src/main/java/com/gooddata/collections/Page.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index 8393f392d..b65be4c45 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java index 18cd669aa..0c53bd6e2 100644 --- a/src/main/java/com/gooddata/collections/PageableList.java +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index 3e76f1d04..a4d8e2a03 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/PageableListSerializer.java b/src/main/java/com/gooddata/collections/PageableListSerializer.java index e9dffd73b..ec53d3c21 100644 --- a/src/main/java/com/gooddata/collections/PageableListSerializer.java +++ b/src/main/java/com/gooddata/collections/PageableListSerializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/Paging.java b/src/main/java/com/gooddata/collections/Paging.java index 6f56bc75b..be26fdc12 100644 --- a/src/main/java/com/gooddata/collections/Paging.java +++ b/src/main/java/com/gooddata/collections/Paging.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index 3922c0116..c9d41b96b 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/ConnectorException.java b/src/main/java/com/gooddata/connector/ConnectorException.java index f3232f279..cda321d58 100644 --- a/src/main/java/com/gooddata/connector/ConnectorException.java +++ b/src/main/java/com/gooddata/connector/ConnectorException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/ConnectorService.java b/src/main/java/com/gooddata/connector/ConnectorService.java index a60a338a1..86272687b 100644 --- a/src/main/java/com/gooddata/connector/ConnectorService.java +++ b/src/main/java/com/gooddata/connector/ConnectorService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/ConnectorType.java b/src/main/java/com/gooddata/connector/ConnectorType.java index eb018969c..d4db600f2 100644 --- a/src/main/java/com/gooddata/connector/ConnectorType.java +++ b/src/main/java/com/gooddata/connector/ConnectorType.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index dc715e3f1..f63321b69 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java index 6b3253f6c..96c312035 100644 --- a/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java +++ b/src/main/java/com/gooddata/connector/IntegrationNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index bb325c202..0daf17cb4 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/ProcessExecution.java b/src/main/java/com/gooddata/connector/ProcessExecution.java index 608f87dd0..75a583477 100644 --- a/src/main/java/com/gooddata/connector/ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/ProcessExecution.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/ProcessStatus.java b/src/main/java/com/gooddata/connector/ProcessStatus.java index 7f2ece5a4..29becbf03 100644 --- a/src/main/java/com/gooddata/connector/ProcessStatus.java +++ b/src/main/java/com/gooddata/connector/ProcessStatus.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/Settings.java b/src/main/java/com/gooddata/connector/Settings.java index 93377b5f8..5fe32a69e 100644 --- a/src/main/java/com/gooddata/connector/Settings.java +++ b/src/main/java/com/gooddata/connector/Settings.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java index 5ed38d3c6..40fdc54c8 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/src/main/java/com/gooddata/connector/Status.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 8fd3e0e3d..41b887346 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java index cd3b33a40..7b5ea53e1 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java index a7be6a876..afd76d510 100644 --- a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java +++ b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 1a479af72..164debba0 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java index 13dca611c..0a4e92c7d 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 036811338..a7a44eb48 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index 43ecae2d5..c3df37e56 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java index 62cc3d114..1b9d27aef 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java index ba9ca1e30..12c895539 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java index 1875082e0..4240e9e6f 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 83c74b9dd..be1ad91a8 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessType.java b/src/main/java/com/gooddata/dataload/processes/ProcessType.java index cea285927..ca4db3140 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessType.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessType.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index f8c15ead5..5f1dc32d9 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java index 72ec80e76..8523eb86f 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java index de30f1641..3698c09f7 100644 --- a/src/main/java/com/gooddata/dataload/processes/ScheduleState.java +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleState.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/Schedules.java b/src/main/java/com/gooddata/dataload/processes/Schedules.java index ade4d3af9..208aa6575 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedules.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedules.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java index 1d3b6a118..70a1d117b 100644 --- a/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java +++ b/src/main/java/com/gooddata/dataload/processes/SchedulesDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/Dataset.java b/src/main/java/com/gooddata/dataset/Dataset.java index 54288302a..913418958 100644 --- a/src/main/java/com/gooddata/dataset/Dataset.java +++ b/src/main/java/com/gooddata/dataset/Dataset.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/DatasetException.java b/src/main/java/com/gooddata/dataset/DatasetException.java index b217d0cb3..af2dacf25 100644 --- a/src/main/java/com/gooddata/dataset/DatasetException.java +++ b/src/main/java/com/gooddata/dataset/DatasetException.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/DatasetLinks.java b/src/main/java/com/gooddata/dataset/DatasetLinks.java index 0b380de0d..b9b74ed91 100644 --- a/src/main/java/com/gooddata/dataset/DatasetLinks.java +++ b/src/main/java/com/gooddata/dataset/DatasetLinks.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 6455e35f9..30656428e 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/DatasetManifests.java b/src/main/java/com/gooddata/dataset/DatasetManifests.java index 267cfc816..622c28294 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifests.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifests.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java index 034a35bcf..3ee4b1f01 100644 --- a/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java +++ b/src/main/java/com/gooddata/dataset/DatasetNotFoundException.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index c546e7e2c..0c559612c 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/Datasets.java b/src/main/java/com/gooddata/dataset/Datasets.java index e3ec2f65e..eee0f024e 100644 --- a/src/main/java/com/gooddata/dataset/Datasets.java +++ b/src/main/java/com/gooddata/dataset/Datasets.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java index e018e6036..65a0162e5 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/EtlModeType.java b/src/main/java/com/gooddata/dataset/EtlModeType.java index c4f643547..ab44dc088 100644 --- a/src/main/java/com/gooddata/dataset/EtlModeType.java +++ b/src/main/java/com/gooddata/dataset/EtlModeType.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/LookupMode.java b/src/main/java/com/gooddata/dataset/LookupMode.java index 03e55a81c..76171bc79 100644 --- a/src/main/java/com/gooddata/dataset/LookupMode.java +++ b/src/main/java/com/gooddata/dataset/LookupMode.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/MaqlDml.java b/src/main/java/com/gooddata/dataset/MaqlDml.java index 28934118d..6228f9bb2 100644 --- a/src/main/java/com/gooddata/dataset/MaqlDml.java +++ b/src/main/java/com/gooddata/dataset/MaqlDml.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.gooddata.gdc.AbstractMaql; diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index bb3629e9f..4d5d98b75 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index b69787f8f..8530a5525 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java index 02b734850..c73040024 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/dataset/Upload.java b/src/main/java/com/gooddata/dataset/Upload.java index ca9b6b39c..b834e4fe1 100644 --- a/src/main/java/com/gooddata/dataset/Upload.java +++ b/src/main/java/com/gooddata/dataset/Upload.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/UploadMode.java b/src/main/java/com/gooddata/dataset/UploadMode.java index b10b502c4..a07819b09 100644 --- a/src/main/java/com/gooddata/dataset/UploadMode.java +++ b/src/main/java/com/gooddata/dataset/UploadMode.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/UploadStatistics.java b/src/main/java/com/gooddata/dataset/UploadStatistics.java index 80fdfe1a1..478c36698 100644 --- a/src/main/java/com/gooddata/dataset/UploadStatistics.java +++ b/src/main/java/com/gooddata/dataset/UploadStatistics.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/src/main/java/com/gooddata/dataset/Uploads.java index 26a0080df..3edf117bd 100644 --- a/src/main/java/com/gooddata/dataset/Uploads.java +++ b/src/main/java/com/gooddata/dataset/Uploads.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/dataset/UploadsInfo.java b/src/main/java/com/gooddata/dataset/UploadsInfo.java index 43fab465a..4b305d2c1 100644 --- a/src/main/java/com/gooddata/dataset/UploadsInfo.java +++ b/src/main/java/com/gooddata/dataset/UploadsInfo.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/src/main/java/com/gooddata/featureflag/FeatureFlag.java index 0cdae3566..193645d46 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlag.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java index 415e4a408..af15ea202 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlagService.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlagService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index 4ecce59b3..57ef25a04 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java index da2661715..af72a6f06 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java index 758778cd3..f3db98dc2 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/AboutLinks.java b/src/main/java/com/gooddata/gdc/AboutLinks.java index cb25c68e0..de90d6726 100644 --- a/src/main/java/com/gooddata/gdc/AboutLinks.java +++ b/src/main/java/com/gooddata/gdc/AboutLinks.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/src/main/java/com/gooddata/gdc/AbstractMaql.java index d0bd55318..e73d53ae3 100644 --- a/src/main/java/com/gooddata/gdc/AbstractMaql.java +++ b/src/main/java/com/gooddata/gdc/AbstractMaql.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java index 799c7a62e..e17dcb870 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/DataStoreException.java b/src/main/java/com/gooddata/gdc/DataStoreException.java index 7a3316004..c2cad667a 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreException.java +++ b/src/main/java/com/gooddata/gdc/DataStoreException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 965620c65..21c431049 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index ff7ef3309..1f10f2a77 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 7dad58440..63f53d8de 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/GdcError.java b/src/main/java/com/gooddata/gdc/GdcError.java index 8f81d3a2e..d524ce845 100644 --- a/src/main/java/com/gooddata/gdc/GdcError.java +++ b/src/main/java/com/gooddata/gdc/GdcError.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/GdcSardine.java b/src/main/java/com/gooddata/gdc/GdcSardine.java index 7f1b3d755..03c053b80 100644 --- a/src/main/java/com/gooddata/gdc/GdcSardine.java +++ b/src/main/java/com/gooddata/gdc/GdcSardine.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/GdcService.java b/src/main/java/com/gooddata/gdc/GdcService.java index 2b8100a21..533e27a99 100644 --- a/src/main/java/com/gooddata/gdc/GdcService.java +++ b/src/main/java/com/gooddata/gdc/GdcService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/src/main/java/com/gooddata/gdc/LinkEntries.java index f56d7ac4d..965e0814c 100644 --- a/src/main/java/com/gooddata/gdc/LinkEntries.java +++ b/src/main/java/com/gooddata/gdc/LinkEntries.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/RootLinks.java b/src/main/java/com/gooddata/gdc/RootLinks.java index 14af65a7d..f52d0f5d9 100644 --- a/src/main/java/com/gooddata/gdc/RootLinks.java +++ b/src/main/java/com/gooddata/gdc/RootLinks.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index dfff658e6..1b5fc5b96 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index 3889baeea..3c91eadf0 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index 7f383a0d8..a3b753cbe 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java index 179ef3a2f..a22988efe 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index 2182bcf23..7d02795c5 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index 4e00f3a92..c0cbb6f87 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/src/main/java/com/gooddata/md/AttributeElement.java index 2a2dca5f7..04ec0f850 100644 --- a/src/main/java/com/gooddata/md/AttributeElement.java +++ b/src/main/java/com/gooddata/md/AttributeElement.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index 866e4342a..84e44314f 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.apache.commons.lang.Validate.notNull; diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/src/main/java/com/gooddata/md/AttributeSort.java index f21a07714..73fedb906 100644 --- a/src/main/java/com/gooddata/md/AttributeSort.java +++ b/src/main/java/com/gooddata/md/AttributeSort.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/md/Column.java b/src/main/java/com/gooddata/md/Column.java index 892d28c15..9bfeb9e8c 100644 --- a/src/main/java/com/gooddata/md/Column.java +++ b/src/main/java/com/gooddata/md/Column.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/DashboardAttachment.java b/src/main/java/com/gooddata/md/DashboardAttachment.java index ecf13b113..8a541280e 100644 --- a/src/main/java/com/gooddata/md/DashboardAttachment.java +++ b/src/main/java/com/gooddata/md/DashboardAttachment.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index fcbd6f4ed..fe883011b 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 8450df70d..1fdaa2ba3 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index cbbcb2777..8203f5353 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 750a4e001..2b0d5941a 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 58f19dcab..361baab7f 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java index b010b6f28..e6582364c 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/src/main/java/com/gooddata/md/Expression.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index f9c7f2757..06e3c40b1 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index ef562b1f3..d776940da 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index 60acdfa2f..df0018534 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index 82228b48c..922c191bc 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 87edc6e5e..5cf185d03 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index 98c64b43a..666f2c39a 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java index 49462cc55..5f612ab2b 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 7284b59c3..5354cef71 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index db5f46b39..48b17e9ab 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index 4c5679ec0..3e3062d0d 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 082ec6b6b..72cbce184 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/NonUniqueObjException.java b/src/main/java/com/gooddata/md/NonUniqueObjException.java index 329baac1a..dd27e0b50 100644 --- a/src/main/java/com/gooddata/md/NonUniqueObjException.java +++ b/src/main/java/com/gooddata/md/NonUniqueObjException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Obj.java b/src/main/java/com/gooddata/md/Obj.java index 1da39a679..2853f4037 100644 --- a/src/main/java/com/gooddata/md/Obj.java +++ b/src/main/java/com/gooddata/md/Obj.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ObjCreateException.java b/src/main/java/com/gooddata/md/ObjCreateException.java index c72e17528..d2bceec50 100644 --- a/src/main/java/com/gooddata/md/ObjCreateException.java +++ b/src/main/java/com/gooddata/md/ObjCreateException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ObjNotFoundException.java b/src/main/java/com/gooddata/md/ObjNotFoundException.java index 75df30815..5eb8032ae 100644 --- a/src/main/java/com/gooddata/md/ObjNotFoundException.java +++ b/src/main/java/com/gooddata/md/ObjNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ObjUpdateException.java b/src/main/java/com/gooddata/md/ObjUpdateException.java index 9af2dba14..9a0abc42a 100644 --- a/src/main/java/com/gooddata/md/ObjUpdateException.java +++ b/src/main/java/com/gooddata/md/ObjUpdateException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/src/main/java/com/gooddata/md/ProjectDashboard.java index 4558cde0a..7fc345144 100644 --- a/src/main/java/com/gooddata/md/ProjectDashboard.java +++ b/src/main/java/com/gooddata/md/ProjectDashboard.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index 628600b1b..d97217208 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Queryable.java b/src/main/java/com/gooddata/md/Queryable.java index 03259c5e7..c796080fd 100644 --- a/src/main/java/com/gooddata/md/Queryable.java +++ b/src/main/java/com/gooddata/md/Queryable.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java index 6f2af36a8..d66bde961 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Restriction.java b/src/main/java/com/gooddata/md/Restriction.java index 6b04fa590..45af7c069 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/src/main/java/com/gooddata/md/Restriction.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 76b8093de..8a2725091 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java index f5a9168f0..a60a09545 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Table.java b/src/main/java/com/gooddata/md/Table.java index c0eb80f86..972a668dd 100644 --- a/src/main/java/com/gooddata/md/Table.java +++ b/src/main/java/com/gooddata/md/Table.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/TableDataLoad.java b/src/main/java/com/gooddata/md/TableDataLoad.java index d36d13fdf..3f391bc00 100644 --- a/src/main/java/com/gooddata/md/TableDataLoad.java +++ b/src/main/java/com/gooddata/md/TableDataLoad.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/Updatable.java b/src/main/java/com/gooddata/md/Updatable.java index f3c4f4717..9f409220b 100644 --- a/src/main/java/com/gooddata/md/Updatable.java +++ b/src/main/java/com/gooddata/md/Updatable.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/Usage.java b/src/main/java/com/gooddata/md/Usage.java index f26c9bf9a..6c99cf4a1 100644 --- a/src/main/java/com/gooddata/md/Usage.java +++ b/src/main/java/com/gooddata/md/Usage.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java index 14ef0cce3..0a51821a1 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java index ca8c54681..146a0acc5 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportException.java b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java index b640e6c03..a0ad6b85c 100644 --- a/src/main/java/com/gooddata/md/maintenance/ExportImportException.java +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java index d3078f155..2e0726f3a 100644 --- a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java index ab09d1b61..c30bd877e 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java index 338b0ed02..34ebd6f8b 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java index e7bea63bb..a18f9f3e9 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 635cb9e84..28e903019 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index 4130f64ab..b13551481 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 9f921c751..b4982538e 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/GridElement.java b/src/main/java/com/gooddata/md/report/GridElement.java index db247c5ef..59a8a4d6d 100644 --- a/src/main/java/com/gooddata/md/report/GridElement.java +++ b/src/main/java/com/gooddata/md/report/GridElement.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/GridElementDeserializer.java b/src/main/java/com/gooddata/md/report/GridElementDeserializer.java index 9a2d5335c..3e6ed3574 100644 --- a/src/main/java/com/gooddata/md/report/GridElementDeserializer.java +++ b/src/main/java/com/gooddata/md/report/GridElementDeserializer.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.fasterxml.jackson.core.JsonParser; diff --git a/src/main/java/com/gooddata/md/report/GridElementSerializer.java b/src/main/java/com/gooddata/md/report/GridElementSerializer.java index 3e5bcd4ad..4b2e06587 100644 --- a/src/main/java/com/gooddata/md/report/GridElementSerializer.java +++ b/src/main/java/com/gooddata/md/report/GridElementSerializer.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.fasterxml.jackson.core.JsonGenerationException; diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index b3504dcdf..fb89a9612 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index ce042aa8f..3895e3421 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.fasterxml.jackson.annotation.JsonCreator; diff --git a/src/main/java/com/gooddata/md/report/MetricGroup.java b/src/main/java/com/gooddata/md/report/MetricGroup.java index 6cf1f2d1e..511cf7a70 100644 --- a/src/main/java/com/gooddata/md/report/MetricGroup.java +++ b/src/main/java/com/gooddata/md/report/MetricGroup.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; /** diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index b98278c0f..d7d556ae1 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 058224a07..259d6b76c 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 2944df08d..0d7fb34f8 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index a828bc034..e967aed80 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/md/report/Total.java b/src/main/java/com/gooddata/md/report/Total.java index 8b5d2be1c..f0cbd4839 100644 --- a/src/main/java/com/gooddata/md/report/Total.java +++ b/src/main/java/com/gooddata/md/report/Total.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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.springframework.util.CollectionUtils; diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index a4ffc3632..f57e7897a 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/model/MaqlDdl.java b/src/main/java/com/gooddata/model/MaqlDdl.java index 0e0b19195..4ffd53e4e 100644 --- a/src/main/java/com/gooddata/model/MaqlDdl.java +++ b/src/main/java/com/gooddata/model/MaqlDdl.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/model/MaqlDdlLinks.java b/src/main/java/com/gooddata/model/MaqlDdlLinks.java index 6be97e64e..95fa50c62 100644 --- a/src/main/java/com/gooddata/model/MaqlDdlLinks.java +++ b/src/main/java/com/gooddata/model/MaqlDdlLinks.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index 009739992..c5d1892e2 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/model/ModelException.java b/src/main/java/com/gooddata/model/ModelException.java index 510685922..95e6af677 100644 --- a/src/main/java/com/gooddata/model/ModelException.java +++ b/src/main/java/com/gooddata/model/ModelException.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/model/ModelService.java b/src/main/java/com/gooddata/model/ModelService.java index c333bfb88..7a83e5b1b 100644 --- a/src/main/java/com/gooddata/model/ModelService.java +++ b/src/main/java/com/gooddata/model/ModelService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/notification/NotificationService.java b/src/main/java/com/gooddata/notification/NotificationService.java index a4333f460..b5155bbf1 100644 --- a/src/main/java/com/gooddata/notification/NotificationService.java +++ b/src/main/java/com/gooddata/notification/NotificationService.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java index 1d7e22e88..46f6e58d2 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/project/Environment.java b/src/main/java/com/gooddata/project/Environment.java index 7181e466d..ce6ae5a5c 100644 --- a/src/main/java/com/gooddata/project/Environment.java +++ b/src/main/java/com/gooddata/project/Environment.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 7d21620a1..445ba4a83 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java index fb063da68..030ebc0d9 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/main/java/com/gooddata/project/ProjectEnvironment.java b/src/main/java/com/gooddata/project/ProjectEnvironment.java index d9aebfe48..f87c9d595 100644 --- a/src/main/java/com/gooddata/project/ProjectEnvironment.java +++ b/src/main/java/com/gooddata/project/ProjectEnvironment.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectNotFoundException.java b/src/main/java/com/gooddata/project/ProjectNotFoundException.java index 08e1cbd95..519816d41 100644 --- a/src/main/java/com/gooddata/project/ProjectNotFoundException.java +++ b/src/main/java/com/gooddata/project/ProjectNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 5f38c4896..62177cc40 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java index 06c8eb916..b8747c586 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java index fec9a875a..809edd263 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/src/main/java/com/gooddata/project/ProjectValidationResult.java index abf2b7f42..a8810d73e 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResult.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResult.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index 26965d95a..9cd445cad 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java index c0e37f298..554b74716 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java index e4a59499c..e258d0163 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java index 1ed82d9a5..bbc7541c6 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultParam.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index 7ef574111..948e951ed 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java index 92b374b4b..8e828f5f5 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java index 0a35dfbd5..7c08537e1 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/src/main/java/com/gooddata/project/ProjectValidationType.java index c9fec0f33..458f11363 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationType.java +++ b/src/main/java/com/gooddata/project/ProjectValidationType.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java index ce55281d3..680d5f870 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/Projects.java b/src/main/java/com/gooddata/project/Projects.java index a59e28c04..b768694ec 100644 --- a/src/main/java/com/gooddata/project/Projects.java +++ b/src/main/java/com/gooddata/project/Projects.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index b74453927..2ad256603 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/RoleNotFoundException.java b/src/main/java/com/gooddata/project/RoleNotFoundException.java index 74346e12e..fe96603e4 100644 --- a/src/main/java/com/gooddata/project/RoleNotFoundException.java +++ b/src/main/java/com/gooddata/project/RoleNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/Roles.java b/src/main/java/com/gooddata/project/Roles.java index 081624f4f..bf3cf87e1 100644 --- a/src/main/java/com/gooddata/project/Roles.java +++ b/src/main/java/com/gooddata/project/Roles.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index d8a777ee0..5f295a088 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/Users.java b/src/main/java/com/gooddata/project/Users.java index 6704d24a4..e89aca3c9 100644 --- a/src/main/java/com/gooddata/project/Users.java +++ b/src/main/java/com/gooddata/project/Users.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/src/main/java/com/gooddata/project/UsersDeserializer.java index 0a45e5de4..c740f3192 100644 --- a/src/main/java/com/gooddata/project/UsersDeserializer.java +++ b/src/main/java/com/gooddata/project/UsersDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/report/ExecuteDefinition.java b/src/main/java/com/gooddata/report/ExecuteDefinition.java index a354afb85..12e352fba 100644 --- a/src/main/java/com/gooddata/report/ExecuteDefinition.java +++ b/src/main/java/com/gooddata/report/ExecuteDefinition.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ExecuteReport.java b/src/main/java/com/gooddata/report/ExecuteReport.java index d2bdf7c07..d97f9a2fc 100644 --- a/src/main/java/com/gooddata/report/ExecuteReport.java +++ b/src/main/java/com/gooddata/report/ExecuteReport.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/NoDataReportException.java b/src/main/java/com/gooddata/report/NoDataReportException.java index 2af3445bf..19f016438 100644 --- a/src/main/java/com/gooddata/report/NoDataReportException.java +++ b/src/main/java/com/gooddata/report/NoDataReportException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ReportException.java b/src/main/java/com/gooddata/report/ReportException.java index 02c1bf25d..2a9efd47a 100644 --- a/src/main/java/com/gooddata/report/ReportException.java +++ b/src/main/java/com/gooddata/report/ReportException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ReportExportFormat.java b/src/main/java/com/gooddata/report/ReportExportFormat.java index c017e3945..e6a857d0e 100644 --- a/src/main/java/com/gooddata/report/ReportExportFormat.java +++ b/src/main/java/com/gooddata/report/ReportExportFormat.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ReportRequest.java b/src/main/java/com/gooddata/report/ReportRequest.java index 2cb422132..e7c1ceff3 100644 --- a/src/main/java/com/gooddata/report/ReportRequest.java +++ b/src/main/java/com/gooddata/report/ReportRequest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index 06ef1e607..a312b88bc 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/main/java/com/gooddata/util/BooleanDeserializer.java b/src/main/java/com/gooddata/util/BooleanDeserializer.java index 8107e45e2..7b69f6b25 100644 --- a/src/main/java/com/gooddata/util/BooleanDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java index 527a99aba..24bf01797 100644 --- a/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanIntegerSerializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/BooleanStringSerializer.java b/src/main/java/com/gooddata/util/BooleanStringSerializer.java index d6d243379..037676ca3 100644 --- a/src/main/java/com/gooddata/util/BooleanStringSerializer.java +++ b/src/main/java/com/gooddata/util/BooleanStringSerializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/GDDateDeserializer.java b/src/main/java/com/gooddata/util/GDDateDeserializer.java index cc3677f4d..b4f7aa912 100644 --- a/src/main/java/com/gooddata/util/GDDateDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateDeserializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/GDDateSerializer.java b/src/main/java/com/gooddata/util/GDDateSerializer.java index a1e8dc7c7..4558fe13c 100644 --- a/src/main/java/com/gooddata/util/GDDateSerializer.java +++ b/src/main/java/com/gooddata/util/GDDateSerializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java index 26092e82e..a3ed4f898 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java index 4a909702c..cd522b11c 100644 --- a/src/main/java/com/gooddata/util/GDDateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/GDDateTimeSerializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java index a2ac81b8c..0067f99ff 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java index fb38942d9..6e8177831 100644 --- a/src/main/java/com/gooddata/util/ISODateTimeSerializer.java +++ b/src/main/java/com/gooddata/util/ISODateTimeSerializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java index 6415b3a5e..ca64aa79a 100644 --- a/src/main/java/com/gooddata/util/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/TagsDeserializer.java b/src/main/java/com/gooddata/util/TagsDeserializer.java index 98127c613..3b8bd509e 100644 --- a/src/main/java/com/gooddata/util/TagsDeserializer.java +++ b/src/main/java/com/gooddata/util/TagsDeserializer.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/TagsSerializer.java b/src/main/java/com/gooddata/util/TagsSerializer.java index dd539bc41..06e76f7a3 100644 --- a/src/main/java/com/gooddata/util/TagsSerializer.java +++ b/src/main/java/com/gooddata/util/TagsSerializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/Validate.java b/src/main/java/com/gooddata/util/Validate.java index 16cb0ec3f..dfa46431a 100644 --- a/src/main/java/com/gooddata/util/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/util/ZipHelper.java b/src/main/java/com/gooddata/util/ZipHelper.java index 5c793034f..397bab6d2 100644 --- a/src/main/java/com/gooddata/util/ZipHelper.java +++ b/src/main/java/com/gooddata/util/ZipHelper.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 1298be7a9..6ad9f83e9 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java index 4b3010397..330bea2dd 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 7edac4b7b..461a9d6e5 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseTask.java b/src/main/java/com/gooddata/warehouse/WarehouseTask.java index 1ba9dd875..b06e89ad7 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseTask.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseTask.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index d71a5136c..9369b3ce9 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java index b7aadb017..6a8ae8feb 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUserNotFoundException.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java index 434e7dec1..735a16e58 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUsers.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsers.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java index 54526e9f9..9db9c18be 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsersDeserializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java b/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java index 93968d55a..5a7bead6a 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUsersSerializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index 4ece0b196..96cd30754 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java index 0ac12c6d1..b69dfc100 100644 --- a/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java +++ b/src/main/java/com/gooddata/warehouse/WarehousesDeserializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java b/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java index bd8788f5a..bd4d9dd44 100644 --- a/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java +++ b/src/main/java/com/gooddata/warehouse/WarehousesSerializer.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 8f9552a0d..852626df4 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index c4445703d..ab12a237d 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/AbstractServiceTest.java b/src/test/java/com/gooddata/AbstractServiceTest.java index 3f797c34d..c91c8d258 100644 --- a/src/test/java/com/gooddata/AbstractServiceTest.java +++ b/src/test/java/com/gooddata/AbstractServiceTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index 775573849..f31da2f74 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index f400bb378..fe35ba5ac 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java index 5c92d912d..42bffade7 100644 --- a/src/test/java/com/gooddata/GoodDataSettingsTest.java +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index 2acb95c9a..f05c8c814 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/UriPrefixerTest.java b/src/test/java/com/gooddata/UriPrefixerTest.java index 8f02c9ab2..719b4e646 100644 --- a/src/test/java/com/gooddata/UriPrefixerTest.java +++ b/src/test/java/com/gooddata/UriPrefixerTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata; diff --git a/src/test/java/com/gooddata/account/AccountServiceAT.java b/src/test/java/com/gooddata/account/AccountServiceAT.java index 80abd1a46..864a930ef 100644 --- a/src/test/java/com/gooddata/account/AccountServiceAT.java +++ b/src/test/java/com/gooddata/account/AccountServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/account/AccountServiceIT.java b/src/test/java/com/gooddata/account/AccountServiceIT.java index f4ebebf5a..af2912354 100644 --- a/src/test/java/com/gooddata/account/AccountServiceIT.java +++ b/src/test/java/com/gooddata/account/AccountServiceIT.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index daa873f14..8e5827f92 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index 6424a6426..eabd27a9e 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/collections/PageableListTest.java b/src/test/java/com/gooddata/collections/PageableListTest.java index 86debeb89..3948e6eb1 100644 --- a/src/test/java/com/gooddata/collections/PageableListTest.java +++ b/src/test/java/com/gooddata/collections/PageableListTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java index e59bac7f2..67bf1f0fd 100644 --- a/src/test/java/com/gooddata/collections/PagingTest.java +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index 5259d67a9..42159516a 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 98e35a21e..117f75e33 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index cfccf9f29..33ddb7439 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index 23b3ca595..00e0dccb2 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java index 6e87b8cb6..776644b45 100644 --- a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/ProcessStatusTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java index 1808436ac..861d5495e 100644 --- a/src/test/java/com/gooddata/connector/ProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/StatusTest.java b/src/test/java/com/gooddata/connector/StatusTest.java index 22a8ae191..d8fa6d8b5 100644 --- a/src/test/java/com/gooddata/connector/StatusTest.java +++ b/src/test/java/com/gooddata/connector/StatusTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index af8e996aa..320af8ddb 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java index 45a0ac655..c47c57315 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index 76a54d773..c69796763 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java index 010642fc8..cf77010ef 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 067dc67a8..823d68cdc 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index 6134d18fd..9f4a38576 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index 133f069f2..98e698021 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java index 7a396511d..737a723e4 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index a91520643..6b16e481b 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 02f763261..2cc29cb42 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 5a44c6712..5a8ab2b54 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 101128017..2efa787e4 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java index 60b6054dc..376973542 100644 --- a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetLinksTest.java b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java index 5fef2ac3d..a7124ee1b 100644 --- a/src/test/java/com/gooddata/dataset/DatasetLinksTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index c99ee88ed..4a432d513 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index f6103fc9f..6bb89ffdb 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index 194208309..d00d95847 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index 790ce1e8d..d15a35312 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetTest.java b/src/test/java/com/gooddata/dataset/DatasetTest.java index cc6ea375e..90aa076ea 100644 --- a/src/test/java/com/gooddata/dataset/DatasetTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index 081c7aecc..1e5a916f4 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java index 6b21c9442..b9a2c1f10 100644 --- a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java +++ b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index 32d97ab25..7412daf9a 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java index 35df78883..b99051912 100644 --- a/src/test/java/com/gooddata/dataset/PullTest.java +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/TaskStateTest.java b/src/test/java/com/gooddata/dataset/TaskStateTest.java index c581c0eb0..593e62845 100644 --- a/src/test/java/com/gooddata/dataset/TaskStateTest.java +++ b/src/test/java/com/gooddata/dataset/TaskStateTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java index ecd7b491d..c32cc7de3 100644 --- a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/UploadTest.java b/src/test/java/com/gooddata/dataset/UploadTest.java index 0e1a53e33..56b7727e8 100644 --- a/src/test/java/com/gooddata/dataset/UploadTest.java +++ b/src/test/java/com/gooddata/dataset/UploadTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index fbccc47b5..939e1dd12 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java index 12f9cf29a..929411798 100644 --- a/src/test/java/com/gooddata/dataset/UploadsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java index 989d7e8d2..6e53fde7c 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceAT.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 9e466e600..4574f943b 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java index 62b2feec6..e4444263e 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java index 18a65c246..31a311adb 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java index e20fd6cbe..187af80d2 100644 --- a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java index 663e6e210..1b5b769df 100644 --- a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagsTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/AboutLinksTest.java b/src/test/java/com/gooddata/gdc/AboutLinksTest.java index 15d6458cb..efe9a0955 100644 --- a/src/test/java/com/gooddata/gdc/AboutLinksTest.java +++ b/src/test/java/com/gooddata/gdc/AboutLinksTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index 495e4e6ed..2e6275357 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index 52f6301a6..dbd201c4c 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index b3c8cfbd2..6ddb64af2 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index 29c71a7c6..857b6c607 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java index ceecf239a..fed25c0e4 100644 --- a/src/test/java/com/gooddata/gdc/GdcErrorTest.java +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index b67b8421f..98f503208 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 8433d0dab..27283571e 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index 7bdf95b53..0f7390453 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/RootLinksTest.java b/src/test/java/com/gooddata/gdc/RootLinksTest.java index 5caa6c1a2..0e26fb683 100644 --- a/src/test/java/com/gooddata/gdc/RootLinksTest.java +++ b/src/test/java/com/gooddata/gdc/RootLinksTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/TaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java index a71edff77..e2d1da35e 100644 --- a/src/test/java/com/gooddata/gdc/TaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index bbe38e214..4743ead86 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 47ed6b601..9b8b54455 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/AttributeElementTest.java b/src/test/java/com/gooddata/md/AttributeElementTest.java index ff89a556d..adda94868 100644 --- a/src/test/java/com/gooddata/md/AttributeElementTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/AttributeElementsTest.java b/src/test/java/com/gooddata/md/AttributeElementsTest.java index 2375e3c4d..a725b9fb3 100644 --- a/src/test/java/com/gooddata/md/AttributeElementsTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementsTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/AttributeSortTest.java b/src/test/java/com/gooddata/md/AttributeSortTest.java index 4f2fbfc80..56e0bd309 100644 --- a/src/test/java/com/gooddata/md/AttributeSortTest.java +++ b/src/test/java/com/gooddata/md/AttributeSortTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index ae7bf8dce..9689fed34 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/ColumnTest.java b/src/test/java/com/gooddata/md/ColumnTest.java index a30c234ab..0d85a3352 100644 --- a/src/test/java/com/gooddata/md/ColumnTest.java +++ b/src/test/java/com/gooddata/md/ColumnTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java index 0b8951ed1..6defc2e50 100644 --- a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index e8a9b8aff..114e37c73 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/DimensionTest.java b/src/test/java/com/gooddata/md/DimensionTest.java index 2adc3853e..a4b2047f4 100644 --- a/src/test/java/com/gooddata/md/DimensionTest.java +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index 78b96c0a1..81e15b09f 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 15483c500..1feb3453a 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/ExportImportServiceAT.java b/src/test/java/com/gooddata/md/ExportImportServiceAT.java index 751a57d3f..a09bad008 100644 --- a/src/test/java/com/gooddata/md/ExportImportServiceAT.java +++ b/src/test/java/com/gooddata/md/ExportImportServiceAT.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index a058d0c33..d7db2b6ac 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index a8c2fdf58..40b09636a 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/KeyTest.java b/src/test/java/com/gooddata/md/KeyTest.java index c1149e812..aaec5d682 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 08192eb8d..1ef3d2916 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 2e0ed8c25..2aa6ff219 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index 0104f95b2..d8997218d 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index b1bc9fc9d..a2c6de9b2 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 271b82f56..a3ce4160a 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index a2358062f..9098a0218 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 95edc1cb1..7cbccf448 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/ProjectDashboardTest.java b/src/test/java/com/gooddata/md/ProjectDashboardTest.java index fb43e91d0..f83300d39 100644 --- a/src/test/java/com/gooddata/md/ProjectDashboardTest.java +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index 6ad9aec4d..4b29b6dfa 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/RestrictionTest.java b/src/test/java/com/gooddata/md/RestrictionTest.java index 5a993b7e6..da0ad4acf 100644 --- a/src/test/java/com/gooddata/md/RestrictionTest.java +++ b/src/test/java/com/gooddata/md/RestrictionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java index 985ed6be5..668682810 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/TableDataLoadTest.java b/src/test/java/com/gooddata/md/TableDataLoadTest.java index 9a3045d3d..e73196f97 100644 --- a/src/test/java/com/gooddata/md/TableDataLoadTest.java +++ b/src/test/java/com/gooddata/md/TableDataLoadTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.is; diff --git a/src/test/java/com/gooddata/md/TableTest.java b/src/test/java/com/gooddata/md/TableTest.java index 6760a2e16..adfe2a93c 100644 --- a/src/test/java/com/gooddata/md/TableTest.java +++ b/src/test/java/com/gooddata/md/TableTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.hamcrest.CoreMatchers.hasItems; diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java index 285dc58b0..03bd15331 100644 --- a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.ResourceUtils.readFromResource; diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java index bd3dc829b..71dfe8d7d 100644 --- a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static org.mockito.Matchers.any; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java index e21a7f645..8eae923a2 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java index e0179c54e..308b66bcd 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java index dce9b5fba..f31b7957f 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index f29f60846..4c6b0769c 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java index d97fc7a1f..bd0b27ddd 100644 --- a/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java b/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java index c791d304b..481dcced0 100644 --- a/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementSerializerTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.fasterxml.jackson.databind.annotation.JsonSerialize; diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index 5e75c4727..2705728bf 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index befc64ecc..b84b5ac29 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/MetricElementTest.java b/src/test/java/com/gooddata/md/report/MetricElementTest.java index a54d83a12..dc5aa71af 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index dd0337bf2..754d8e3cf 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index d6469a1dd..cda4f3118 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index e5fdb8a6c..c3e85777b 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/ReportServiceAT.java b/src/test/java/com/gooddata/md/report/ReportServiceAT.java index b215634b1..d71ee55c4 100644 --- a/src/test/java/com/gooddata/md/report/ReportServiceAT.java +++ b/src/test/java/com/gooddata/md/report/ReportServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 356beb04d..148429f82 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/md/report/TotalTest.java b/src/test/java/com/gooddata/md/report/TotalTest.java index 443e4362d..cd404240b 100644 --- a/src/test/java/com/gooddata/md/report/TotalTest.java +++ b/src/test/java/com/gooddata/md/report/TotalTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index 66bd76090..6d15c45c0 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index e30f757d9..d9687eaa1 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index 483c3ce1b..59c368991 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 626dd79a0..9e617ed59 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/ModelServiceAT.java b/src/test/java/com/gooddata/model/ModelServiceAT.java index 9e6f29729..5889b3a4e 100644 --- a/src/test/java/com/gooddata/model/ModelServiceAT.java +++ b/src/test/java/com/gooddata/model/ModelServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 874bce75d..9356160a1 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/notification/NotificationServiceAT.java b/src/test/java/com/gooddata/notification/NotificationServiceAT.java index f147666b4..bd3a4bae9 100644 --- a/src/test/java/com/gooddata/notification/NotificationServiceAT.java +++ b/src/test/java/com/gooddata/notification/NotificationServiceAT.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static java.util.Collections.singletonMap; diff --git a/src/test/java/com/gooddata/notification/NotificationServiceIT.java b/src/test/java/com/gooddata/notification/NotificationServiceIT.java index de2a20336..b79a4ab4a 100644 --- a/src/test/java/com/gooddata/notification/NotificationServiceIT.java +++ b/src/test/java/com/gooddata/notification/NotificationServiceIT.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.util.ResourceUtils.readFromResource; diff --git a/src/test/java/com/gooddata/notification/NotificationServiceTest.java b/src/test/java/com/gooddata/notification/NotificationServiceTest.java index 053cbff4d..04d278572 100644 --- a/src/test/java/com/gooddata/notification/NotificationServiceTest.java +++ b/src/test/java/com/gooddata/notification/NotificationServiceTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static java.util.Collections.singletonMap; diff --git a/src/test/java/com/gooddata/notification/ProjectEventTest.java b/src/test/java/com/gooddata/notification/ProjectEventTest.java index 7e7da6d11..fc6601808 100644 --- a/src/test/java/com/gooddata/notification/ProjectEventTest.java +++ b/src/test/java/com/gooddata/notification/ProjectEventTest.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/project/ProjectIdMatcher.java b/src/test/java/com/gooddata/project/ProjectIdMatcher.java index 72adc82aa..23c2f4625 100644 --- a/src/test/java/com/gooddata/project/ProjectIdMatcher.java +++ b/src/test/java/com/gooddata/project/ProjectIdMatcher.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectServiceAT.java b/src/test/java/com/gooddata/project/ProjectServiceAT.java index aa2232338..e9134180e 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceAT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index d6017797f..86fad2eee 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java index b04dab0ae..3adab14e7 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceTest.java +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectTemplateTest.java b/src/test/java/com/gooddata/project/ProjectTemplateTest.java index 38bfe8f0f..1ba53c021 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplateTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplateTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java index 3f54ce4a1..abd90ea41 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 2d2655d40..cdb0e39b5 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java index eee2d5fbe..f260c4c2a 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java index 42861df47..0a2480896 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java index f52c7de27..9e0174045 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultSliElParamTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java index 35c857e54..b2f7dd1d1 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java index 7287a1d97..44b3c0971 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java index f91b6f018..1489a1fc8 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/ProjectValidationsTest.java b/src/test/java/com/gooddata/project/ProjectValidationsTest.java index cc05c8d28..b30c09211 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationsTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/RoleTest.java b/src/test/java/com/gooddata/project/RoleTest.java index 434c7572a..727ea63d8 100644 --- a/src/test/java/com/gooddata/project/RoleTest.java +++ b/src/test/java/com/gooddata/project/RoleTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java index f85d11893..b93225cbc 100644 --- a/src/test/java/com/gooddata/project/RolesTest.java +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java index 70b1a7c17..e23d65459 100644 --- a/src/test/java/com/gooddata/project/UserTest.java +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/project/UsersTest.java b/src/test/java/com/gooddata/project/UsersTest.java index 5f7a6924e..fbd820df8 100644 --- a/src/test/java/com/gooddata/project/UsersTest.java +++ b/src/test/java/com/gooddata/project/UsersTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java index 804bf922c..2d3e6e5f4 100644 --- a/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java +++ b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/test/java/com/gooddata/report/ExecuteReportTest.java b/src/test/java/com/gooddata/report/ExecuteReportTest.java index ed723afdd..493a4b667 100644 --- a/src/test/java/com/gooddata/report/ExecuteReportTest.java +++ b/src/test/java/com/gooddata/report/ExecuteReportTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 4bc5bc5b9..1498176c0 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.report; diff --git a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java index f03a0b757..f723e2345 100644 --- a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerClass.java b/src/test/java/com/gooddata/util/BooleanIntegerClass.java index e54b87da7..507817d9c 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerClass.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerClass.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java index 97576577a..7db295878 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/BooleanStringClass.java b/src/test/java/com/gooddata/util/BooleanStringClass.java index ba8085fb2..f8659c43e 100644 --- a/src/test/java/com/gooddata/util/BooleanStringClass.java +++ b/src/test/java/com/gooddata/util/BooleanStringClass.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java index 7fac2055d..c4a2ce598 100644 --- a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index 983b94f49..c1829de8e 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java index 919565890..0cac3698b 100644 --- a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java index 1667c61cf..5aa2e1537 100644 --- a/src/test/java/com/gooddata/util/GDDateSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateTimeClass.java b/src/test/java/com/gooddata/util/GDDateTimeClass.java index 80dc20bbc..b3b5de704 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeClass.java +++ b/src/test/java/com/gooddata/util/GDDateTimeClass.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java index ce30473c5..4f57321e0 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java index 9b87bb730..6321c0689 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/ISODateClass.java b/src/test/java/com/gooddata/util/ISODateClass.java index e9c6eb1f4..c6be9f531 100644 --- a/src/test/java/com/gooddata/util/ISODateClass.java +++ b/src/test/java/com/gooddata/util/ISODateClass.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java index 21f4e24d7..34af7035b 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java index c73593291..eb6ef0c72 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java index 287766864..a5b96cdbe 100644 --- a/src/test/java/com/gooddata/util/ResourceUtils.java +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -1,7 +1,8 @@ -/* - * Copyright (C) 2007-2015, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ - package com.gooddata.util; import static com.gooddata.util.Validate.notEmpty; diff --git a/src/test/java/com/gooddata/util/TagsDeserializerTest.java b/src/test/java/com/gooddata/util/TagsDeserializerTest.java index a801bad2f..b18b4e78c 100644 --- a/src/test/java/com/gooddata/util/TagsDeserializerTest.java +++ b/src/test/java/com/gooddata/util/TagsDeserializerTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/TagsSerializerTest.java b/src/test/java/com/gooddata/util/TagsSerializerTest.java index d0cb5d651..2541fbabb 100644 --- a/src/test/java/com/gooddata/util/TagsSerializerTest.java +++ b/src/test/java/com/gooddata/util/TagsSerializerTest.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/TagsTestClass.java b/src/test/java/com/gooddata/util/TagsTestClass.java index 1f74a7b1c..64774dfda 100644 --- a/src/test/java/com/gooddata/util/TagsTestClass.java +++ b/src/test/java/com/gooddata/util/TagsTestClass.java @@ -1,5 +1,7 @@ -/* - * Copyright (C) 2007-2016, GoodData(R) Corporation. All rights reserved. +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/util/ZipHelperTest.java b/src/test/java/com/gooddata/util/ZipHelperTest.java index 3cf1e8441..45efdd04e 100644 --- a/src/test/java/com/gooddata/util/ZipHelperTest.java +++ b/src/test/java/com/gooddata/util/ZipHelperTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. */ package com.gooddata.util; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java index 7c5e17d51..65b490be0 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseIdMatcher.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index b1e13c4b0..315c056a5 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index c3df7a56e..ee670dde7 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index f23372040..5bdfdf3b4 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 065512b39..bd77c543a 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index 1bcf5be0f..396397d60 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java index 3c2d9bab6..64c2498fe 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index b18c5244c..f51775667 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -1,5 +1,7 @@ /** * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; From 2746191dc5cad5fe3f63cd3953d495dfb3977b45 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Fri, 16 Sep 2016 07:42:22 +0200 Subject: [PATCH 0420/1191] make FeatureFlags serializable --- .../gooddata/featureflag/FeatureFlags.java | 43 +++++++++++++++---- .../featureflag/FeatureFlagsTest.java | 21 +++++++++ 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index 57ef25a04..6b1331ff9 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -5,6 +5,7 @@ */ package com.gooddata.featureflag; +import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; @@ -14,8 +15,12 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; import static com.gooddata.util.Validate.notEmpty; +import static java.util.stream.Collectors.toMap; import static org.springframework.util.Assert.notNull; @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -28,13 +33,36 @@ public class FeatureFlags implements Iterable { private final List featureFlags = new LinkedList<>(); - /* protected helper method for JSON deserialization */ + /** + * Adds the feature flag of given name and given value. + * + * @param name feature flag name + * @param enabled feature flag value (enabled / disabled) + */ @JsonAnySetter - protected void addFlag(final String name, final boolean enabled) { + public void addFlag(final String name, final boolean enabled) { notNull(name); featureFlags.add(new FeatureFlag(name, enabled)); } + /** + * Removes flag of given name. + * + * @param flagName name of the flag to remove + */ + public void removeFlag(final String flagName) { + findFlag(flagName).ifPresent(featureFlags::remove); + } + + /** + * Converts feature flags to map where flags' names are the keys and values are flags' enabled property + * @return feature flags as map + */ + @JsonAnyGetter + private Map asMap() { + return featureFlags.stream().collect(toMap(FeatureFlag::getName, FeatureFlag::isEnabled)); + } + @Override public Iterator iterator() { return featureFlags.iterator(); @@ -48,12 +76,11 @@ public Iterator iterator() { */ public boolean isEnabled(final String flagName) { notEmpty(flagName, "flagName"); - for (final FeatureFlag flag : featureFlags) { - if (flagName.equalsIgnoreCase(flag.getName())) { - return flag.isEnabled(); - } - } - return false; + return findFlag(flagName).map(FeatureFlag::isEnabled).orElse(false); + } + + private Optional findFlag(final String flagName) { + return featureFlags.stream().filter(f -> flagName.equalsIgnoreCase(f.getName())).findAny(); } @Override diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java index 31a311adb..9f035fc9f 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.featureflag; +import com.gooddata.JsonMatchers; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readObjectFromResource; @@ -12,6 +13,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.isOneOf; +import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; public class FeatureFlagsTest { @@ -26,6 +28,15 @@ public void testDeserialize() { new FeatureFlag("testFeature2", false))); } + @Test + public void testSerialize() { + final FeatureFlags flags = new FeatureFlags(); + flags.addFlag("testFeature", true); + flags.addFlag("testFeature2", false); + + assertThat(flags, JsonMatchers.serializesToJson("/featureflag/featureFlags.json")); + } + @Test public void shouldIterateThroughFlagsInForeach() throws Exception { final FeatureFlags flags = readObjectFromResource(getClass(), "/featureflag/featureFlags.json", FeatureFlags.class); @@ -53,4 +64,14 @@ public void whenNullNameThenIsEnabledShouldThrow() throws Exception { flags.isEnabled(null); } + @Test + public void testRemoveFlag() throws Exception { + final FeatureFlags flags = new FeatureFlags(); + flags.addFlag("enabledFlag", true); + + flags.removeFlag("enabledFlag"); + + assertFalse(flags.isEnabled("enabledFlag")); + assertFalse(flags.iterator().hasNext()); + } } From 5073d431f3d14fe5ddfa0ab0fb3e207096aba003 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Thu, 15 Sep 2016 10:49:13 +0200 Subject: [PATCH 0421/1191] make Page implementations idempotent --- .../com/gooddata/collections/PageRequest.java | 4 ++-- .../java/com/gooddata/collections/UriPage.java | 2 +- .../gooddata/collections/PageRequestTest.java | 10 ++++++++++ .../com/gooddata/collections/UriPageTest.java | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index b65be4c45..474408f13 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -58,9 +58,9 @@ public URI getPageUri(final UriComponentsBuilder uriBuilder) { @Override public UriComponentsBuilder updateWithPageParams(final UriComponentsBuilder uriBuilder) { if (offset != null) { - uriBuilder.queryParam("offset", offset); + uriBuilder.replaceQueryParam("offset", offset); } - uriBuilder.queryParam("limit", limit); + uriBuilder.replaceQueryParam("limit", limit); return uriBuilder; } diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index c9d41b96b..139b75bbd 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -52,7 +52,7 @@ public URI getPageUri(final UriComponentsBuilder uriBuilder) { public UriComponentsBuilder updateWithPageParams(final UriComponentsBuilder uriBuilder) { notNull(uriBuilder, "uriBuilder"); for (Entry> entry : pageUri.getQueryParams().entrySet()) { - uriBuilder.queryParam(entry.getKey(), entry.getValue().toArray()); + uriBuilder.replaceQueryParam(entry.getKey(), entry.getValue().toArray()); } return uriBuilder; } diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index eabd27a9e..8667fe972 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -49,4 +49,14 @@ public void testUpdateWithPageParamsWithStringOffset() throws Exception { final String pageUri = pageRequest.updateWithPageParams(uriBuilder).build().toUriString(); assertThat(pageUri, is("test_uri/{test}?offset=17&limit=10")); } + + @Test + public void testUpdateWithPageParamsIdempotency() throws Exception { + final PageRequest pageRequest = new PageRequest(12, 10); + final UriComponentsBuilder uriBuilder1 = UriComponentsBuilder.fromUriString("test_uri/{test}"); + final UriComponentsBuilder uriBuilder2 = pageRequest.updateWithPageParams(uriBuilder1); + final UriComponentsBuilder uriBuilder3 = pageRequest.updateWithPageParams(uriBuilder2); + final String pageUri = uriBuilder3.build().toUriString(); + assertThat(pageUri, is("test_uri/{test}?offset=12&limit=10")); + } } diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index 42159516a..b0080510a 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -47,4 +47,20 @@ public void test() throws Exception { assertThat(components.getQueryParams(), hasEntry("limit", singletonList("10"))); } + @Test + public void testIdempotency() throws Exception { + final UriPage uri = new UriPage("uri?offset=god&limit=10"); + final UriComponentsBuilder builder = fromUriString("/this/is/{template}").query("other=false"); + + uri.updateWithPageParams(builder); + uri.updateWithPageParams(builder); + uri.updateWithPageParams(builder); + + final UriComponents components = builder.build(); + assertThat(components, is(notNullValue())); + assertThat(components.getPath(), is("/this/is/{template}")); + assertThat(components.getQueryParams(), hasEntry("other", singletonList("false"))); + assertThat(components.getQueryParams(), hasEntry("offset", singletonList("god"))); + assertThat(components.getQueryParams(), hasEntry("limit", singletonList("10"))); + } } From 7a021c9ea878730e68dd2f5d28d71c429be3c9c1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 22 Sep 2016 14:23:47 +0200 Subject: [PATCH 0422/1191] [maven-release-plugin] prepare release gooddata-java-2.0.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d3bf82b7c..4649e57ab 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0-SNAPSHOT + 2.0.0 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 4e9a05fb46f5bd72508c2507c8516340cd46e760 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 22 Sep 2016 14:23:48 +0200 Subject: [PATCH 0423/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4649e57ab..662c317ec 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.0 + 2.0.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 19f384ed974716feb1bf8501009f0802bae1e804 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 22 Sep 2016 14:37:42 +0200 Subject: [PATCH 0424/1191] fix readme for version 2.0 --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 662385eb8..e49b65e82 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 and currently the SDK is transitioned to be an official GoodData project. +GoodData Corporation provides this software "as-is" under conditions +specified in the [license](LICENSE.txt). ## Usage @@ -28,9 +30,9 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info 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 *Spring Framework* version 3.x -* the *Jackson JSON Processor* version 2.7.0 (*GoodData Java SDK* version 0.x requires version 1.9) -* the *Java Development Kit (JDK)* version 7 or later +* the *Spring Framework* version 4.3.* +* the *Jackson JSON Processor* version 2.8.* +* the *Java Development Kit (JDK)* version 8 or later ## License The *GoodData Java SDK* is free and open-source software under [BSD License](LICENSE.txt). From fdac948bad3b065f37c0f37d631c044203abedd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 22 Sep 2016 13:33:29 +0200 Subject: [PATCH 0425/1191] Add reschedule parameter to schedules --- .../gooddata/dataload/processes/Schedule.java | 30 ++++++++++ .../dataload/processes/ProcessServiceAT.java | 58 ++++++++++++++----- .../dataload/processes/ScheduleTest.java | 29 ++++++++++ .../processes/schedule-input-all-fields.json | 12 ++++ .../dataload/processes/schedule.json | 1 + 5 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 src/test/resources/dataload/processes/schedule-input-all-fields.json diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 5f1dc32d9..db47aaeb3 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; +import org.joda.time.Duration; import org.springframework.web.util.UriTemplate; import java.util.Collections; @@ -47,6 +48,7 @@ public class Schedule { private String state; private String cron; private String timezone; + private Integer reschedule; private final DateTime nextExecutionTime; private final int consecutiveFailedExecutionCount; private final Map params; @@ -75,6 +77,7 @@ private Schedule(@JsonProperty("type") final String type, @JsonProperty("nextExecutionTime") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime nextExecutionTime, @JsonProperty("consecutiveFailedExecutionCount") final int consecutiveFailedExecutionCount, @JsonProperty("params") final Map params, + @JsonProperty("reschedule") final Integer reschedule, @JsonProperty("links") final Map links) { this.type = type; this.state = state; @@ -83,6 +86,7 @@ private Schedule(@JsonProperty("type") final String type, this.nextExecutionTime = nextExecutionTime; this.consecutiveFailedExecutionCount = consecutiveFailedExecutionCount; this.params = params; + this.reschedule = reschedule; this.links = links; } @@ -160,6 +164,32 @@ public void setTimezone(final String timezone) { this.timezone = timezone; } + /** + * Duration after a failed execution of the schedule is executed again + * @return reschedule duration in minutes + */ + @JsonProperty("reschedule") + public Integer getRescheduleInMinutes() { + return reschedule; + } + + /** + * Duration after a failed execution of the schedule is executed again + * @return reschedule duration in minutes + */ + @JsonIgnore + public Duration getReschedule() { + return reschedule != null ? Duration.standardMinutes(getRescheduleInMinutes()) : null; + } + + /** + * Duration after a failed execution of the schedule is executed again + * @param reschedule this duration should not be too low, because it can be rejected by REST API (e.g. 15 minutes or more) + */ + public void setReschedule(Duration reschedule) { + this.reschedule = notNull(reschedule, "reschedule").toStandardMinutes().getMinutes(); + } + @JsonIgnore public void setTimezone(final DateTimeZone timezone) { this.timezone = notNull(timezone, "timezone").getID(); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 6b16e481b..c0ba9f86f 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -9,6 +9,7 @@ import com.gooddata.collections.PageableList; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.joda.time.Duration; import org.springframework.core.io.ClassPathResource; import org.testng.annotations.Test; @@ -18,7 +19,8 @@ import java.io.IOException; import java.util.Collection; -import static com.gooddata.dataload.processes.ProcessIdMatcher.hasSameIdAs; +import static com.gooddata.dataload.processes.ProcessIdMatcher.hasSameProcessIdAs; +import static com.gooddata.dataload.processes.ScheduleIdMatcher.hasSameScheduleIdAs; import static java.nio.file.Files.createTempDirectory; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.allOf; @@ -39,6 +41,7 @@ public class ProcessServiceAT extends AbstractGoodDataAT { private DataloadProcess process; private DataloadProcess processAppstore; + private Schedule schedule; @Test(groups = "process", dependsOnGroups = "project") public void createProcess() throws Exception { @@ -48,23 +51,39 @@ public void createProcess() throws Exception { copy("invalid.grf", dir); copy("workspace.prm", dir); process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); - final Schedule schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); + } finally { + FileUtils.deleteDirectory(dir); + } + } - assertThat(schedule, notNullValue()); - assertThat(schedule.getExecutable(), is("sdktest.grf")); + @Test(groups = "process", dependsOnMethods = "createProcess") + public void createSchedule() { + schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); + schedule.setReschedule(Duration.standardMinutes(15)); - final PageableList collection = gd.getProcessService().listSchedules(project); - assertThat(collection, notNullValue()); - assertThat(collection, hasSize(1)); - assertThat(collection.getNextPage(), nullValue()); + assertThat(schedule, notNullValue()); + assertThat(schedule.getExecutable(), is("sdktest.grf")); + assertThat(schedule.getRescheduleInMinutes(), is(15)); + } - schedule.setState(ScheduleState.DISABLED); - assertThat(gd.getProcessService().updateSchedule(project, schedule).isEnabled(), is(false)); + @Test(groups = "process", dependsOnMethods = "createSchedule") + public void listSchedules() { + final PageableList collection = gd.getProcessService().listSchedules(project); - gd.getProcessService().removeSchedule(schedule); - } finally { - FileUtils.deleteDirectory(dir); - } + assertThat(collection, notNullValue()); + assertThat(collection, hasSize(1)); + assertThat(collection.getNextPage(), nullValue()); + } + + @Test(groups = "process", dependsOnMethods = "createSchedule") + public void updateSchedule() { + schedule.setState(ScheduleState.DISABLED); + schedule.setReschedule(Duration.standardMinutes(26)); + + schedule = gd.getProcessService().updateSchedule(project, schedule); + + assertThat(schedule.isEnabled(), is(false)); + assertThat(gd.getProcessService().updateSchedule(project, schedule).getRescheduleInMinutes(), is(26)); } @Test(groups = "process", dependsOnGroups = "project") @@ -94,7 +113,7 @@ public void copy(final String file, final File dir) throws IOException { @Test(groups = "process", dependsOnMethods = "createProcess") public void processes() { final Collection processes = gd.getProcessService().listProcesses(project); - assertThat(processes, hasItem(hasSameIdAs(process))); + assertThat(processes, hasItem(hasSameProcessIdAs(process))); } @Test(groups = "process", dependsOnMethods = "createProcess") @@ -119,7 +138,14 @@ public void removeProcess() throws Exception { gd.getProcessService().removeProcess(process); gd.getProcessService().removeProcess(processAppstore); final Collection processes = gd.getProcessService().listProcesses(project); - assertThat(processes, not(hasItems(hasSameIdAs(process), hasSameIdAs(processAppstore)))); + assertThat(processes, not(hasItems(hasSameProcessIdAs(process), hasSameProcessIdAs(processAppstore)))); + } + + @Test(dependsOnGroups = "process") + public void removeSchedule() { + gd.getProcessService().removeSchedule(schedule); + final Collection schedules = gd.getProcessService().listSchedules(project); + assertThat(schedules, not(hasItems(hasSameScheduleIdAs(schedule)))); } } diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 2efa787e4..41d047eb2 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; +import org.joda.time.Duration; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -19,6 +20,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; @@ -56,6 +58,7 @@ public void testDeserialization() throws Exception { assertThat(schedule.isEnabled(), is(true)); assertThat(schedule.getCron(), is("0 0 * * *")); assertThat(schedule.getTimezone(), is("UTC")); + assertThat(schedule.getRescheduleInMinutes(), is(26)); assertThat(schedule.getConsecutiveFailedExecutionCount(), is(0)); assertThat(schedule.getProcessId(), is("process_id")); assertThat(schedule.getExecutable(), is(EXECUTABLE)); @@ -69,6 +72,14 @@ public void testSerialization() { assertThat(schedule, serializesToJson("/dataload/processes/schedule-input.json")); } + @Test + public void testSerializationWithAllFields() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + schedule.setReschedule(Duration.standardMinutes(26)); + + assertThat(schedule, serializesToJson("/dataload/processes/schedule-input-all-fields.json")); + } + @DataProvider(name = "scheduleParams") public Object[][] scheduleParams() { return new Object[][] { @@ -147,4 +158,22 @@ public void testCustomParams() { assertThat(schedule.getParams().size(), is(originalParamsSize)); } + @Test + public void testReschedule() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + final Duration duration = Duration.standardMinutes(26); + schedule.setReschedule(duration); + + assertThat(schedule.getRescheduleInMinutes(), is(equalTo(26))); + assertThat(schedule.getReschedule(), is(equalTo(duration))); + } + + @Test + public void testRescheduleTooLowDuration() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + schedule.setReschedule(Duration.standardSeconds(26)); + + assertThat(schedule.getRescheduleInMinutes(), is(equalTo(0))); + assertThat(schedule.getReschedule(), is(equalTo(Duration.ZERO))); + } } \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedule-input-all-fields.json b/src/test/resources/dataload/processes/schedule-input-all-fields.json new file mode 100644 index 000000000..b93a64f79 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule-input-all-fields.json @@ -0,0 +1,12 @@ +{ + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "reschedule" : 26, + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "cron": "0 0 * * *" + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedule.json b/src/test/resources/dataload/processes/schedule.json index f26f971f9..ff4f817fb 100644 --- a/src/test/resources/dataload/processes/schedule.json +++ b/src/test/resources/dataload/processes/schedule.json @@ -8,6 +8,7 @@ }, "cron": "0 0 * * *", "timezone": "UTC", + "reschedule" : 26, "nextExecutionTime": "2013-11-16T00:00:00.000Z", "lastSuccessful": { "execution": { From ba4e6992566026dbbdffa2df0ddb4a13c56d89e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 22 Sep 2016 16:20:39 +0200 Subject: [PATCH 0426/1191] Separate schedule tests in ProcessServiceAT --- .../dataload/processes/ScheduleIdMatcher.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/test/java/com/gooddata/dataload/processes/ScheduleIdMatcher.java diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleIdMatcher.java b/src/test/java/com/gooddata/dataload/processes/ScheduleIdMatcher.java new file mode 100644 index 000000000..ab1d04d77 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleIdMatcher.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import org.hamcrest.Description; +import org.hamcrest.TypeSafeMatcher; + +class ScheduleIdMatcher extends TypeSafeMatcher { + private final Schedule schedule; + + public ScheduleIdMatcher(final Schedule schedule) { + this.schedule = schedule; + } + + @Override + public void describeTo(final Description description) { + description.appendText("Schedule id " + schedule.getId()); + } + + public static ScheduleIdMatcher hasSameScheduleIdAs(final Schedule schedule) { + return new ScheduleIdMatcher(schedule); + } + + @Override + protected boolean matchesSafely(Schedule item) { + return schedule.getId().equals(item.getId()); + } +} \ No newline at end of file From 4629e7721916e366964483a8c33d9b45c1947cf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 22 Sep 2016 17:23:06 +0200 Subject: [PATCH 0427/1191] Renamed hasSameIdAs in ProcessIdMatcher to hasSameProcessIdAs --- .../java/com/gooddata/dataload/processes/ProcessIdMatcher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java index 737a723e4..d4210acf7 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessIdMatcher.java @@ -21,7 +21,7 @@ public void describeTo(final Description description) { description.appendText("Process id " + process.getId()); } - public static ProcessIdMatcher hasSameIdAs(final DataloadProcess process) { + public static ProcessIdMatcher hasSameProcessIdAs(final DataloadProcess process) { return new ProcessIdMatcher(process); } From 437a6820a28e220f4ff42ab089154b7015b8d8fc Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 27 Sep 2016 22:41:34 +0200 Subject: [PATCH 0428/1191] chg: change wording in readme --- README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e49b65e82..bca8c0543 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,9 @@ The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 and currently the SDK is transitioned to be an official GoodData project. -GoodData Corporation provides this software "as-is" under conditions -specified in the [license](LICENSE.txt). ## Usage -See [Wiki](https://github.com/martiner/gooddata-java/wiki) for -[Upgrading Guide](https://github.com/martiner/gooddata-java/wiki/Upgrading-GoodData-Java-SDK), -[Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) -and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-GoodData-Java-SDK). - The *GoodData Java SDK* is available in Maven Central Repository, to use it from Maven add to `pom.xml`: ```xml @@ -22,8 +15,13 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from 2.0.0
``` +See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, +the [Upgrading Guide](https://github.com/martiner/gooddata-java/wiki/Upgrading-GoodData-Java-SDK) will navigate you +through changes between major versions. -See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes. +See [Wiki](https://github.com/martiner/gooddata-java/wiki) for +[Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) +and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-GoodData-Java-SDK). ### Dependencies @@ -34,9 +32,11 @@ The *GoodData Java SDK* uses: * the *Jackson JSON Processor* version 2.8.* * the *Java Development Kit (JDK)* version 8 or later -## License -The *GoodData Java SDK* is free and open-source software under [BSD License](LICENSE.txt). +## License and conditions + +The *GoodData Java SDK* is free and open-source software provided by GoodData Corporation "as-is" under [BSD License](LICENSE.txt). + +## Contribute -##Contribute -Missing functionality? Found a BUG? Please create an [issue](https://github.com/martiner/gooddata-java/issues) -or simply [contribute your code](CONTRIBUTING.md). +Found a bug? Please create an [issue](https://github.com/martiner/gooddata-java/issues). Missing functionality? +[Contribute your code](CONTRIBUTING.md). From 98a5d9cdb1fa2c8119b8512e8c85cae53e6a819a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Sat, 24 Sep 2016 21:52:26 +0200 Subject: [PATCH 0429/1191] Add creating schedules triggered by different schedules --- .../gooddata/dataload/processes/Schedule.java | 28 ++++++++++++++- .../dataload/processes/ProcessServiceAT.java | 15 ++++++-- .../dataload/processes/ScheduleTest.java | 35 +++++++++++++++++++ .../processes/schedule-triggered-input.json | 11 ++++++ .../processes/schedule-triggered.json | 18 ++++++++++ 5 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/dataload/processes/schedule-triggered-input.json create mode 100644 src/test/resources/dataload/processes/schedule-triggered.json diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index db47aaeb3..e83bf454e 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -49,17 +49,33 @@ public class Schedule { private String cron; private String timezone; private Integer reschedule; + private String triggerScheduleId; private final DateTime nextExecutionTime; private final int consecutiveFailedExecutionCount; private final Map params; private final Map links; public Schedule(final DataloadProcess process, final String executable, final String cron) { + this(process, executable); + this.cron = notEmpty(cron, "cron"); + } + + /** + * Creates schedule, which is triggered by execution of different schedule + * @param process process to create schedule for + * @param executable executable to be scheduled for execution + * @param triggerSchedule schedule, which will trigger created schedule + */ + public Schedule(final DataloadProcess process, final String executable, final Schedule triggerSchedule) { + this(process, executable); + this.triggerScheduleId = notEmpty(notNull(triggerSchedule, "triggerSchedule").getId(), "triggerSchedule ID"); + } + + private Schedule(final DataloadProcess process, final String executable) { notNull(process, "process"); this.type = MSETL_TYPE; this.state = ScheduleState.ENABLED.name(); - this.cron = notEmpty(cron, "cron"); this.params = new HashMap<>(); this.params.put(PROCESS_ID, process.getId()); process.validateExecutable(executable); @@ -78,6 +94,7 @@ private Schedule(@JsonProperty("type") final String type, @JsonProperty("consecutiveFailedExecutionCount") final int consecutiveFailedExecutionCount, @JsonProperty("params") final Map params, @JsonProperty("reschedule") final Integer reschedule, + @JsonProperty("triggerScheduleId") final String triggerScheduleId, @JsonProperty("links") final Map links) { this.type = type; this.state = state; @@ -87,6 +104,7 @@ private Schedule(@JsonProperty("type") final String type, this.consecutiveFailedExecutionCount = consecutiveFailedExecutionCount; this.params = params; this.reschedule = reschedule; + this.triggerScheduleId = triggerScheduleId; this.links = links; } @@ -190,6 +208,14 @@ public void setReschedule(Duration reschedule) { this.reschedule = notNull(reschedule, "reschedule").toStandardMinutes().getMinutes(); } + public String getTriggerScheduleId() { + return triggerScheduleId; + } + + public void setTriggerScheduleId(final String triggerScheduleId) { + this.triggerScheduleId = triggerScheduleId; + } + @JsonIgnore public void setTimezone(final DateTimeZone timezone) { this.timezone = notNull(timezone, "timezone").getID(); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index c0ba9f86f..4fbe7322f 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -42,6 +42,7 @@ public class ProcessServiceAT extends AbstractGoodDataAT { private DataloadProcess process; private DataloadProcess processAppstore; private Schedule schedule; + private Schedule triggeredSchedule; @Test(groups = "process", dependsOnGroups = "project") public void createProcess() throws Exception { @@ -67,11 +68,20 @@ public void createSchedule() { } @Test(groups = "process", dependsOnMethods = "createSchedule") + public void createTriggeredSchedule() { + triggeredSchedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", schedule)); + + assertThat(triggeredSchedule, notNullValue()); + assertThat(triggeredSchedule.getExecutable(), is("sdktest.grf")); + assertThat(triggeredSchedule.getTriggerScheduleId(), is(schedule.getId())); + } + + @Test(groups = "process", dependsOnMethods = {"createSchedule", "createTriggeredSchedule"}) public void listSchedules() { final PageableList collection = gd.getProcessService().listSchedules(project); assertThat(collection, notNullValue()); - assertThat(collection, hasSize(1)); + assertThat(collection, hasSize(2)); assertThat(collection.getNextPage(), nullValue()); } @@ -144,8 +154,9 @@ public void removeProcess() throws Exception { @Test(dependsOnGroups = "process") public void removeSchedule() { gd.getProcessService().removeSchedule(schedule); + gd.getProcessService().removeSchedule(triggeredSchedule); final Collection schedules = gd.getProcessService().listSchedules(project); - assertThat(schedules, not(hasItems(hasSameScheduleIdAs(schedule)))); + assertThat(schedules, not(hasItems(hasSameScheduleIdAs(schedule), hasSameScheduleIdAs(triggeredSchedule)))); } } diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 41d047eb2..0100fb469 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -37,12 +37,16 @@ public class ScheduleTest { @Mock private DataloadProcess process; + @Mock + private Schedule triggerSchedule; + @BeforeMethod public void setUp() throws Exception { MockitoAnnotations.initMocks(this); when(process.getExecutables()).thenReturn(Collections.singleton(EXECUTABLE)); when(process.getId()).thenReturn("process_id"); + when(triggerSchedule.getId()).thenReturn("schedule_id"); doThrow(new IllegalArgumentException("wrong executable")).when(process).validateExecutable(Matchers.argThat(not(is(EXECUTABLE)))); } @@ -66,12 +70,37 @@ public void testDeserialization() throws Exception { assertThat(schedule.getUri(), is("/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID")); } + @Test + public void testTriggeredScheduleDeserialization() throws Exception { + final Schedule schedule = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/schedule-triggered.json"), Schedule.class); + + assertThat(schedule, is(notNullValue())); + assertThat(schedule.getId(), is("SCHEDULE_ID")); + assertThat(schedule.getType(), is("MSETL")); + assertThat(schedule.getState(), is("DISABLED")); + assertThat(schedule.isEnabled(), is(false)); + assertThat(schedule.getTimezone(), is("UTC")); + assertThat(schedule.getConsecutiveFailedExecutionCount(), is(0)); + assertThat(schedule.getProcessId(), is("process_id")); + assertThat(schedule.getExecutable(), is(EXECUTABLE)); + assertThat(schedule.getNextExecutionTime(), is(DateTime.parse("2013-11-16T00:00:00.000Z"))); + assertThat(schedule.getUri(), is("/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID")); + assertThat(schedule.getTriggerScheduleId(), is("trigger_schedule_id")); + } + @Test public void testSerialization() { final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); assertThat(schedule, serializesToJson("/dataload/processes/schedule-input.json")); } + @Test + public void testTriggeredScheduleSerialization() { + final Schedule schedule = new Schedule(process, EXECUTABLE, triggerSchedule); + assertThat(schedule, serializesToJson("/dataload/processes/schedule-triggered-input.json")); + } + @Test public void testSerializationWithAllFields() { final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); @@ -176,4 +205,10 @@ public void testRescheduleTooLowDuration() { assertThat(schedule.getRescheduleInMinutes(), is(equalTo(0))); assertThat(schedule.getReschedule(), is(equalTo(Duration.ZERO))); } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testCreateTriggeredScheduleWithNotCreatedSchedule() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + new Schedule(process, EXECUTABLE, schedule); + } } \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedule-triggered-input.json b/src/test/resources/dataload/processes/schedule-triggered-input.json new file mode 100644 index 000000000..fed9c9396 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule-triggered-input.json @@ -0,0 +1,11 @@ +{ + "schedule": { + "type": "MSETL", + "state": "ENABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "triggerScheduleId": "schedule_id" + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/processes/schedule-triggered.json b/src/test/resources/dataload/processes/schedule-triggered.json new file mode 100644 index 000000000..819e007b6 --- /dev/null +++ b/src/test/resources/dataload/processes/schedule-triggered.json @@ -0,0 +1,18 @@ +{ + "schedule": { + "type": "MSETL", + "state": "DISABLED", + "params": { + "PROCESS_ID": "process_id", + "EXECUTABLE": "Twitter/graph/twitter.grf" + }, + "triggerScheduleId": "trigger_schedule_id", + "timezone": "UTC", + "nextExecutionTime": "2013-11-16T00:00:00.000Z", + "consecutiveFailedExecutionCount": 0, + "links": { + "self": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID", + "executions": "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions" + } + } +} \ No newline at end of file From be73915cd82d9344cef266c0cec9bf6ffb7d15c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Sat, 24 Sep 2016 22:04:26 +0200 Subject: [PATCH 0430/1191] Add names for schedules --- .../com/gooddata/dataload/processes/Schedule.java | 11 +++++++++++ .../gooddata/dataload/processes/ProcessServiceAT.java | 1 + .../com/gooddata/dataload/processes/ScheduleTest.java | 2 ++ .../dataload/processes/schedule-input-all-fields.json | 1 + src/test/resources/dataload/processes/schedule.json | 1 + 5 files changed, 16 insertions(+) diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index e83bf454e..7552f02f3 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -50,6 +50,7 @@ public class Schedule { private String timezone; private Integer reschedule; private String triggerScheduleId; + private String name; private final DateTime nextExecutionTime; private final int consecutiveFailedExecutionCount; private final Map params; @@ -95,6 +96,7 @@ private Schedule(@JsonProperty("type") final String type, @JsonProperty("params") final Map params, @JsonProperty("reschedule") final Integer reschedule, @JsonProperty("triggerScheduleId") final String triggerScheduleId, + @JsonProperty("name") final String name, @JsonProperty("links") final Map links) { this.type = type; this.state = state; @@ -105,6 +107,7 @@ private Schedule(@JsonProperty("type") final String type, this.params = params; this.reschedule = reschedule; this.triggerScheduleId = triggerScheduleId; + this.name = name; this.links = links; } @@ -216,6 +219,14 @@ public void setTriggerScheduleId(final String triggerScheduleId) { this.triggerScheduleId = triggerScheduleId; } + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + @JsonIgnore public void setTimezone(final DateTimeZone timezone) { this.timezone = notNull(timezone, "timezone").getID(); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 4fbe7322f..0a1d00ae9 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -61,6 +61,7 @@ public void createProcess() throws Exception { public void createSchedule() { schedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", "0 0 * * *")); schedule.setReschedule(Duration.standardMinutes(15)); + schedule.setName("sdkTestSchedule"); assertThat(schedule, notNullValue()); assertThat(schedule.getExecutable(), is("sdktest.grf")); diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 0100fb469..7a4f89790 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -68,6 +68,7 @@ public void testDeserialization() throws Exception { assertThat(schedule.getExecutable(), is(EXECUTABLE)); assertThat(schedule.getNextExecutionTime(), is(DateTime.parse("2013-11-16T00:00:00.000Z"))); assertThat(schedule.getUri(), is("/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID")); + assertThat(schedule.getName(), is("scheduleName")); } @Test @@ -105,6 +106,7 @@ public void testTriggeredScheduleSerialization() { public void testSerializationWithAllFields() { final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); schedule.setReschedule(Duration.standardMinutes(26)); + schedule.setName("scheduleName"); assertThat(schedule, serializesToJson("/dataload/processes/schedule-input-all-fields.json")); } diff --git a/src/test/resources/dataload/processes/schedule-input-all-fields.json b/src/test/resources/dataload/processes/schedule-input-all-fields.json index b93a64f79..84ce01686 100644 --- a/src/test/resources/dataload/processes/schedule-input-all-fields.json +++ b/src/test/resources/dataload/processes/schedule-input-all-fields.json @@ -1,5 +1,6 @@ { "schedule": { + "name" : "scheduleName", "type": "MSETL", "state": "ENABLED", "reschedule" : 26, diff --git a/src/test/resources/dataload/processes/schedule.json b/src/test/resources/dataload/processes/schedule.json index ff4f817fb..c5a04da10 100644 --- a/src/test/resources/dataload/processes/schedule.json +++ b/src/test/resources/dataload/processes/schedule.json @@ -1,5 +1,6 @@ { "schedule": { + "name" : "scheduleName", "type": "MSETL", "state": "ENABLED", "params": { From 6610c0ac7d6936b240f18af064e54a43e9480345 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 3 Oct 2016 17:29:47 +0200 Subject: [PATCH 0431/1191] remove redundant wording from validations --- .../com/gooddata/connector/Zendesk4ProcessExecution.java | 4 ++-- .../com/gooddata/dataload/processes/ProcessService.java | 4 ++-- .../java/com/gooddata/dataload/processes/Schedule.java | 6 +++--- src/main/java/com/gooddata/dataset/PullTask.java | 4 ++-- src/main/java/com/gooddata/featureflag/FeatureFlag.java | 2 +- .../java/com/gooddata/featureflag/ProjectFeatureFlag.java | 2 +- src/main/java/com/gooddata/gdc/DataStoreService.java | 5 ++--- src/main/java/com/gooddata/gdc/GdcSardine.java | 2 +- src/main/java/com/gooddata/md/AttributeElements.java | 4 ++-- .../com/gooddata/notification/NotificationService.java | 4 ++-- src/main/java/com/gooddata/notification/ProjectEvent.java | 8 ++++---- src/main/java/com/gooddata/project/Project.java | 4 ++-- src/main/java/com/gooddata/project/ProjectDriver.java | 2 +- src/test/java/com/gooddata/util/ResourceUtils.java | 2 +- 14 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 41b887346..4ddb931f7 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -47,8 +47,8 @@ public Map getStartTimes() { public void setStartTime(final String resource, final DateTime startTime) { - notEmpty(resource, "resource can't be empty"); - notNull(startTime, "startTime can't be null"); + notEmpty(resource, "resource"); + notNull(startTime, "startTime"); startTimes = startTimes == null ? new TreeMap() : startTimes; diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index be1ad91a8..03d088e99 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -115,7 +115,7 @@ public DataloadProcess createProcess(Project project, DataloadProcess process) { public FutureResult createProcessFromAppstore(Project project, DataloadProcess process) { notNull(project, "project"); notNull(process, "process"); - notEmpty(process.getPath(), "process path must not be empty"); + notEmpty(process.getPath(), "process path"); return postProcess(process, getProcessesUri(project), HttpMethod.POST); } @@ -148,7 +148,7 @@ public DataloadProcess updateProcess(Project project, DataloadProcess process, F public FutureResult updateProcessFromAppstore(Project project, DataloadProcess process) { notNull(project, "project"); notNull(process, "process"); - notEmpty(process.getPath(), "process path must not be empty"); + notEmpty(process.getPath(), "process path"); return postProcess(process, getProcessUri(project, process.getId()), HttpMethod.PUT); } diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 7552f02f3..f14a39586 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -158,13 +158,13 @@ public Map getParams() { } public void addParam(String key, String value) { - notEmpty(key, "param cannot be empty!"); - notNull(value, "value cannot be null!"); + notEmpty(key, "param"); + notNull(value, "value"); params.put(key, value); } public void removeParam(String paramKey) { - notEmpty(paramKey, "paramKey cannot be empty!"); + notEmpty(paramKey, "paramKey!"); params.remove(paramKey); } diff --git a/src/main/java/com/gooddata/dataset/PullTask.java b/src/main/java/com/gooddata/dataset/PullTask.java index 8530a5525..4d8178a8a 100644 --- a/src/main/java/com/gooddata/dataset/PullTask.java +++ b/src/main/java/com/gooddata/dataset/PullTask.java @@ -6,7 +6,7 @@ package com.gooddata.dataset; import static com.gooddata.util.Validate.notEmpty; -import static org.apache.commons.lang.Validate.notNull; +import static com.gooddata.util.Validate.notNull; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -31,7 +31,7 @@ class PullTask { @JsonCreator private PullTask(@JsonProperty("links") Links links) { - notNull(links, "links cannot be null!"); + notNull(links, "links"); this.links = links; } diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/src/main/java/com/gooddata/featureflag/FeatureFlag.java index 193645d46..5e350a9ab 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlag.java @@ -17,7 +17,7 @@ public class FeatureFlag { private boolean enabled; public FeatureFlag(final String name, final boolean enabled) { - this.name = notNull(name, "name cannot be null"); + this.name = notNull(name, "name"); this.enabled = enabled; } diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java index af72a6f06..e611d274d 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -74,7 +74,7 @@ public void setEnabled(boolean enabled) { @JsonIgnore public String getUri() { - notNull(links, "links cannot be null if you want to get feature flag uri!"); + notNull(links, "links (if you want to get feature flag uri)"); return links.getSelf(); } diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 21c431049..433db979c 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -9,7 +9,6 @@ import com.github.sardine.impl.SardineException; import com.github.sardine.impl.SardineImpl; import com.gooddata.UriPrefixer; -import org.apache.commons.lang.Validate; import org.apache.http.Header; import org.apache.http.HeaderIterator; import org.apache.http.HttpEntity; @@ -177,7 +176,7 @@ private static class FakeCloseableHttpClient extends CloseableHttpClient { private final HttpClient client; private FakeCloseableHttpClient(HttpClient client) { - notNull(client, "client can't be null"); + notNull(client, "client"); this.client = client; } @@ -250,7 +249,7 @@ private static class FakeCloseableHttpResponse implements CloseableHttpResponse private final HttpResponse wrappedResponse; public FakeCloseableHttpResponse(HttpResponse wrappedResponse) { - Validate.notNull(wrappedResponse, "wrappedResponse cannot be null!"); + notNull(wrappedResponse, "wrappedResponse"); this.wrappedResponse = wrappedResponse; } diff --git a/src/main/java/com/gooddata/gdc/GdcSardine.java b/src/main/java/com/gooddata/gdc/GdcSardine.java index 03c053b80..192863854 100644 --- a/src/main/java/com/gooddata/gdc/GdcSardine.java +++ b/src/main/java/com/gooddata/gdc/GdcSardine.java @@ -29,7 +29,7 @@ public GdcSardine(HttpClientBuilder builder) { @Override protected T execute(HttpRequestBase request, ResponseHandler responseHandler) throws IOException { try { - notNull(request,"request must not be null!"); + notNull(request,"request"); return super.execute(request, responseHandler); } finally { request.releaseConnection(); diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index 84e44314f..6f2b81177 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -5,8 +5,6 @@ */ package com.gooddata.md; -import static org.apache.commons.lang.Validate.notNull; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; @@ -17,6 +15,8 @@ import java.util.List; +import static com.gooddata.util.Validate.notNull; + /** * Represents elements of attribute */ diff --git a/src/main/java/com/gooddata/notification/NotificationService.java b/src/main/java/com/gooddata/notification/NotificationService.java index b5155bbf1..cf290c07b 100644 --- a/src/main/java/com/gooddata/notification/NotificationService.java +++ b/src/main/java/com/gooddata/notification/NotificationService.java @@ -30,8 +30,8 @@ public NotificationService(final RestTemplate restTemplate) { * @param event event to trigger */ public void triggerEvent(final Project project, final ProjectEvent event) { - notNull(project, "project can't be null"); - notNull(event, "event can't be null"); + notNull(project, "project"); + notNull(event, "event"); try { restTemplate.postForEntity(ProjectEvent.URI, event, Void.class, project.getId()); } catch (GoodDataRestException | RestClientException e) { diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java index 46f6e58d2..6adfff901 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -38,8 +38,8 @@ public ProjectEvent(final String type) { } public ProjectEvent(final String type, final Map parameters) { - notEmpty(type, "type can't be empty"); - notNull(parameters, "parameters can't be null"); + notEmpty(type, "type"); + notNull(parameters, "parameters"); this.type = type; this.parameters = parameters; } @@ -50,8 +50,8 @@ public ProjectEvent(final String type, final Map parameters) { * @param value parameter value */ public void setParameter(final String key, final String value) { - notNull(key, "parameter key can't be null"); - notNull(value, "parameter value can't be null"); + notNull(key, "parameter key"); + notNull(value, "parameter value"); parameters.put(key, value); } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 445ba4a83..60c2c1d17 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -392,12 +392,12 @@ public boolean isEnabled() { } public void setDriver(String driver) { - notEmpty(driver, "driver cannot be empty!"); + notEmpty(driver, "driver"); content.setDriver(driver); } public void setDriver(ProjectDriver driver) { - notNull(driver, "driver cannot be null!"); + notNull(driver, "driver"); setDriver(driver.getValue()); } diff --git a/src/main/java/com/gooddata/project/ProjectDriver.java b/src/main/java/com/gooddata/project/ProjectDriver.java index 030ebc0d9..75c1339cf 100644 --- a/src/main/java/com/gooddata/project/ProjectDriver.java +++ b/src/main/java/com/gooddata/project/ProjectDriver.java @@ -14,7 +14,7 @@ public enum ProjectDriver { private final String value; ProjectDriver(String value) { - notEmpty(value, "value cannot be empty!"); + notEmpty(value, "value"); this.value = value; } diff --git a/src/test/java/com/gooddata/util/ResourceUtils.java b/src/test/java/com/gooddata/util/ResourceUtils.java index a5b96cdbe..02a31486a 100644 --- a/src/test/java/com/gooddata/util/ResourceUtils.java +++ b/src/test/java/com/gooddata/util/ResourceUtils.java @@ -52,7 +52,7 @@ public static InputStream readFromResource(String resourcePath) { private static InputStream readFromResource(String resourcePath, Class testClass) { notEmpty(resourcePath, "resourcePath"); - notNull(testClass, "testClass cannot be null!"); + notNull(testClass, "testClass"); return testClass.getResourceAsStream(resourcePath); } From 9701c990839b3b6c7c519c5a5d6a053e62b13457 Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Wed, 21 Sep 2016 14:57:18 +0200 Subject: [PATCH 0432/1191] fix all javadoc errors and warnings --- src/main/java/com/gooddata/GoodData.java | 3 --- src/main/java/com/gooddata/account/Account.java | 4 ++++ src/main/java/com/gooddata/account/AccountService.java | 4 ++-- .../java/com/gooddata/dataload/processes/DataloadProcess.java | 4 ++-- .../project/ProjectValidationResultGdcTimeElParam.java | 1 + .../gooddata/project/ProjectValidationResultSliElParam.java | 4 ++-- src/main/java/com/gooddata/warehouse/WarehouseService.java | 1 + 7 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index fe069ee71..756f466a6 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -115,8 +115,6 @@ public GoodData(String hostname, String login, String password) { this(hostname, login, password, PORT, PROTOCOL, new GoodDataSettings()); } - - /** * Create instance configured to communicate with GoodData Platform running on given host using given user's * credentials. @@ -157,7 +155,6 @@ public GoodData(String hostname, String login, String password, int port, GoodDa this(hostname, login, password, port, PROTOCOL, settings); } - /** * Create instance configured to communicate with GoodData Platform running on given host, port and protocol using * given user's credentials. diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index a8fea9ef0..5e7c2eba6 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -67,6 +67,10 @@ public Account(String firstName,String lastName, Links links) { /** * Account creation constructor + * @param email email + * @param firstName first name + * @param lastName last name + * @param password password */ public Account(String email, String password, String firstName, String lastName) { this(email, email, password, password, firstName, lastName, null); diff --git a/src/main/java/com/gooddata/account/AccountService.java b/src/main/java/com/gooddata/account/AccountService.java index caa5ef867..30cdd225e 100644 --- a/src/main/java/com/gooddata/account/AccountService.java +++ b/src/main/java/com/gooddata/account/AccountService.java @@ -101,7 +101,7 @@ public void removeAccount(Account account) { * @param id to search for * @return account for id * @throws AccountNotFoundException when account for given id can't be found - * @throws GoodDataException + * @throws GoodDataException when different error occurs */ public Account getAccountById(String id) { try { @@ -122,7 +122,7 @@ public Account getAccountById(String id) { * @param uri to search for * @return account for uri * @throws AccountNotFoundException when account for given uri can't be found - * @throws GoodDataException + * @throws GoodDataException when different error occurs */ public Account getAccountByUri(String uri) { return getAccountById(Account.getId(uri)); diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 164debba0..ec974cdac 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -51,8 +51,8 @@ public DataloadProcess(String name, String type) { /** * Use this constructor, when you want to deploy process from appstore. * - * @param name - * @param type + * @param name name + * @param type type * @param appstorePath valid path to brick in appstore */ public DataloadProcess(String name, String type, String appstorePath) { diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index 9cd445cad..5fa88b0bb 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -33,6 +33,7 @@ public List getIds() { } /** + * @return list of values * @deprecated for backward compatibility only. Do not use this method, it always returns null. */ @Deprecated diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index 948e951ed..6e7ee0406 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -34,14 +34,14 @@ private static ProjectValidationResultSliElParam create(@JsonProperty("ids") Lis } /** - * Returns list of IDs. IDs are primary property of this param. + * @return list of IDs. IDs are primary property of this param. */ public List getIds() { return ids; } /** - * Returns list of values. Values have only informative character and are connected to IDs. + * @return list of values. Values have only informative character and are connected to IDs. * * @see #getIds() */ diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 461a9d6e5..ca7f136b5 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -242,6 +242,7 @@ public void handlePollException(final GoodDataRestException e) { /** * Remove given user from warehouse instance * @param user to remove from warehouse + * @return empty future result * @throws WarehouseUserNotFoundException when user for removal can't be found * @throws GoodDataException any other reason */ From f61dadc36ba48ddd7053f79a36ba764486fb5edf Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 3 Oct 2016 17:12:16 +0200 Subject: [PATCH 0433/1191] introduce update methods without project argument It makes no sense to require the project argument for update methods, as the object to update already contains the URI. Similary we don't require project argument for remove methods. --- .../dataload/processes/ProcessService.java | 54 +++++++++++++++++-- .../dataload/processes/ProcessServiceAT.java | 6 +-- .../dataload/processes/ProcessServiceIT.java | 4 +- .../processes/ProcessServiceTest.java | 19 ++----- 4 files changed, 59 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index be1ad91a8..5cfea4de7 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -127,13 +127,27 @@ public FutureResult createProcessFromAppstore(Project project, * @param process to create * @param processData process data to upload * @return updated process + * @deprecated use {@link #updateProcess(DataloadProcess, File)} */ + @Deprecated public DataloadProcess updateProcess(Project project, DataloadProcess process, File processData) { + return updateProcess(process, processData); + } + + /** + * Update process with given data by given project. + * Process must have null path to prevent clashes with deploying from appstore. + * + * @param process to create + * @param processData process data to upload + * @return updated process + */ + public DataloadProcess updateProcess(DataloadProcess process, File processData) { notNull(process, "process"); + notNull(process.getUri(), "process.uri"); notNull(processData, "processData"); - notNull(project, "project"); isTrue(process.getPath() == null, "Process path has to be null, use processData argument. If you want to update process from appstore, use method updateProcessFromAppstore()"); - return postProcess(process, processData, getProcessUri(project, process.getId())); + return postProcess(process, processData, URI.create(process.getUri())); } /** @@ -144,7 +158,9 @@ public DataloadProcess updateProcess(Project project, DataloadProcess process, F * @param project project to which the process belongs * @param process to update * @return updated process + * @deprecated use {@link #updateProcessFromAppstore(DataloadProcess)} */ + @Deprecated public FutureResult updateProcessFromAppstore(Project project, DataloadProcess process) { notNull(project, "project"); notNull(process, "process"); @@ -152,6 +168,21 @@ public FutureResult updateProcessFromAppstore(Project project, return postProcess(process, getProcessUri(project, process.getId()), HttpMethod.PUT); } + /** + * Update process with data from appstore by given project. + * Process must have set path field to valid appstore path in order to deploy from appstore. + * This method is asynchronous, because when deploying from appstore, deployment worker can be triggered. + * + * @param process to update + * @return updated process + */ + public FutureResult updateProcessFromAppstore(DataloadProcess process) { + notNull(process, "process"); + notNull(process.getUri(), "process.uri"); + notEmpty(process.getPath(), "process path must not be empty"); + return postProcess(process, URI.create(process.getUri()), HttpMethod.PUT); + } + /** * Get process by given URI. * @param uri process uri @@ -323,18 +354,31 @@ public Schedule createSchedule(Project project, Schedule schedule) { } /** - * Update connector integration + * Update the given schedule * * @param project project * @param schedule to update * @return updated Schedule * @throws ScheduleNotFoundException when the schedule doesn't exist + * @deprecated use {@link #updateSchedule(Schedule)} */ + @Deprecated public Schedule updateSchedule(final Project project, Schedule schedule) { + return updateSchedule(schedule); + } + + /** + * Update the given schedule + * + * @param schedule to update + * @return updated Schedule + * @throws ScheduleNotFoundException when the schedule doesn't exist + */ + public Schedule updateSchedule(Schedule schedule) { notNull(schedule, "schedule"); - notNull(project, "project"); + notNull(schedule.getUri(), "schedule.uri"); - final String uri = getScheduleUri(project, schedule.getId()).toString(); + final String uri = schedule.getUri(); try { final ResponseEntity response = restTemplate .exchange(uri, HttpMethod.PUT, new HttpEntity<>(schedule), Schedule.class); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 0a1d00ae9..ee1c9e9fc 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -91,10 +91,10 @@ public void updateSchedule() { schedule.setState(ScheduleState.DISABLED); schedule.setReschedule(Duration.standardMinutes(26)); - schedule = gd.getProcessService().updateSchedule(project, schedule); + schedule = gd.getProcessService().updateSchedule(schedule); assertThat(schedule.isEnabled(), is(false)); - assertThat(gd.getProcessService().updateSchedule(project, schedule).getRescheduleInMinutes(), is(26)); + assertThat(gd.getProcessService().updateSchedule(schedule).getRescheduleInMinutes(), is(26)); } @Test(groups = "process", dependsOnGroups = "project") @@ -109,7 +109,7 @@ public void createProcessFromGit() { @Test(groups = "process", dependsOnMethods = "createProcessFromGit") public void updateProcessFromGit() { processAppstore.setPath("${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyBonjour"); - processAppstore = gd.getProcessService().updateProcessFromAppstore(project, processAppstore).get(); + processAppstore = gd.getProcessService().updateProcessFromAppstore(processAppstore).get(); assertThat(processAppstore.getExecutables(), contains("bonjour.rb")); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 2cc29cb42..948ad6b4b 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -251,7 +251,7 @@ public void shouldUpdateSchedule() throws Exception { .withStatus(200); schedule.setState(ScheduleState.DISABLED); - final Schedule updated = gd.getProcessService().updateSchedule(project, schedule); + final Schedule updated = gd.getProcessService().updateSchedule(schedule); assertThat(updated, notNullValue()); assertThat(updated.isEnabled(), is(false)); } @@ -364,7 +364,7 @@ public void shouldUpdateProcessFromAppstore() { .withBody(readFromResource("/dataload/processes/appstoreProcess.json")); process.setPath("${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello"); - DataloadProcess updatedProcess = gd.getProcessService().updateProcessFromAppstore(project, process).get(); + DataloadProcess updatedProcess = gd.getProcessService().updateProcessFromAppstore(process).get(); assertThat(updatedProcess, notNullValue()); assertThat(updatedProcess.getType(), is(equalTo(ProcessType.RUBY.toString()))); assertThat(updatedProcess.getExecutables(), contains("hello.rb") ); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 5a8ab2b54..1c4fb3181 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -77,6 +77,7 @@ public void setUp() throws Exception { MockitoAnnotations.initMocks(this); processService = new ProcessService(restTemplate, accountService, dataStoreService); when(process.getId()).thenReturn(PROCESS_ID); + when(process.getUri()).thenReturn(DataloadProcess.TEMPLATE.expand(PROJECT_ID, PROCESS_ID).toString()); when(project.getId()).thenReturn(PROJECT_ID); when(accountService.getCurrent()).thenReturn(account); when(account.getId()).thenReturn(ACCOUNT_ID); @@ -133,33 +134,23 @@ private static File createProcessOfSize(int size) throws Exception { return file; } - @Test(expectedExceptions = IllegalArgumentException.class) - public void testUpdateProcessWithNullProject() throws Exception { - processService.updateProcess(null, process, File.createTempFile("test", null)); - } - @Test(expectedExceptions = IllegalArgumentException.class) public void testUpdateProcessWithNullProcess() throws Exception { - processService.updateProcess(project, null, File.createTempFile("test", null)); - } - - @Test(expectedExceptions = IllegalArgumentException.class) - public void testUpdateProcessWithNullFile() throws Exception { - processService.updateProcess(project, process, (File) null); + processService.updateProcess(null, File.createTempFile("test", null)); } @Test(expectedExceptions = GoodDataException.class) public void testUpdateProcessWithRestClientError() throws Exception { when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), eq(DataloadProcess.class))).thenThrow(new RestClientException("")); - processService.updateProcess(project, process, File.createTempFile("test", null)); + processService.updateProcess(process, File.createTempFile("test", null)); } @Test(expectedExceptions = GoodDataException.class) public void testUpdateProcessWithNoApiResponse() throws Exception { when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), eq(DataloadProcess.class))).thenReturn(null); - processService.updateProcess(project, process, File.createTempFile("test", null)); + processService.updateProcess(process, File.createTempFile("test", null)); } @Test @@ -167,7 +158,7 @@ public void testUpdateProcess() throws Exception { when(restTemplate.exchange(eq(create(PROCESS_URI)), any(HttpMethod.class), any(HttpEntity.class), eq(DataloadProcess.class))).thenReturn(new ResponseEntity<>(process, HttpStatus.OK)); final DataloadProcess result = processService - .updateProcess(project, process, File.createTempFile("test", null)); + .updateProcess(process, File.createTempFile("test", null)); assertThat(result, is(process)); } From dd121340fb2f24f2687f748236a99e66ce7fe28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 10 Oct 2016 14:15:04 +0200 Subject: [PATCH 0434/1191] Fixed order of tests in ProcessServiceAT --- .../java/com/gooddata/dataload/processes/ProcessServiceAT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index c0ba9f86f..7d68e7376 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -133,7 +133,7 @@ public void failExecuteProcess() throws Exception { processService.executeProcess(new ProcessExecution(process, "invalid.grf")).get(); } - @Test(dependsOnGroups = "process") + @Test(dependsOnGroups = "process", dependsOnMethods = "removeSchedule") public void removeProcess() throws Exception { gd.getProcessService().removeProcess(process); gd.getProcessService().removeProcess(processAppstore); From 5d9ea299b3f266ae4744a3c23bcf2eb9db811ecb Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 11 Oct 2016 15:32:25 +0200 Subject: [PATCH 0435/1191] fix invalid report's domain serialization Also removing protected report's constructor since I believe it makes no sense to test serialization of something what can't be created by SDK user. --- src/main/java/com/gooddata/md/report/Report.java | 16 ++++++++-------- .../java/com/gooddata/md/report/ReportTest.java | 15 ++++++++++----- src/test/resources/md/report/report-input.json | 4 +--- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 259d6b76c..7b9a75de2 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -19,6 +19,7 @@ import java.util.Collection; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; /** * Report @@ -37,14 +38,14 @@ private Report(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content this.content = content; } - /* Just for serialization test */ - Report(String title, String domain, String... definitions) { - super(new Meta(title)); - content = new Content(asList(definitions), asList(domain)); - } - + /** + * Creates new report with given title and definitions + * @param title report title + * @param definitions report definitions + */ public Report(String title, ReportDefinition... definitions) { - this(title, null, uris(definitions)); + // domains must be empty list to be included in serialized form properly + this(new Meta(title), new Content(asList(uris(definitions)), emptyList())); } @JsonIgnore @@ -57,7 +58,6 @@ public Collection getDomains() { return content.getDomains(); } - @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { private final Collection definitions; private final Collection domains; diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 148429f82..2ce04d5a1 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -13,11 +13,13 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class ReportTest { - public static final String DEFINITION = "/gdc/md/PROJECT_ID/obj/DEF_ID"; - public static final String DOMAIN = "/gdc/md/PROJECT_ID/obj/DOM_ID"; + private static final String DEFINITION_URI = "/gdc/md/PROJECT_ID/obj/DEF_ID"; + private static final String DOMAIN_URI = "/gdc/md/PROJECT_ID/obj/DOM_ID"; @Test public void testDeserialization() throws Exception { @@ -25,16 +27,19 @@ public void testDeserialization() throws Exception { assertThat(report, is(notNullValue())); assertThat(report.getDefinitions(), is(notNullValue())); assertThat(report.getDefinitions(), hasSize(1)); - assertThat(report.getDefinitions().iterator().next(), is(DEFINITION)); + assertThat(report.getDefinitions().iterator().next(), is(DEFINITION_URI)); assertThat(report.getDomains(), is(notNullValue())); assertThat(report.getDomains(), hasSize(1)); - assertThat(report.getDomains().iterator().next(), is(DOMAIN)); + assertThat(report.getDomains().iterator().next(), is(DOMAIN_URI)); } @Test public void testSerialization() throws Exception { - final Report report = new Report("Beers Consumed This Week", DOMAIN, DEFINITION); + final ReportDefinition definition = mock(ReportDefinition.class); + when(definition.getUri()).thenReturn(DEFINITION_URI); + + final Report report = new Report("Beers Consumed This Week", definition); assertThat(report, serializesToJson("/md/report/report-input.json")); } diff --git a/src/test/resources/md/report/report-input.json b/src/test/resources/md/report/report-input.json index 51963d408..beaa12c74 100644 --- a/src/test/resources/md/report/report-input.json +++ b/src/test/resources/md/report/report-input.json @@ -1,9 +1,7 @@ { "report" : { "content" : { - "domains" : [ - "/gdc/md/PROJECT_ID/obj/DOM_ID" - ], + "domains" : [], "definitions" : [ "/gdc/md/PROJECT_ID/obj/DEF_ID" ] From 30e4f77bf1d80d9657afffe1ff6593fbb2133b9d Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Mon, 10 Oct 2016 07:30:59 +0200 Subject: [PATCH 0436/1191] introduce zendesk process download parameters --- .../connector/Zendesk4ProcessExecution.java | 74 ++++++++++++++++++- .../Zendesk4ProcessExecutionTest.java | 17 +++++ .../connector/process-execution-download.json | 9 +++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/test/resources/connector/process-execution-download.json diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 4ddb931f7..326a56600 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -10,6 +10,9 @@ import static com.gooddata.util.Validate.notNull; import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.util.ISODateTimeSerializer; import org.joda.time.DateTime; @@ -26,6 +29,8 @@ public class Zendesk4ProcessExecution implements ProcessExecution { private Map startTimes; + private DownloadParams downloadParams; + @Override public ConnectorType getConnectorType() { return ZENDESK4; @@ -50,8 +55,75 @@ public void setStartTime(final String resource, final DateTime startTime) { notEmpty(resource, "resource"); notNull(startTime, "startTime"); - startTimes = startTimes == null ? new TreeMap() : startTimes; + startTimes = startTimes == null ? new TreeMap<>() : startTimes; startTimes.put(resource + "StartDate", startTime); } + + @JsonIgnore + public DownloadParams getDownloadParams() { + if (downloadParams == null) { + downloadParams = new DownloadParams(); + } + return downloadParams; + } + + @JsonProperty("downloadParams") + private DownloadParams getDownloadParamsPlain() { + return downloadParams; + } + + public void setDownloadParams(DownloadParams downloadParams) { + this.downloadParams = downloadParams; + } + + @JsonInclude(JsonInclude.Include.NON_NULL) + static class DownloadParams { + private Boolean useBackup; + private Integer parallelWorkers; + private Integer parallelBatchSeconds; + + public DownloadParams(Boolean useBackup, Integer parallelWorkers, Integer parallelBatchSeconds) { + this.useBackup = useBackup; + this.parallelWorkers = parallelWorkers; + this.parallelBatchSeconds = parallelBatchSeconds; + } + + public DownloadParams(Integer parallelWorkers, Integer parallelBatchSeconds) { + this(null, parallelWorkers, parallelBatchSeconds); + } + + public DownloadParams(Boolean useBackup) { + this(useBackup, null, null); + } + + private DownloadParams() {} + + @JsonProperty("useBackup") + public Boolean getUseBackup() { + return useBackup; + } + + public void setUseBackup(Boolean useBackup) { + this.useBackup = useBackup; + } + + @JsonProperty("parallelWorkers") + public Integer getParallelWorkers() { + return parallelWorkers; + } + + public void setParallelWorkers(Integer parallelWorkers) { + this.parallelWorkers = parallelWorkers; + } + + @JsonProperty("parallelBatchSeconds") + public Integer getParallelBatchSeconds() { + return parallelBatchSeconds; + } + + public void setParallelBatchSeconds(Integer parallelBatchSeconds) { + this.parallelBatchSeconds = parallelBatchSeconds; + } + } } diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index 320af8ddb..27edcf41e 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -6,10 +6,12 @@ package com.gooddata.connector; import com.gooddata.JsonMatchers; +import com.gooddata.connector.Zendesk4ProcessExecution.DownloadParams; import org.joda.time.DateTime; import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; public class Zendesk4ProcessExecutionTest { @@ -35,4 +37,19 @@ public void testShouldSerializeStartTimes() throws Exception { assertThat(execution, JsonMatchers.serializesToJson( "/connector/process-execution-startDate.json")); } + + @Test + public void testShouldSerializeDownloadParams() throws Exception { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + execution.setDownloadParams(new DownloadParams(true, 5, 3600)); + assertThat(execution, JsonMatchers.serializesToJson( + "/connector/process-execution-download.json")); + } + + @Test + public void testGetDownloadParams() throws Exception { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + final DownloadParams downloadParams = execution.getDownloadParams(); + assertThat(downloadParams, notNullValue()); + } } \ No newline at end of file diff --git a/src/test/resources/connector/process-execution-download.json b/src/test/resources/connector/process-execution-download.json new file mode 100644 index 000000000..42ccc4838 --- /dev/null +++ b/src/test/resources/connector/process-execution-download.json @@ -0,0 +1,9 @@ +{ + "process": { + "downloadParams": { + "useBackup": true, + "parallelWorkers": 5, + "parallelBatchSeconds": 3600 + } + } +} \ No newline at end of file From 041a8e0a9b011440e4736b640a3919635df0c878 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 13 Oct 2016 11:19:28 +0200 Subject: [PATCH 0437/1191] [maven-release-plugin] prepare release gooddata-java-2.1.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 662c317ec..16db9b343 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.0.1-SNAPSHOT + 2.1.0 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 0fa80d1402270033c5f18ac905c2ff9807b6fbce Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 13 Oct 2016 11:19:28 +0200 Subject: [PATCH 0438/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 16db9b343..b948816dc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.0 + 2.1.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From d485c49aaa9f8339324f900876d515d522e4929f Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 13 Oct 2016 11:37:23 +0200 Subject: [PATCH 0439/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bca8c0543..699973f84 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.0.0 + 2.1.0 ``` See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, From a50ebea1a6d7f283e67d2868da75d1cecdefddc6 Mon Sep 17 00:00:00 2001 From: Peter Plochan Date: Fri, 14 Oct 2016 10:59:25 +0200 Subject: [PATCH 0440/1191] Change Zendesk4ProcessExecution.DownloadParams visibility to public --- .../java/com/gooddata/connector/Zendesk4ProcessExecution.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 326a56600..5d85cfd6c 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -78,7 +78,7 @@ public void setDownloadParams(DownloadParams downloadParams) { } @JsonInclude(JsonInclude.Include.NON_NULL) - static class DownloadParams { + public static class DownloadParams { private Boolean useBackup; private Integer parallelWorkers; private Integer parallelBatchSeconds; From 887f0a8d8ea39d6421a83a6cfbb7234bc8009ff2 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 14 Oct 2016 13:48:53 +0200 Subject: [PATCH 0441/1191] [maven-release-plugin] prepare release gooddata-java-2.1.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b948816dc..5d05a588f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.1-SNAPSHOT + 2.1.1 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 64c5dfed7f0a2a1239063c6a88fd07f66f506c5c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 14 Oct 2016 13:48:53 +0200 Subject: [PATCH 0442/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5d05a588f..ca215cc20 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.1 + 2.1.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 57f1db891dce133bf32a02c4d0a774a8d84a7247 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Fri, 14 Oct 2016 14:26:44 +0200 Subject: [PATCH 0443/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 699973f84..e805cdfed 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.1.0 + 2.1.1 ``` See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, From 1338955f3d61ad5752f1ac0ddb206775c32eceea Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 20 Oct 2016 11:14:50 +0200 Subject: [PATCH 0444/1191] Raise Jackson version to 2.8.4 with bugfixes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ca215cc20..ea7ee5852 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ UTF-8 UTF-8 4.3.3 - 2.8.0 + 2.8.4 4.3.1.RELEASE 1.1.1 1.5.3 From db9a8502c2655c054fed6ce3497e75abaa165a1c Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 20 Oct 2016 11:38:09 +0200 Subject: [PATCH 0445/1191] [maven-release-plugin] prepare release gooddata-java-2.1.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ea7ee5852..03e9d443f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.2-SNAPSHOT + 2.1.2 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 77622a902ff30a06c6d45bc19efd0641ce5fcb64 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 20 Oct 2016 11:38:10 +0200 Subject: [PATCH 0446/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 03e9d443f..26555c7e1 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.2 + 2.1.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 714a764894a2011f94a6bc9a0938ccbba3fe1ff5 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 20 Oct 2016 11:45:41 +0200 Subject: [PATCH 0447/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e805cdfed..20844db80 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.1.1 + 2.1.2 ``` See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, From 3b45c9d25cc71dd1a2b31fc8c5b7aa667966e010 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Oct 2016 13:20:32 +0200 Subject: [PATCH 0448/1191] handle different exception when webdav is on the same hostname --- .../com/gooddata/gdc/DataStoreService.java | 22 +++++++++++++++---- .../com/gooddata/gdc/DatastoreServiceAT.java | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 433db979c..54c4b1baa 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -7,7 +7,6 @@ import com.github.sardine.Sardine; import com.github.sardine.impl.SardineException; -import com.github.sardine.impl.SardineImpl; import com.gooddata.UriPrefixer; import org.apache.http.Header; import org.apache.http.HeaderIterator; @@ -19,6 +18,7 @@ import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; +import org.apache.http.client.NonRepeatableRequestException; import org.apache.http.client.ResponseHandler; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpUriRequest; @@ -104,16 +104,30 @@ private void upload(URI url, InputStream stream) { sardine.put(url.toString(), stream); } catch (SardineException e) { if (HttpStatus.INTERNAL_SERVER_ERROR.value() == e.getStatusCode()) { - throw new DataStoreException("Got 500 while uploading to " + url + "." - + "\nThis can be known limitation, see https://github.com/martiner/gooddata-java/wiki/Known-limitations", e); + // this error may occur when user issues request to WebDAV before SST and TT were obtained + // and WebDAV is deployed on a separate hostname + // see https://github.com/martiner/gooddata-java/wiki/Known-limitations + throw new DataStoreException(createUnAuthRequestWarningMessage(url), e); } else { throw new DataStoreException("Unable to upload to " + url + " got status " + e.getStatusCode(), e); } } catch (IOException e) { - throw new DataStoreException("Unable to upload to " + url, e); + // this error may occur when user issues request to WebDAV before SST and TT were obtained + // and WebDAV deployed on the same hostname + // see https://github.com/martiner/gooddata-java/wiki/Known-limitations + if (e.getCause() instanceof NonRepeatableRequestException) { + throw new DataStoreException(createUnAuthRequestWarningMessage(url), e); + } else { + throw new DataStoreException("Unable to upload to " + url, e); + } } } + private String createUnAuthRequestWarningMessage(final URI url) { + return "Got 500 while uploading to " + url + "." + + "\nThis can be known limitation, see https://github.com/martiner/gooddata-java/wiki/Known-limitations"; + } + /** * Download given path and return data as stream * @param path path from where to download diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 6ddb64af2..068a869a3 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -95,7 +95,7 @@ public void datastoreConnectionClosedAfterSingleConnection() throws Exception { @Test(groups = "datastore", expectedExceptions = DataStoreException.class, expectedExceptionsMessageRegExp = "(?s).* 500 .*https://github.com/.*/Known-limitations") - public void datastoreUploadWithAuthentication() throws Exception { + public void shouldThrowExceptionWithMessageOnUnAuthRequest() throws Exception { final GoodData datastoreGd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); DataStoreService dataStoreService = datastoreGd.getDataStoreService(); From ae5f5b161faaff300d40f71e2050c23ccbe30006 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Oct 2016 16:27:07 +0200 Subject: [PATCH 0449/1191] introduce dedicated testing page --- CONTRIBUTING.md | 13 ------------- README.md | 5 +++++ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8678e8ac4..8fb045d98 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -63,16 +63,3 @@ is specific enough. * When you need some **utility code**, look for handy utilities in used libraries first (e.g. _Spring_ has its `StreamUtils`, `FileCopyUtils`, ...). When you decide to create new utility class, use _abstract utility class pattern_. - -## How-tos -### Run acceptance tests -These tests have to be run against GoodData API, so one has to first set endpoint and credentials. It's being set by -environment variables: `host`, `login`, `pass`, `projectToken`, `warehouseToken`. Tests can be then run by: -`mvn verify -Pat`. - -One can also use one-liner like this: -`host=... login=... pass=... projectToken=... warehouseToken=... mvn verify -Pat` - -One can also run only subset by specifying tests or groups to be run: -`mvn -Dgroups=featureFlag,project,account verify -Pat` or -`mvn -Dit.test=FeatureFlagServiceAT,ProjectServiceAT,AccountServiceAT verify -Pat`. diff --git a/README.md b/README.md index 20844db80..c2540bd71 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,11 @@ The *GoodData Java SDK* uses: The *GoodData Java SDK* is free and open-source software provided by GoodData Corporation "as-is" under [BSD License](LICENSE.txt). +## Development + +Build the library with `mvn package`, see the +[Testing](https://github.com/martiner/gooddata-java/wiki/Testing) page for different testing methods. + ## Contribute Found a bug? Please create an [issue](https://github.com/martiner/gooddata-java/issues). Missing functionality? From 3d46c8afeb842f719166eeaa5eddaa6ca7017210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Sat, 29 Oct 2016 22:22:55 +0200 Subject: [PATCH 0450/1191] add support for warehouse schemas close: #394 --- .../gooddata/warehouse/WarehouseSchema.java | 69 +++++++++++++++++ .../WarehouseSchemaNotFoundException.java | 26 +++++++ .../gooddata/warehouse/WarehouseSchemas.java | 42 +++++++++++ .../WarehouseSchemasDeserializer.java | 27 +++++++ .../gooddata/warehouse/WarehouseService.java | 65 ++++++++++++++++ .../warehouse/WarehouseSchemaTest.java | 41 ++++++++++ .../warehouse/WarehouseSchemasTest.java | 25 +++++++ .../warehouse/WarehouseServiceAT.java | 22 ++++++ .../warehouse/WarehouseServiceIT.java | 74 +++++++++++++++++++ src/test/resources/warehouse/schema.json | 11 +++ src/test/resources/warehouse/schemas.json | 20 +++++ 11 files changed, 422 insertions(+) create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseSchema.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseSchemaNotFoundException.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseSchemas.java create mode 100644 src/main/java/com/gooddata/warehouse/WarehouseSchemasDeserializer.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java create mode 100644 src/test/java/com/gooddata/warehouse/WarehouseSchemasTest.java create mode 100644 src/test/resources/warehouse/schema.json create mode 100644 src/test/resources/warehouse/schemas.json diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchema.java b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java new file mode 100644 index 000000000..44e7d7826 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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.JsonProperty; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonTypeName; +import org.springframework.web.util.UriTemplate; + +import java.util.Map; + +/** + * Warehouse schema. + * Deserialization Only. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("schema") +@JsonIgnoreProperties(ignoreUnknown = true) +public class WarehouseSchema { + + private static final String SELF_LINK = "self"; + private static final String INSTANCE_LINK = "instance"; + + public static final String URI = WarehouseSchemas.URI + "/{name}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private final String name; + + private final String description; + + private final Map links; + + @JsonCreator + private WarehouseSchema(@JsonProperty("name") final String name, + @JsonProperty("description") final String description, + @JsonProperty("links") final Map links) { + this.name = name; + this.description = description; + this.links = links; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public Map getLinks() { + return links; + } + + @JsonIgnore + public String getUri() { + return links != null ? links.get(SELF_LINK): null; + } + + @JsonIgnore + public String getInstanceUri() { + return links != null ? links.get(INSTANCE_LINK): null; + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchemaNotFoundException.java b/src/main/java/com/gooddata/warehouse/WarehouseSchemaNotFoundException.java new file mode 100644 index 000000000..f000286b9 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchemaNotFoundException.java @@ -0,0 +1,26 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; +import com.gooddata.GoodDataRestException; + +/** + * Warehouse schema doesn't exist. + */ +public class WarehouseSchemaNotFoundException extends GoodDataException { + + private final String warehouseSchemaUri; + + public WarehouseSchemaNotFoundException(String uri, GoodDataRestException cause) { + super("Warehouse schema " + uri + " was not found", cause); + this.warehouseSchemaUri = uri; + } + + public String getWarehouseSchemaUri() { + return warehouseSchemaUri; + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java b/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java new file mode 100644 index 000000000..2b4256f5a --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java @@ -0,0 +1,42 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 com.gooddata.collections.Paging; +import org.springframework.web.util.UriTemplate; + +import java.util.List; +import java.util.Map; + +/** + * List of warehouse schemas. + * Deserialization Only. + */ +@JsonDeserialize(using = WarehouseSchemasDeserializer.class) +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName(WarehouseSchemas.ROOT_NODE) +@JsonIgnoreProperties(ignoreUnknown = true) +public class WarehouseSchemas extends PageableList { + + public static final String URI = Warehouse.URI + "/schemas"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + static final String ROOT_NODE = "schemas"; + + public WarehouseSchemas(final List items, final Paging paging) { + super(items, paging); + } + + public WarehouseSchemas(final List items, final Paging paging, final Map links) { + super(items, paging, links); + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchemasDeserializer.java b/src/main/java/com/gooddata/warehouse/WarehouseSchemasDeserializer.java new file mode 100644 index 000000000..3b345dd21 --- /dev/null +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchemasDeserializer.java @@ -0,0 +1,27 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +/** + * Deserializer of WarehouseSchemas. + */ +class WarehouseSchemasDeserializer extends PageableListDeserializer { + + protected WarehouseSchemasDeserializer() { + super(WarehouseSchema.class); + } + + @Override + protected WarehouseSchemas createList(final List items, final Paging paging, final Map links) { + return new WarehouseSchemas(items, paging, links); + } +} diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index ca7f136b5..95d9d680c 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -31,6 +31,8 @@ */ public class WarehouseService extends AbstractService { + private static final String DEFAULT_SCHEMA_NAME = "default"; + /** * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending * this abstract one. @@ -303,4 +305,67 @@ public Warehouse updateWarehouse(Warehouse toUpdate) { return getWarehouseByUri(toUpdate.getUri()); } + + /** + * list schemas for Warehouse + * + * @param warehouse to list schemas for + * @return pageable list of warehouse schemas + */ + public PageableList listWarehouseSchemas(final Warehouse warehouse) { + try { + final WarehouseSchemas result = restTemplate.getForObject(WarehouseSchemas.TEMPLATE.expand(warehouse.getId()), WarehouseSchemas.class); + if (result == null) { + return new PageableList<>(); + } + return result; + } catch (GoodDataException | RestClientException e) { + throw new GoodDataException("Unable to list Warehouse schemas", e); + } + } + + /** + * get warehouse schema by name + * + * @param warehouse to get schema for + * @param name of schema + * @return warehouse schema + */ + public WarehouseSchema getWarehouseSchemaByName(final Warehouse warehouse, final String name) { + notNull(warehouse, "warehouse"); + notEmpty(name, "name"); + final String uri = WarehouseSchema.TEMPLATE.expand(warehouse.getId(), name).toString(); + return getWarehouseSchemaByUri(uri); + } + + /** + * get warehouse schema by uri + * + * @param uri of schema + * @return warehouse schema + */ + public WarehouseSchema getWarehouseSchemaByUri(final String uri) { + notEmpty(uri, "uri"); + try { + return restTemplate.getForObject(uri, WarehouseSchema.class); + } catch (GoodDataRestException e) { + if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { + throw new WarehouseSchemaNotFoundException(uri.toString(), e); + } else { + throw e; + } + } catch (RestClientException e) { + throw new GoodDataException("Unable to get Warehouse instance " + uri, e); + } + } + + /** + * get default warehouse schema + * + * @param warehouse to get default schema for + * @return default warehouse schema + */ + public WarehouseSchema getDefaultWarehouseSchema(final Warehouse warehouse) { + return getWarehouseSchemaByName(warehouse, DEFAULT_SCHEMA_NAME); + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java new file mode 100644 index 000000000..fe5f12a85 --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java @@ -0,0 +1,41 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; + +public class WarehouseSchemaTest { + + private static final String NAME = "default"; + private static final String DESCRIPTION = "Default schema for new ADS instance"; + private static final String SELF_LINK = "/gdc/datawarehouse/instances/instanceId/schemas/default"; + private static final String INSTANCE = "/gdc/datawarehouse/instances/instanceId"; + private static final String PARENT = "/gdc/datawarehouse/instances/warehouseId/schemas"; + private static final Map LINKS = new LinkedHashMap() {{ + put("self", SELF_LINK); + put("instance", INSTANCE); + put("parent", PARENT); + }}; + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/schema.json"); + final WarehouseSchema warehouseSchema = new ObjectMapper().readValue(stream, WarehouseSchema.class); + + assertThat(warehouseSchema.getName(), is(NAME)); + assertThat(warehouseSchema.getDescription(), is(DESCRIPTION)); + assertThat(warehouseSchema.getLinks(), is(equalTo(LINKS))); + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseSchemasTest.java b/src/test/java/com/gooddata/warehouse/WarehouseSchemasTest.java new file mode 100644 index 000000000..b72a8a391 --- /dev/null +++ b/src/test/java/com/gooddata/warehouse/WarehouseSchemasTest.java @@ -0,0 +1,25 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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 static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.core.Is.is; + +import org.testng.annotations.Test; + +public class WarehouseSchemasTest { + private final WarehouseSchemas warehouseSchemas = readObjectFromResource("/warehouse/schemas.json", WarehouseSchemas.class); + + @Test + public void testDeserialization() throws Exception { + assertThat(warehouseSchemas, notNullValue()); + assertThat(warehouseSchemas, hasSize(1)); + assertThat(warehouseSchemas.get(0).getName(), is("default")); + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index 315c056a5..e8d313477 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -21,6 +21,9 @@ import static com.gooddata.warehouse.WarehouseIdMatcher.hasSameIdAs; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasProperty; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -34,6 +37,7 @@ public class WarehouseServiceAT extends AbstractGoodDataAT { private static final String LOGIN = "john.smith." + UUID.randomUUID() + "@gooddata.com"; + private static final String SCHEMA_NAME = "default"; private final String warehouseToken; private final WarehouseService service; @@ -118,6 +122,24 @@ public void shouldRemoveUserFromWarehouse() { warehouseUser = null; } + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void listWarehouseSchemas() { + PageableList warehouseSchemas = service.listWarehouseSchemas(warehouse); + assertThat(warehouseSchemas, contains(hasProperty("name", equalTo(SCHEMA_NAME)))); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void getWarehouseSchema() { + WarehouseSchema warehouseSchema = service.getWarehouseSchemaByName(warehouse, SCHEMA_NAME); + assertThat(warehouseSchema, is(notNullValue())); + } + + @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") + public void getDefaultWarehouseSchema() { + WarehouseSchema warehouseSchema = service.getDefaultWarehouseSchema(warehouse); + assertThat(warehouseSchema, is(notNullValue())); + } + @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 ee670dde7..a7fb6dd4c 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -22,6 +22,7 @@ import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.verifyThatRequest; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.Is.is; @@ -30,11 +31,13 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { private static final String TITLE = "Test"; + private static final String SCHEMA_NAME = "default"; private static final String TASK_POLL = "/warehouse/warehouseTask-poll.json"; private static final String TASK_DONE = "/warehouse/warehouseTask-finished.json"; private static final String WAREHOUSE_ID = "instanceId"; 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 WAREHOUSE_URI = Warehouse.TEMPLATE.expand(WAREHOUSE_ID).toString(); private static final String WAREHOUSE_USER_URI = WarehouseUsers.TEMPLATE.expand(WAREHOUSE_ID).toString(); @@ -45,12 +48,14 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { private WarehouseTask pollingTask; private WarehouseTask finishedTask; private Warehouse warehouse; + private WarehouseSchema warehouseSchema; @BeforeClass public void setUp() throws Exception { pollingTask = MAPPER.readValue(readFromResource(TASK_POLL), WarehouseTask.class); finishedTask = MAPPER.readValue(readFromResource(TASK_DONE), WarehouseTask.class); warehouse = MAPPER.readValue(readFromResource(WAREHOUSE), Warehouse.class); + warehouseSchema = MAPPER.readValue(readFromResource(WAREHOUSE_SCHEMA), WarehouseSchema.class); } @Test @@ -301,4 +306,73 @@ public void shouldFailWhenRemoveUserTaskFails() throws Exception { .get(); } + @Test + public void shouldGetWarehouseSchemaByName() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouseSchema.getUri()) + .respond() + .withBody(readFromResource(WAREHOUSE_SCHEMA)) + .withStatus(200); + + final WarehouseSchema result = gd.getWarehouseService().getWarehouseSchemaByName(warehouse, SCHEMA_NAME); + assertThat(result, notNullValue()); + assertThat(result.getName(), is(SCHEMA_NAME)); + } + + @Test + public void shouldGetDefaultWarehouseSchema() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouseSchema.getUri()) + .respond() + .withBody(readFromResource(WAREHOUSE_SCHEMA)) + .withStatus(200); + + final WarehouseSchema result = gd.getWarehouseService().getDefaultWarehouseSchema(warehouse); + assertThat(result, notNullValue()); + assertThat(result.getName(), is(SCHEMA_NAME)); + } + + @Test + public void shouldGetWarehouseSchemaByUri() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouseSchema.getUri()) + .respond() + .withBody(readFromResource(WAREHOUSE_SCHEMA)) + .withStatus(200); + + final WarehouseSchema result = gd.getWarehouseService().getWarehouseSchemaByUri(warehouseSchema.getUri()); + assertThat(result, notNullValue()); + assertThat(result.getName(), is(SCHEMA_NAME)); + } + + @Test + public void shouldListWarehouseSchemas() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(WarehouseSchemas.TEMPLATE.expand(warehouse.getId()).toString()) + .respond() + .withBody(readFromResource("/warehouse/schemas.json")) + .withStatus(200); + + final PageableList list = gd.getWarehouseService().listWarehouseSchemas(warehouse); + assertThat(list, notNullValue()); + assertThat(list, hasSize(1)); + assertThat(list.get(0).getName(), is(equalTo(SCHEMA_NAME))); + } + + @Test(expectedExceptions = WarehouseSchemaNotFoundException.class) + public void shouldFailWarehouseSchemaByNameNotFound() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(warehouseSchema.getUri()) + .respond() + .withStatus(404); + + final WarehouseSchema result = gd.getWarehouseService().getWarehouseSchemaByName(warehouse, SCHEMA_NAME); + assertThat(result, notNullValue()); + assertThat(result.getName(), is(SCHEMA_NAME)); + } } diff --git a/src/test/resources/warehouse/schema.json b/src/test/resources/warehouse/schema.json new file mode 100644 index 000000000..57489d15c --- /dev/null +++ b/src/test/resources/warehouse/schema.json @@ -0,0 +1,11 @@ +{ + "schema" : { + "name" : "default", + "description" : "Default schema for new ADS instance", + "links" : { + "self" : "/gdc/datawarehouse/instances/instanceId/schemas/default", + "parent" : "/gdc/datawarehouse/instances/warehouseId/schemas", + "instance" : "/gdc/datawarehouse/instances/instanceId" + } + } +} \ No newline at end of file diff --git a/src/test/resources/warehouse/schemas.json b/src/test/resources/warehouse/schemas.json new file mode 100644 index 000000000..0970bad9e --- /dev/null +++ b/src/test/resources/warehouse/schemas.json @@ -0,0 +1,20 @@ +{ + "schemas" : { + "items" : [ { + "schema" : { + "name" : "default", + "description" : "Default schema for new ADS instance", + "links" : { + "self" : "/gdc/datawarehouse/instances/instanceId/schemas/default", + "parent" : "/gdc/datawarehouse/instances/instanceId/schemas", + "instance" : "/gdc/datawarehouse/instances/instanceId" + } + } + } ], + "paging" : { }, + "links" : { + "self" : "/gdc/datawarehouse/instances/instanceId/schemas", + "parent" : "/gdc/datawarehouse/instances/instanceId" + } + } +} \ No newline at end of file From 4eb3cd03790402621c1c8ca1a1f2de032d359fda Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Tue, 20 Sep 2016 17:04:52 +0200 Subject: [PATCH 0451/1191] extract authentication strategy from GoodData class * introduce GoodDataEndpoint, class encapsulating GoodData host, port and protocol * introduce Authentication interface, it allows developer to implement new authentication strategy * provide two implementation of new Authentication interface, sst and login + passport --- .../java/com/gooddata/Authentication.java | 24 +++++ src/main/java/com/gooddata/GoodData.java | 71 +++++++++------ .../java/com/gooddata/GoodDataEndpoint.java | 88 +++++++++++++++++++ .../LoginPasswordAuthentication.java | 50 +++++++++++ .../authentication/SstAuthentication.java | 45 ++++++++++ .../java/com/gooddata/AbstractGoodDataAT.java | 35 ++++---- .../java/com/gooddata/AbstractGoodDataIT.java | 16 ++-- .../com/gooddata/GoodDataEndpointTest.java | 32 +++++++ .../LoginPasswordAuthenticationTest.java | 46 ++++++++++ .../authentication/SstAuthenticationTest.java | 45 ++++++++++ 10 files changed, 397 insertions(+), 55 deletions(-) create mode 100644 src/main/java/com/gooddata/Authentication.java create mode 100644 src/main/java/com/gooddata/GoodDataEndpoint.java create mode 100644 src/main/java/com/gooddata/authentication/LoginPasswordAuthentication.java create mode 100644 src/main/java/com/gooddata/authentication/SstAuthentication.java create mode 100644 src/test/java/com/gooddata/GoodDataEndpointTest.java create mode 100644 src/test/java/com/gooddata/authentication/LoginPasswordAuthenticationTest.java create mode 100644 src/test/java/com/gooddata/authentication/SstAuthenticationTest.java diff --git a/src/main/java/com/gooddata/Authentication.java b/src/main/java/com/gooddata/Authentication.java new file mode 100644 index 000000000..7ca0e0fcd --- /dev/null +++ b/src/main/java/com/gooddata/Authentication.java @@ -0,0 +1,24 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +/** + * User authentication strategy. See https://developer.gooddata.com/api#/reference/authentication/log-in + */ +public interface Authentication { + + /** + * Authenticate user + * @param endpoint GoodData Platform's endpoint + * @param httpClientBuilder http client builder + * @return Http client with provided authentication means + */ + HttpClient createHttpClient(final GoodDataEndpoint endpoint, final HttpClientBuilder httpClientBuilder); + +} diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 756f466a6..c1d7f702f 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -12,18 +12,15 @@ import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; import com.gooddata.util.ResponseErrorHandler; +import com.gooddata.authentication.LoginPasswordAuthentication; import com.gooddata.warehouse.WarehouseService; import com.gooddata.dataset.DatasetService; import com.gooddata.gdc.DataStoreService; import com.gooddata.gdc.GdcService; -import com.gooddata.http.client.GoodDataHttpClient; -import com.gooddata.http.client.LoginSSTRetrievalStrategy; -import com.gooddata.http.client.SSTRetrievalStrategy; import com.gooddata.md.MetadataService; import com.gooddata.model.ModelService; import com.gooddata.project.ProjectService; import com.gooddata.report.ReportService; -import org.apache.http.HttpHost; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.SocketConfig; @@ -37,7 +34,7 @@ import java.util.Arrays; -import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; import static java.util.Collections.singletonMap; import static org.apache.http.util.VersionInfo.loadVersionInfo; @@ -58,9 +55,9 @@ public class GoodData { public static final String GDC_REQUEST_ID_HEADER = "X-GDC-REQUEST"; - protected static final String PROTOCOL = "https"; - protected static final int PORT = 443; - protected static final String HOSTNAME = "secure.gooddata.com"; + protected static final String PROTOCOL = GoodDataEndpoint.PROTOCOL; + protected static final int PORT = GoodDataEndpoint.PORT; + protected static final String HOSTNAME = GoodDataEndpoint.HOSTNAME; private static final String UNKNOWN_VERSION = "UNKNOWN"; private static final int RESTAPI_VERSION = 1; @@ -167,21 +164,43 @@ public GoodData(String hostname, String login, String password, int port, GoodDa * @param settings additional settings */ protected GoodData(String hostname, String login, String password, int port, String protocol, GoodDataSettings settings) { - notEmpty(hostname, "hostname"); - notEmpty(login, "login"); - notEmpty(password, "password"); - notEmpty(protocol, "protocol"); - httpClient = createHttpClient(login, password, hostname, port, protocol, - createHttpClientBuilder(settings)); + this( + new GoodDataEndpoint(hostname, port, protocol), + new LoginPasswordAuthentication(login, password), + settings + ); + } - restTemplate = createRestTemplate(hostname, httpClient, port, protocol); + /** + * Create instance configured to communicate with GoodData Platform running on given endpoint and using + * given http client factory. + * + * @param endpoint GoodData Platform's endpoint + * @param authentication authentication + */ + protected GoodData(GoodDataEndpoint endpoint, Authentication authentication) { + this(endpoint, authentication, new GoodDataSettings()); + } + + /** + * Create instance configured to communicate with GoodData Platform running on given endpoint and using + * given http client factory. + * + * @param endpoint GoodData Platform's endpoint + * @param authentication authentication + * @param settings additional settings + */ + protected GoodData(GoodDataEndpoint endpoint, Authentication authentication, GoodDataSettings settings) { + httpClient = authentication.createHttpClient(endpoint, createHttpClientBuilder(settings)); + + restTemplate = createRestTemplate(endpoint, httpClient); accountService = new AccountService(getRestTemplate()); projectService = new ProjectService(getRestTemplate(), accountService); metadataService = new MetadataService(getRestTemplate()); modelService = new ModelService(getRestTemplate()); gdcService = new GdcService(getRestTemplate()); - dataStoreService = new DataStoreService(getHttpClient(), getRestTemplate(), gdcService, new HttpHost(hostname, port, protocol).toURI()); + dataStoreService = new DataStoreService(getHttpClient(), getRestTemplate(), gdcService, endpoint.toUri()); datasetService = new DatasetService(getRestTemplate(), dataStoreService); reportService = new ReportService(getRestTemplate()); processService = new ProcessService(getRestTemplate(), accountService, dataStoreService); @@ -192,10 +211,16 @@ protected GoodData(String hostname, String login, String password, int port, Str featureFlagService = new FeatureFlagService(restTemplate); } - private RestTemplate createRestTemplate(String hostname, HttpClient httpClient, int port, String protocol) { + static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient httpClient) { + notNull(endpoint, "endpoint"); + notNull(httpClient, "httpClient"); final UriPrefixingClientHttpRequestFactory factory = new UriPrefixingClientHttpRequestFactory( - new HttpComponentsClientHttpRequestFactory(httpClient), hostname, port, protocol); + new HttpComponentsClientHttpRequestFactory(httpClient), + endpoint.getHostname(), + endpoint.getPort(), + endpoint.getProtocol() + ); final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); @@ -229,18 +254,10 @@ private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings setting * Set accept header (application/json by default) and append rest api versioning information which is mandatory * for some resources. */ - private String getAcceptHeaderValue(){ + private static String getAcceptHeaderValue(){ return MediaType.APPLICATION_JSON_VALUE + ";version=" + RESTAPI_VERSION; } - protected HttpClient createHttpClient(final String login, final String password, final String hostname, - final int port, final String protocol, final HttpClientBuilder builder) { - final HttpHost host = new HttpHost(hostname, port, protocol); - final HttpClient httpClient = builder.build(); - final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(login, password); - return new GoodDataHttpClient(httpClient, host, strategy); - } - private String getUserAgent() { final Package pkg = Package.getPackage("com.gooddata"); final String clientVersion = pkg != null && pkg.getImplementationVersion() != null diff --git a/src/main/java/com/gooddata/GoodDataEndpoint.java b/src/main/java/com/gooddata/GoodDataEndpoint.java new file mode 100644 index 000000000..b4b4df66c --- /dev/null +++ b/src/main/java/com/gooddata/GoodDataEndpoint.java @@ -0,0 +1,88 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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.HttpHost; + +import static com.gooddata.util.Validate.notEmpty; + +/** + * GoodData Platform endpoint represented by host, port and protocol + */ +public class GoodDataEndpoint { + + public static final String PROTOCOL = "https"; + public static final int PORT = 443; + public static final String HOSTNAME = "secure.gooddata.com"; + + private final String hostname; + private final int port; + private final String protocol; + + /** + * Create GoodData endpoint for given hostname, port and protocol + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param port GoodData Platform's API port (e.g. 443) + * @param protocol GoodData Platform's API protocol (e.g. https) + */ + public GoodDataEndpoint(final String hostname, final int port, final String protocol) { + this.hostname = notEmpty(hostname, "hostname"); + this.port = port; + this.protocol = notEmpty(protocol, "protocol"); + } + + /** + * Create GoodData endpoint for given hostname, port using HTTPS protocol + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + * @param port GoodData Platform's API port (e.g. 443) + */ + public GoodDataEndpoint(String hostname, int port) { + this(hostname, port, PROTOCOL); + } + + /** + * Create GoodData endpoint for given hostname using 443 port and HTTPS protocol + * @param hostname GoodData Platform's host name (e.g. secure.gooddata.com) + */ + public GoodDataEndpoint(String hostname) { + this(hostname, PORT, PROTOCOL); + } + + /** + * Create GoodData endpoint for given hostname using 443 port and HTTPS protocol and secure.gooddata.com hostname + */ + public GoodDataEndpoint() { + this(HOSTNAME, PORT, PROTOCOL); + } + + /** + * @return the host URI, as a string. + */ + public String toUri() { + return new HttpHost(hostname, port, protocol).toURI(); + } + + /** + * @return GoodData Platform's host name (e.g. secure.gooddata.com) + */ + public String getHostname() { + return hostname; + } + + /** + * @return GoodData Platform's API port (e.g. 443) + */ + public int getPort() { + return port; + } + + /** + * @return GoodData Platform's API protocol (e.g. https) + */ + public String getProtocol() { + return protocol; + } +} diff --git a/src/main/java/com/gooddata/authentication/LoginPasswordAuthentication.java b/src/main/java/com/gooddata/authentication/LoginPasswordAuthentication.java new file mode 100644 index 000000000..176f176ea --- /dev/null +++ b/src/main/java/com/gooddata/authentication/LoginPasswordAuthentication.java @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.authentication; + +import com.gooddata.GoodDataEndpoint; +import com.gooddata.Authentication; +import com.gooddata.http.client.GoodDataHttpClient; +import com.gooddata.http.client.LoginSSTRetrievalStrategy; +import com.gooddata.http.client.SSTRetrievalStrategy; +import org.apache.http.HttpHost; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * Login and password authentication + */ +public class LoginPasswordAuthentication implements Authentication { + + private final String login; + private final String password; + + /** + * Create login password authentication + * + * @param login login + * @param password password + */ + public LoginPasswordAuthentication(final String login, final String password) { + this.login = notEmpty(login, "login"); + this.password = notEmpty(password, "password"); + } + + @Override + public HttpClient createHttpClient(final GoodDataEndpoint endpoint, final HttpClientBuilder builder) { + notNull(endpoint, "endpoint"); + notNull(builder, "builder"); + + final HttpClient httpClient = builder.build(); + final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(login, password); + final HttpHost httpHost = new HttpHost(endpoint.getHostname(), endpoint.getPort(), endpoint.getProtocol()); + return new GoodDataHttpClient(httpClient, httpHost, strategy); + } + +} diff --git a/src/main/java/com/gooddata/authentication/SstAuthentication.java b/src/main/java/com/gooddata/authentication/SstAuthentication.java new file mode 100644 index 000000000..d608c469f --- /dev/null +++ b/src/main/java/com/gooddata/authentication/SstAuthentication.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.authentication; + +import com.gooddata.GoodDataEndpoint; +import com.gooddata.Authentication; +import com.gooddata.http.client.GoodDataHttpClient; +import com.gooddata.http.client.SSTRetrievalStrategy; +import com.gooddata.http.client.SimpleSSTRetrievalStrategy; +import org.apache.http.HttpHost; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +/** + * SST authentication, see https://developer.gooddata.com/article/gooddata-token-types#Authentication + */ +public class SstAuthentication implements Authentication { + + private final String sst; + + /** + * Create SST authentication + * @param sst sst + */ + public SstAuthentication(final String sst) { + this.sst = notEmpty(sst, "sst"); + } + + @Override + public HttpClient createHttpClient(final GoodDataEndpoint endpoint, final HttpClientBuilder builder) { + notNull(endpoint, "endpoint"); + notNull(builder, "builder"); + + final HttpClient httpClient = builder.build(); + final SSTRetrievalStrategy strategy = new SimpleSSTRetrievalStrategy(sst); + final HttpHost httpHost = new HttpHost(endpoint.getHostname(), endpoint.getPort(), endpoint.getProtocol()); + return new GoodDataHttpClient(httpClient, httpHost, strategy); + } +} diff --git a/src/test/java/com/gooddata/AbstractGoodDataAT.java b/src/test/java/com/gooddata/AbstractGoodDataAT.java index 852626df4..f3ca1daa3 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataAT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataAT.java @@ -5,16 +5,13 @@ */ package com.gooddata; -import com.gooddata.http.client.GoodDataHttpClient; -import com.gooddata.http.client.LoginSSTRetrievalStrategy; -import com.gooddata.http.client.SSTRetrievalStrategy; import com.gooddata.md.Attribute; import com.gooddata.md.Metric; import com.gooddata.md.ScheduledMail; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; -import org.apache.http.HttpHost; +import com.gooddata.authentication.LoginPasswordAuthentication; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; @@ -30,20 +27,22 @@ public abstract class AbstractGoodDataAT { "sdktest " + new LocalDate() + " " + System.getenv("BUILD_NUMBER"); protected static final GoodData gd = - new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")) { - /** - * had to be overriden to access connectionManager, to test how many connections were not closed - */ - @Override - protected HttpClient createHttpClient(String login, String password, String hostname, int port, String protocol, HttpClientBuilder builder) { - PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager(); - final HttpHost host = new HttpHost(hostname, port, protocol); - final HttpClient httpClient = builder.setConnectionManager(httpClientConnectionManager).build(); - final SSTRetrievalStrategy strategy = new LoginSSTRetrievalStrategy(httpClient, host, login, password); - connManager = httpClientConnectionManager; - return new GoodDataHttpClient(httpClient, strategy); - } - }; + new GoodData( + new GoodDataEndpoint(getProperty("host")), + new LoginPasswordAuthentication(getProperty("login"), getProperty("pass")) { + /** + * had to be overriden to access connectionManager, to test how many connections were not closed + */ + @Override + public HttpClient createHttpClient(final GoodDataEndpoint endpoint, final HttpClientBuilder builder) { + PoolingHttpClientConnectionManager httpClientConnectionManager = new PoolingHttpClientConnectionManager(); + final HttpClientBuilder builderWithManager = builder.setConnectionManager(httpClientConnectionManager); + connManager = httpClientConnectionManager; + + return super.createHttpClient(endpoint, builderWithManager); + } + }); + protected static PoolingHttpClientConnectionManager connManager; diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index ab12a237d..86e04563d 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -5,8 +5,7 @@ */ package com.gooddata; -import org.apache.http.client.HttpClient; -import org.apache.http.impl.client.HttpClientBuilder; +import com.gooddata.authentication.LoginPasswordAuthentication; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -23,14 +22,11 @@ public abstract class AbstractGoodDataIT { @BeforeMethod public void commonSetUp() { initJadler().that().respondsWithDefaultContentType("application/json"); - gd = new GoodData("localhost", "sdk@gooddata.com", "sdk", port(), "http", new GoodDataSettings()) { - @Override - protected HttpClient createHttpClient(final String login, final String password, final String hostname, - final int port, final String protocol, - final HttpClientBuilder builder) { - return builder.build(); - } - }; + gd = new GoodData( + new GoodDataEndpoint("localhost", port(), "http"), + new LoginPasswordAuthentication("sdk@gooddata.com", "sdk"), + new GoodDataSettings() + ); } @AfterMethod diff --git a/src/test/java/com/gooddata/GoodDataEndpointTest.java b/src/test/java/com/gooddata/GoodDataEndpointTest.java new file mode 100644 index 000000000..17957857c --- /dev/null +++ b/src/test/java/com/gooddata/GoodDataEndpointTest.java @@ -0,0 +1,32 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class GoodDataEndpointTest { + + private static final String HOST = "HOST"; + private static final int PORT = 1; + private static final String PROTOCOL = "http"; + + private GoodDataEndpoint endpoint; + + @BeforeMethod + public void setUp() throws Exception { + endpoint = new GoodDataEndpoint(HOST, PORT, PROTOCOL); + } + + @Test + public void testToUri() throws Exception { + assertThat(endpoint.toUri(), is("http://HOST:1")); + } + +} diff --git a/src/test/java/com/gooddata/authentication/LoginPasswordAuthenticationTest.java b/src/test/java/com/gooddata/authentication/LoginPasswordAuthenticationTest.java new file mode 100644 index 000000000..95a5041f1 --- /dev/null +++ b/src/test/java/com/gooddata/authentication/LoginPasswordAuthenticationTest.java @@ -0,0 +1,46 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.authentication; + +import com.gooddata.GoodDataEndpoint; +import com.gooddata.http.client.GoodDataHttpClient; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +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.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class LoginPasswordAuthenticationTest { + + private static final String PASSWORD = "PASSWORD"; + private static final String LOGIN = "LOGIN"; + + private LoginPasswordAuthentication loginPasswordAuthentication; + + @BeforeMethod + public void setUp() throws Exception { + loginPasswordAuthentication = new LoginPasswordAuthentication(LOGIN, PASSWORD); + } + + @Test + public void shouldCreateHttpClient() { + final HttpClientBuilder clientBuilder = mock(HttpClientBuilder.class); + when(clientBuilder.build()).thenReturn(mock(CloseableHttpClient.class)); + + final HttpClient httpClient = loginPasswordAuthentication.createHttpClient(new GoodDataEndpoint("host", 1, "http"), clientBuilder); + + assertThat(httpClient, notNullValue()); + assertThat(httpClient, is(instanceOf(GoodDataHttpClient.class))); + } + +} diff --git a/src/test/java/com/gooddata/authentication/SstAuthenticationTest.java b/src/test/java/com/gooddata/authentication/SstAuthenticationTest.java new file mode 100644 index 000000000..baa76e5ce --- /dev/null +++ b/src/test/java/com/gooddata/authentication/SstAuthenticationTest.java @@ -0,0 +1,45 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.authentication; + +import com.gooddata.GoodDataEndpoint; +import com.gooddata.http.client.GoodDataHttpClient; +import org.apache.http.client.HttpClient; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +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.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class SstAuthenticationTest { + + private static final String SST = "sst"; + + private SstAuthentication sstAuthentication; + + @BeforeMethod + public void setUp() throws Exception { + sstAuthentication = new SstAuthentication(SST); + } + + @Test + public void shouldCreateHttpClient() { + final HttpClientBuilder clientBuilder = mock(HttpClientBuilder.class); + when(clientBuilder.build()).thenReturn(mock(CloseableHttpClient.class)); + + final HttpClient httpClient = sstAuthentication.createHttpClient(new GoodDataEndpoint("host", 1, "http"), clientBuilder); + + assertThat(httpClient, notNullValue()); + assertThat(httpClient, is(instanceOf(GoodDataHttpClient.class))); + } + +} From ce6e65e1cb3f531925bbe61b2ae45a2fb3fb2f3b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 28 Nov 2016 14:19:35 +0100 Subject: [PATCH 0452/1191] [maven-release-plugin] prepare release gooddata-java-2.2.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 26555c7e1..e53b7af7e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.1.3-SNAPSHOT + 2.2.0 ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From dd39ed7968d93ed9c4ddacee6d9de2e72665a380 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 28 Nov 2016 14:19:36 +0100 Subject: [PATCH 0453/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e53b7af7e..e2d488e68 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.2.0 + 2.2.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/martiner/gooddata-java From 2eb524355074dba5fcbeb9cf5585d9ab9dcf1cfb Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 28 Nov 2016 14:30:55 +0100 Subject: [PATCH 0454/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c2540bd71..2e23bb377 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.1.2 + 2.2.0 ``` See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, From e15b89312e985f0bd0900c781e724c4468f4a87e Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 9 Dec 2016 11:35:15 +0100 Subject: [PATCH 0455/1191] update gooddata-http-client to allow apostrophe as password character --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e2d488e68..ab785c041 100644 --- a/pom.xml +++ b/pom.xml @@ -279,7 +279,7 @@ com.gooddata gooddata-http-client - 0.9.3 + 0.9.4 commons-lang From 465d95a8bade947d31c963c97850a04ab8222f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 1 Dec 2016 12:16:54 +0100 Subject: [PATCH 0456/1191] throw exception in case that links are null --- .../connector/IntegrationProcessStatus.java | 4 ++- .../dataload/processes/DataloadProcess.java | 7 ++-- .../processes/ProcessExecutionDetail.java | 7 ++-- .../processes/ProcessExecutionTask.java | 6 ++-- .../gooddata/dataload/processes/Schedule.java | 3 +- .../featureflag/ProjectFeatureFlag.java | 5 ++- src/main/java/com/gooddata/md/Dataset.java | 6 ++-- .../gooddata/md/report/ReportDefinition.java | 4 ++- .../java/com/gooddata/project/Project.java | 33 ++++++++++--------- src/main/java/com/gooddata/util/Validate.java | 15 +++++++++ .../com/gooddata/warehouse/Warehouse.java | 3 +- .../gooddata/warehouse/WarehouseSchema.java | 6 ++-- .../com/gooddata/warehouse/WarehouseUser.java | 3 +- 13 files changed, 66 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index 0daf17cb4..94a058d2d 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -5,6 +5,8 @@ */ package com.gooddata.connector; +import static com.gooddata.util.Validate.notNullState; + import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; @@ -84,7 +86,7 @@ public boolean isFailed() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK): null; + return notNullState(links, "links").get(SELF_LINK); } @JsonIgnore diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index ec974cdac..98a954e04 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -7,6 +7,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -104,7 +105,7 @@ public Set getExecutables() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK) : null; + return notNullState(links, "links").get(SELF_LINK); } @JsonIgnore @@ -124,7 +125,7 @@ public String getExecutionsLink() { @JsonIgnore public String getExecutionsUri() { - return links != null ? links.get(EXECUTIONS_LINK) : null; + return notNullState(links, "links").get(EXECUTIONS_LINK); } /** @@ -139,7 +140,7 @@ public String getSourceLink() { @JsonIgnore public String getSourceUri() { - return getUri() != null ? getUri() + "/source" : null; + return getUri() + "/source"; } public void validateExecutable(final String executable) { diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index c3df37e56..f2f9550e6 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -18,6 +18,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; /** * Dataload process execution detail. Deserialization only. @@ -98,12 +99,12 @@ public String getLogLink() { @JsonIgnore public String getLogUri() { - return links != null ? links.get(LOG_LINK) : null; + return notNullState(links, "links").get(LOG_LINK); } @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK) : null; + return notNullState(links, "links").get(SELF_LINK); } /** @@ -118,7 +119,7 @@ public String getExecutionLink() { @JsonIgnore public String getExecutionUri() { - return links != null ? links.get(EXECUTION_LINK) : null; + return notNullState(links, "links").get(EXECUTION_LINK); } @JsonIgnore diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java index 12c895539..74408402a 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionTask.java @@ -5,6 +5,8 @@ */ package com.gooddata.dataload.processes; +import static com.gooddata.util.Validate.notNullState; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; @@ -37,7 +39,7 @@ String getPollLink() { } String getPollUri() { - return links != null ? links.get(POLL_LINK) : null; + return notNullState(links, "links").get(POLL_LINK); } @Deprecated @@ -46,6 +48,6 @@ String getDetailLink() { } String getDetailUri() { - return links != null ? links.get(DETAIL_LINK) : null; + return notNullState(links, "links").get(DETAIL_LINK); } } diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index f14a39586..2a62d2899 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -25,6 +25,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; /** * Schedule. @@ -244,7 +245,7 @@ public int getConsecutiveFailedExecutionCount() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK) : null; + return notNullState(links, "links").get(SELF_LINK); } @JsonIgnore diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java index e611d274d..f40b7d77f 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -9,7 +9,7 @@ import org.springframework.web.util.UriTemplate; import static com.gooddata.util.Validate.notEmpty; -import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; /** * Project feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform @@ -74,8 +74,7 @@ public void setEnabled(boolean enabled) { @JsonIgnore public String getUri() { - notNull(links, "links (if you want to get feature flag uri)"); - return links.getSelf(); + return notNullState(links, "links").getSelf(); } @Override diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 1fdaa2ba3..2be8f1f35 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -5,6 +5,8 @@ */ package com.gooddata.md; +import static com.gooddata.util.Validate.notNullState; + import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.BooleanStringSerializer; @@ -93,7 +95,7 @@ public String getDataUploadsLink() { @JsonIgnore public String getDataUploadsUri() { - return links != null ? links.get(DATA_UPLOADS_LINK) : null; + return notNullState(links, "links").get(DATA_UPLOADS_LINK); } /** @@ -108,7 +110,7 @@ public String getUploadConfigurationLink() { @JsonIgnore public String getUploadConfigurationUri() { - return links != null ? links.get(UPLOAD_CONFIGURATION_LINK) : null; + return notNullState(links, "links").get(UPLOAD_CONFIGURATION_LINK); } @JsonInclude(JsonInclude.Include.NON_NULL) diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 0d7fb34f8..4ce2bed10 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -5,6 +5,8 @@ */ package com.gooddata.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; @@ -73,7 +75,7 @@ public String getExplainLink() { @JsonIgnore public String getExplainUri() { - return links != null ? links.get(EXPLAIN_LINK) : null; + return notNullState(links, "links").get(EXPLAIN_LINK); } } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index 60c2c1d17..e6a546840 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -24,6 +24,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; import static java.util.Arrays.asList; /** @@ -138,7 +139,7 @@ public DateTime getUpdated() { @JsonIgnore public String getUri() { - return links.getSelf(); + return notNullState(links, "links").getSelf(); } /** @@ -153,7 +154,7 @@ public String getUsersLink() { @JsonIgnore public String getUsersUri() { - return links.getUsers(); + return notNullState(links, "links").getUsers(); } /** @@ -168,7 +169,7 @@ public String getRolesLink() { @JsonIgnore public String getRolesUri() { - return links.getRoles(); + return notNullState(links, "links").getRoles(); } /** @@ -183,7 +184,7 @@ public String getGroupsLink() { @JsonIgnore public String getGroupsUri() { - return links.getGroups(); + return notNullState(links, "links").getGroups(); } /** @@ -198,7 +199,7 @@ public String getInvitationsLink() { @JsonIgnore public String getInvitationsUri() { - return links.getInvitations(); + return notNullState(links, "links").getInvitations(); } /** @@ -228,7 +229,7 @@ public String getLdmThumbnailLink() { @JsonIgnore public String getLdmThumbnailUri() { - return links.getLdmThumbnail(); + return notNullState(links, "links").getLdmThumbnail(); } /** @@ -243,7 +244,7 @@ public String getMetadataLink() { @JsonIgnore public String getMetadataUri() { - return links.getMetadata(); + return notNullState(links, "links").getMetadata(); } /** @@ -258,7 +259,7 @@ public String getPublicArtifactsLink() { @JsonIgnore public String getPublicArtifactsUri() { - return links.getPublicArtifacts(); + return notNullState(links, "links").getPublicArtifacts(); } /** @@ -273,7 +274,7 @@ public String getTemplatesLink() { @JsonIgnore public String getTemplatesUri() { - return links.getTemplates(); + return notNullState(links, "links").getTemplates(); } /** @@ -288,7 +289,7 @@ public String getConnectorsLink() { @JsonIgnore public String getConnectorsUri() { - return links.getConnectors(); + return notNullState(links, "links").getConnectors(); } /** @@ -303,7 +304,7 @@ public String getDataLoadLink() { @JsonIgnore public String getDataLoadUri() { - return links.getDataLoad(); + return notNullState(links, "links").getDataLoad(); } /** @@ -318,7 +319,7 @@ public String getSchedulesLink() { @JsonIgnore public String getSchedulesUri() { - return links.getSchedules(); + return notNullState(links, "links").getSchedules(); } /** @@ -333,7 +334,7 @@ public String getExecuteLink() { @JsonIgnore public String getExecuteUri() { - return links.getExecute(); + return notNullState(links, "links").getExecute(); } /** @@ -348,7 +349,7 @@ public String getEventStoresLink() { @JsonIgnore public String getEventStoresUri() { - return links.getEventStores(); + return notNullState(links, "links").getEventStores(); } /** @@ -363,7 +364,7 @@ public String getClearCachesLink() { @JsonIgnore public String getClearCachesUri() { - return links.getClearCaches(); + return notNullState(links, "links").getClearCaches(); } /** @@ -378,7 +379,7 @@ public String getUploadsLink() { @JsonIgnore public String getUploadsUri() { - return links.getUploads(); + return notNullState(links, "links").getUploads(); } @JsonIgnore diff --git a/src/main/java/com/gooddata/util/Validate.java b/src/main/java/com/gooddata/util/Validate.java index dfa46431a..6d3935cec 100644 --- a/src/main/java/com/gooddata/util/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -90,4 +90,19 @@ public static T[] noNullElements(T[] array, String argument) { return array; } + /** + * Throws IllegalStateException if the value is null, otherwise returns the value. + * + * @param value input value + * @param argumentName the name of input argument + * @param the type of the argument + * @return the value + */ + public static T notNullState(T value, String argumentName) { + if (value == null) { + throw new IllegalStateException(argumentName + " is null"); + } + return value; + } + } diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 6ad9f83e9..e6842e117 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -6,6 +6,7 @@ package com.gooddata.warehouse; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.project.Environment; @@ -154,7 +155,7 @@ public Map getLinks() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK): null; + return notNullState(links, "links").get(SELF_LINK); } @JsonIgnore diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchema.java b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java index 44e7d7826..c8057f630 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseSchema.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java @@ -5,6 +5,8 @@ */ package com.gooddata.warehouse; +import static com.gooddata.util.Validate.notNullState; + import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; @@ -59,11 +61,11 @@ public Map getLinks() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK): null; + return notNullState(links, "links").get(SELF_LINK); } @JsonIgnore public String getInstanceUri() { - return links != null ? links.get(INSTANCE_LINK): null; + return notNullState(links, "links").get(INSTANCE_LINK); } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index 9369b3ce9..ff2208ea5 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -17,6 +17,7 @@ import java.util.Map; import static com.gooddata.util.Validate.notNull; +import static com.gooddata.util.Validate.notNullState; /** * Warehouse user @@ -81,7 +82,7 @@ public String getId() { @JsonIgnore public String getUri() { - return links != null ? links.get(SELF_LINK): null; + return notNullState(links, "links").get(SELF_LINK); } } From aba01962f3c3bbff2de9f6ec4e31d3f23591a637 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Wed, 2 Nov 2016 11:02:13 +0100 Subject: [PATCH 0457/1191] introduce output stage --- src/main/java/com/gooddata/GoodData.java | 12 ++ .../com/gooddata/dataload/OutputStage.java | 140 ++++++++++++++++++ .../gooddata/dataload/OutputStageService.java | 76 ++++++++++ src/main/java/com/gooddata/util/Validate.java | 13 +- .../dataload/OutputStageServiceAT.java | 79 ++++++++++ .../dataload/OutputStageServiceIT.java | 107 +++++++++++++ .../dataload/OutputStageServiceTest.java | 86 +++++++++++ .../gooddata/dataload/OutputStageTest.java | 79 ++++++++++ src/test/resources/dataload/outputStage.json | 8 + .../dataload/outputStageAllFields.json | 12 ++ .../dataload/outputStageNoProcess.json | 11 ++ 11 files changed, 622 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gooddata/dataload/OutputStage.java create mode 100644 src/main/java/com/gooddata/dataload/OutputStageService.java create mode 100644 src/test/java/com/gooddata/dataload/OutputStageServiceAT.java create mode 100644 src/test/java/com/gooddata/dataload/OutputStageServiceIT.java create mode 100644 src/test/java/com/gooddata/dataload/OutputStageServiceTest.java create mode 100644 src/test/java/com/gooddata/dataload/OutputStageTest.java create mode 100644 src/test/resources/dataload/outputStage.json create mode 100644 src/test/resources/dataload/outputStageAllFields.json create mode 100644 src/test/resources/dataload/outputStageNoProcess.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index c1d7f702f..a049771fa 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -7,6 +7,7 @@ import com.gooddata.account.AccountService; import com.gooddata.connector.ConnectorService; +import com.gooddata.dataload.OutputStageService; import com.gooddata.dataload.processes.ProcessService; import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.md.maintenance.ExportImportService; @@ -78,6 +79,7 @@ public class GoodData { private final NotificationService notificationService; private final ExportImportService exportImportService; private final FeatureFlagService featureFlagService; + private final OutputStageService outputStageService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -209,6 +211,7 @@ protected GoodData(GoodDataEndpoint endpoint, Authentication authentication, Goo notificationService = new NotificationService(getRestTemplate()); exportImportService = new ExportImportService(getRestTemplate()); featureFlagService = new FeatureFlagService(restTemplate); + outputStageService = new OutputStageService(restTemplate); } static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient httpClient) { @@ -422,4 +425,13 @@ public ExportImportService getExportImportService() { public FeatureFlagService getFeatureFlagService() { return featureFlagService; } + + /** + * Get initialized service for output stage management. + * + * @return initialized service for output stage management + */ + public OutputStageService getOutputStageService() { + return outputStageService; + } } diff --git a/src/main/java/com/gooddata/dataload/OutputStage.java b/src/main/java/com/gooddata/dataload/OutputStage.java new file mode 100644 index 000000000..0484236cd --- /dev/null +++ b/src/main/java/com/gooddata/dataload/OutputStage.java @@ -0,0 +1,140 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import static com.gooddata.util.Validate.notNullState; + +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 org.springframework.web.util.UriTemplate; + +import java.util.Map; + +/** + * Output stage. + * For each project there is always one output stage, which always exists. + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("outputStage") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class OutputStage { + + public static final String URI = "/gdc/dataload/projects/{id}/outputStage"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + + private static final String SELF_LINK = "self"; + private static final String OUTPUT_STAGE_DIFF = "outputStageDiff"; + private static final String DATALOAD_PROCESS = "dataloadProcess"; + + private String schema; + private String clientId; + private String outputStagePrefix; + private final Map links; + + @JsonCreator + private OutputStage(@JsonProperty("schema") final String schema, + @JsonProperty("clientId") final String clientId, + @JsonProperty("outputStagePrefix") final String outputStagePrefix, + @JsonProperty("links") final Map links) { + this.schema = schema; + this.clientId = clientId; + this.outputStagePrefix = outputStagePrefix; + this.links = links; + } + + public Map getLinks() { + return links; + } + + /** + * get datawarehouse schema uri {@link com.gooddata.warehouse.WarehouseSchema} + * + * @return warehouse schema, can be null. + */ + @JsonProperty("schema") + public String getSchemaUri() { + return schema; + } + + @JsonProperty("schema") + public void setSchemaUri(final String schemaUri) { + this.schema = schemaUri; + } + + /** + * check if there is associated schema {@link com.gooddata.warehouse.WarehouseSchema} with this output stage + * + * @return true if there is associated schema, else false + */ + public boolean hasSchemaUri() { + return schema != null; + } + + /** + * get client ID + * + * @return client ID, can be null. + */ + public String getClientId() { + return clientId; + } + + public void setClientId(final String clientId) { + this.clientId = clientId; + } + + /** + * check if there is associated client id with this output stage + * + * @return true if there is associated client id, else false + */ + public boolean hasClientId() { + return clientId != null; + } + + /** + * get output stage prefix + * + * @return output stage prefix, can be null. + */ + public String getOutputStagePrefix() { + return outputStagePrefix; + } + + public void setOutputStagePrefix(final String outputStagePrefix) { + this.outputStagePrefix = outputStagePrefix; + } + + /** + * check if there is associated output stage prefix with this output stage + * + * @return true if there is associated output stage prefix, else false + */ + public boolean hasOutputStagePrefix() { + return outputStagePrefix != null; + } + + @JsonIgnore + public String getUri() { + return notNullState(links, "links").get(SELF_LINK); + } + + @JsonIgnore + public String getOutputStageDiffUri() { + return notNullState(links, "links").get(OUTPUT_STAGE_DIFF); + } + + @JsonIgnore + public String getDataloadProcessUri() { + return notNullState(links, "links").get(DATALOAD_PROCESS); + } +} diff --git a/src/main/java/com/gooddata/dataload/OutputStageService.java b/src/main/java/com/gooddata/dataload/OutputStageService.java new file mode 100644 index 000000000..caa5782b3 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/OutputStageService.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import static com.gooddata.util.Validate.isTrue; +import static com.gooddata.util.Validate.notEmpty; +import static com.gooddata.util.Validate.notNull; + +import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.project.Project; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +/** + * Service to manage output stage. + */ +public class OutputStageService extends AbstractService { + + /** + * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending + * this abstract one. + * @param restTemplate RESTful HTTP Spring template + */ + public OutputStageService(final RestTemplate restTemplate) { + super(restTemplate); + } + + /** + * Get output stage by given URI. + * @param uri output stage uri + * @return output stage object + * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist + */ + public OutputStage getOutputStageByUri(final String uri) { + notEmpty(uri, "uri"); + isTrue(OutputStage.TEMPLATE.matches(uri), "uri does not match output stage pattern: " + OutputStage.TEMPLATE.toString()); + try { + return restTemplate.getForObject(uri, OutputStage.class); + } catch (RestClientException e) { + throw new GoodDataException("Unable to get output stage " + uri, e); + } + } + + /** + * Get output stage by given project. + * @param project project to which the process belongs + * @return output stage + * @throws com.gooddata.dataload.processes.ProcessNotFoundException when the process doesn't exist + */ + public OutputStage getOutputStage(final Project project) { + notNull(project, "project"); + return getOutputStageByUri(OutputStage.TEMPLATE.expand(project.getId()).toString()); + } + + /** + * Update output stage. + * + * @param outputStage output stage + * @return updated output stage + */ + public OutputStage updateOutputStage(final OutputStage outputStage) { + notNull(outputStage, "outputStage"); + try { + restTemplate.put(outputStage.getUri(), outputStage); + } catch (GoodDataRestException | RestClientException e) { + throw new GoodDataException("Unable to update output stage, uri: " + outputStage.getUri()); + } + + return getOutputStageByUri(outputStage.getUri()); + } +} diff --git a/src/main/java/com/gooddata/util/Validate.java b/src/main/java/com/gooddata/util/Validate.java index 6d3935cec..ccc6e7821 100644 --- a/src/main/java/com/gooddata/util/Validate.java +++ b/src/main/java/com/gooddata/util/Validate.java @@ -82,7 +82,7 @@ public static T noNullElements(T collection, String argum public static T[] noNullElements(T[] array, String argument) { notNull(array, argument); - for (int i = 0; i T notNullState(T value, String argumentName) { return value; } + /** + * throws new {@link IllegalArgumentException} if expression is false + * + * @param expression boolean expression + * @param message of exception + */ + public static void isTrue(boolean expression, String message) { + if (!expression) { + throw new IllegalArgumentException(message); + } + } } diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceAT.java b/src/test/java/com/gooddata/dataload/OutputStageServiceAT.java new file mode 100644 index 000000000..c2ad5df48 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceAT.java @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import com.gooddata.AbstractGoodDataAT; +import com.gooddata.project.Environment; +import com.gooddata.warehouse.Warehouse; +import com.gooddata.warehouse.WarehouseSchema; +import org.testng.annotations.AfterClass; +import org.testng.annotations.Test; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import java.util.concurrent.TimeUnit; + +public class OutputStageServiceAT extends AbstractGoodDataAT { + + private static final String CLIENT_ID = "clientId"; + private static final String PREFIX = "prefix"; + + private final Warehouse warehouse; + private final WarehouseSchema warehouseSchema; + + public OutputStageServiceAT() { + final String warehouseToken = getProperty("warehouseToken"); + final Warehouse wh = new Warehouse(title, warehouseToken); + wh.setEnvironment(Environment.TESTING); + warehouse = gd.getWarehouseService().createWarehouse(wh).get(60, TimeUnit.MINUTES); + warehouseSchema = gd.getWarehouseService().getDefaultWarehouseSchema(warehouse); + } + + @Test(groups = "output_stage", dependsOnGroups = {"warehouse", "project"}) + public void shouldReturnNullObjectWhenNoOutputStage() { + final OutputStage outputStage = gd.getOutputStageService().getOutputStage(project); + + assertThat(outputStage.getSchemaUri(), is(nullValue())); + } + + @Test(groups = "output_stage", dependsOnMethods = "shouldReturnNullObjectWhenNoOutputStage") + public void shouldUpdateOutputStage() { + final OutputStage outputStage = gd.getOutputStageService().getOutputStage(project); + outputStage.setSchemaUri(warehouseSchema.getUri()); + outputStage.setClientId(CLIENT_ID); + outputStage.setOutputStagePrefix(PREFIX); + + final OutputStage updateOutputStage = gd.getOutputStageService().updateOutputStage(outputStage); + + assertThat(updateOutputStage.getSchemaUri(), is(equalTo(warehouseSchema.getUri()))); + assertThat(updateOutputStage.getClientId(), is(equalTo(CLIENT_ID))); + assertThat(updateOutputStage.getOutputStagePrefix(), is(equalTo(PREFIX))); + } + + @Test(groups = "output_stage", dependsOnMethods = "shouldUpdateOutputStage") + public void shouldUpdateOutputStageToNullValues() { + final OutputStage outputStage = gd.getOutputStageService().getOutputStage(project); + outputStage.setSchemaUri(null); + outputStage.setClientId(null); + outputStage.setOutputStagePrefix(null); + + final OutputStage updateOutputStage = gd.getOutputStageService().updateOutputStage(outputStage); + + assertThat(updateOutputStage.getSchemaUri(), is(nullValue())); + assertThat(updateOutputStage.getClientId(), is(nullValue())); + assertThat(updateOutputStage.getOutputStagePrefix(), is(nullValue())); + } + + @AfterClass + public void removeWarehouse() { + if(warehouse != null) { + gd.getWarehouseService().removeWarehouse(warehouse); + } + } +} diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java new file mode 100644 index 000000000..10ef69fe1 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java @@ -0,0 +1,107 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readStringFromResource; +import static net.jadler.Jadler.onRequest; +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.core.Is.is; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.AbstractGoodDataIT; + +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.InputStream; + +public class OutputStageServiceIT extends AbstractGoodDataIT { + + private static final String OUTPUT_STAGE_ALL_FIELDS = "/dataload/outputStageAllFields.json"; + private static final String OUTPUT_STAGE_NO_PROCESS = "/dataload/outputStageNoProcess.json"; + private static final String OUTPUT_STAGE = "/dataload/outputStage.json"; + + private static final String OUTPUT_STAGE_SCHEMA_URI = "/gdc/datawarehouse/instances/instanceId/schemas/default"; + private static final String CLIENT_ID = "clientId"; + private static final String OUTPUT_STAGE_PREFIX = "outputStagePrefix"; + private static final String PROJECT_ID = "projectId"; + + private OutputStage outputStage; + private Project project; + + @BeforeClass + public void setUp() throws Exception { + outputStage = MAPPER.readValue(readFromResource(OUTPUT_STAGE_ALL_FIELDS), OutputStage.class); + project = mock(Project.class); + when(project.getId()).thenReturn(PROJECT_ID); + } + + @Test + public void shouldGetOutputStageByUri() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(outputStage.getUri()) + .respond() + .withBody(readFromResource(OUTPUT_STAGE_ALL_FIELDS)) + .withStatus(200); + + final OutputStage result = gd.getOutputStageService().getOutputStageByUri(outputStage.getUri()); + + assertThat(result, is(notNullValue())); + assertThat(result.getSchemaUri(), is(equalTo(OUTPUT_STAGE_SCHEMA_URI))); + } + + @Test + public void shouldGetOutputStage() throws Exception { + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(outputStage.getUri()) + .respond() + .withBody(readFromResource(OUTPUT_STAGE_ALL_FIELDS)) + .withStatus(200); + + final OutputStage result = gd.getOutputStageService().getOutputStage(project); + + assertThat(result, is(notNullValue())); + assertThat(result.getSchemaUri(), is(equalTo(OUTPUT_STAGE_SCHEMA_URI))); + } + + @Test + public void shouldUpdateOutputStage() throws Exception { + final InputStream stream = getClass().getResourceAsStream(OUTPUT_STAGE); + final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + + onRequest() + .havingMethodEqualTo("PUT") + .havingPathEqualTo(outputStage.getUri()) + .havingBody(jsonEquals(readStringFromResource(OUTPUT_STAGE_NO_PROCESS))) + .respond() + .withStatus(200); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(outputStage.getUri()) + .respond() + .withBody(readFromResource(OUTPUT_STAGE_ALL_FIELDS)) + .withStatus(200); + + outputStage.setSchemaUri(OUTPUT_STAGE_SCHEMA_URI); + outputStage.setClientId(CLIENT_ID); + outputStage.setOutputStagePrefix(OUTPUT_STAGE_PREFIX); + OutputStage result = gd.getOutputStageService().updateOutputStage(outputStage); + + assertThat(result.getSchemaUri(), is(equalTo(OUTPUT_STAGE_SCHEMA_URI))); + assertThat(result.getClientId(), is(equalTo(CLIENT_ID))); + assertThat(result.getOutputStagePrefix(), is(equalTo(OUTPUT_STAGE_PREFIX))); + } +} diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java new file mode 100644 index 000000000..081e4260e --- /dev/null +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java @@ -0,0 +1,86 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import static com.gooddata.util.ResourceUtils.readFromResource; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.core.Is.is; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.project.Project; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.springframework.web.client.RestTemplate; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +public class OutputStageServiceTest { + + private final ObjectMapper MAPPER = new ObjectMapper(); + + private static final String OUTPUT_STAGE = "/dataload/outputStage.json"; + + @Mock + private RestTemplate restTemplate; + + private OutputStageService outputStageService; + + private OutputStage outputStage; + + @BeforeMethod + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + outputStageService = new OutputStageService(restTemplate); + outputStage = MAPPER.readValue(readFromResource(OUTPUT_STAGE), OutputStage.class); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetOutputStageByNullUri() throws Exception { + outputStageService.getOutputStageByUri(null); + } + + @Test + public void testGetOutputStageByUri() throws Exception { + when(restTemplate.getForObject(outputStage.getUri(), OutputStage.class)).thenReturn(outputStage); + + OutputStage outputStageByUri = outputStageService.getOutputStageByUri(outputStage.getUri()); + + assertThat(outputStageByUri, is(equalTo(outputStage))); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testGetOutputStageByNullProject() throws Exception { + outputStageService.getOutputStage(null); + } + + @Test + public void testGetOutputStage() throws Exception { + Project project = mock(Project.class); + when(project.getId()).thenReturn("projectId"); + when(restTemplate.getForObject(outputStage.getUri(), OutputStage.class)).thenReturn(outputStage); + + OutputStage outputStageByProject = outputStageService.getOutputStage(project); + + assertThat(outputStageByProject, is(equalTo(outputStage))); + } + + @Test(expectedExceptions = IllegalArgumentException.class) + public void testUpdateOutputStageNullOutputStage() throws Exception { + outputStageService.updateOutputStage(null); + } + + @Test + public void testUpdateOutputStage() throws Exception { + outputStageService.updateOutputStage(outputStage); + + verify(restTemplate,times(1)).put(outputStage.getUri(), outputStage); + } +} \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/OutputStageTest.java b/src/test/java/com/gooddata/dataload/OutputStageTest.java new file mode 100644 index 000000000..c03cb1bcd --- /dev/null +++ b/src/test/java/com/gooddata/dataload/OutputStageTest.java @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code 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; + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; + +public class OutputStageTest { + + private static final String SCHEMA_URI = "/gdc/datawarehouse/instances/instanceId/schemas/default"; + private static final String SELF_LINK = "/gdc/dataload/projects/projectId/outputStage"; + private static final String SQL_DIFF = "/gdc/dataload/projects/projectId/outputStage/sqlDiff"; + private static final String PROCESS_URI = "/gdc/projects/projectId/dataload/processes/processId"; + private static final String CLIENT_ID = "clientId"; + private static final String OUTPUT_STAGE_PREFIX = "outputStagePrefix"; + + private static final Map LINKS = new LinkedHashMap() {{ + put("self", SELF_LINK); + put("outputStageDiff", SQL_DIFF); + put("dataloadProcess", PROCESS_URI); + }}; + + @Test + public void testDeserializationAllFields() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/outputStageAllFields.json"); + final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + + assertThat(outputStage.getSchemaUri(), is(equalTo(SCHEMA_URI))); + assertThat(outputStage.getClientId(), is(equalTo(CLIENT_ID))); + assertThat(outputStage.getOutputStagePrefix(), is(equalTo(OUTPUT_STAGE_PREFIX))); + assertThat(outputStage.getLinks(), is(equalTo(LINKS))); + assertThat(outputStage.getUri(), is(equalTo(SELF_LINK))); + assertThat(outputStage.getOutputStageDiffUri(), is(equalTo(SQL_DIFF))); + assertThat(outputStage.getDataloadProcessUri(), is(equalTo(PROCESS_URI))); + assertThat(outputStage.hasSchemaUri(), is(true)); + assertThat(outputStage.hasClientId(), is(true)); + assertThat(outputStage.hasOutputStagePrefix(), is(true)); + } + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); + final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + + assertThat(outputStage.getSchemaUri(), is(nullValue())); + assertThat(outputStage.getClientId(), is(nullValue())); + assertThat(outputStage.getOutputStagePrefix(), is(nullValue())); + assertThat(outputStage.getUri(), is(equalTo(SELF_LINK))); + assertThat(outputStage.getOutputStageDiffUri(), is(equalTo(SQL_DIFF))); + assertThat(outputStage.getDataloadProcessUri(), is(nullValue())); + assertThat(outputStage.hasSchemaUri(), is(false)); + assertThat(outputStage.hasClientId(), is(false)); + assertThat(outputStage.hasOutputStagePrefix(), is(false)); + } + + @Test(dependsOnMethods = "testDeserialization") + public void testSerializationAfterDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); + final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + + outputStage.setSchemaUri(SCHEMA_URI); + outputStage.setClientId(CLIENT_ID); + outputStage.setOutputStagePrefix(OUTPUT_STAGE_PREFIX); + assertThat(outputStage, serializesToJson("/dataload/outputStageNoProcess.json")); + } +} diff --git a/src/test/resources/dataload/outputStage.json b/src/test/resources/dataload/outputStage.json new file mode 100644 index 000000000..bb8aa0708 --- /dev/null +++ b/src/test/resources/dataload/outputStage.json @@ -0,0 +1,8 @@ +{ + "outputStage" : { + "links" : { + "self" : "/gdc/dataload/projects/projectId/outputStage", + "outputStageDiff" : "/gdc/dataload/projects/projectId/outputStage/sqlDiff" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/outputStageAllFields.json b/src/test/resources/dataload/outputStageAllFields.json new file mode 100644 index 000000000..5044ff6d1 --- /dev/null +++ b/src/test/resources/dataload/outputStageAllFields.json @@ -0,0 +1,12 @@ +{ + "outputStage" : { + "schema" : "/gdc/datawarehouse/instances/instanceId/schemas/default", + "clientId" : "clientId", + "outputStagePrefix" : "outputStagePrefix", + "links" : { + "self" : "/gdc/dataload/projects/projectId/outputStage", + "outputStageDiff" : "/gdc/dataload/projects/projectId/outputStage/sqlDiff", + "dataloadProcess" : "/gdc/projects/projectId/dataload/processes/processId" + } + } +} \ No newline at end of file diff --git a/src/test/resources/dataload/outputStageNoProcess.json b/src/test/resources/dataload/outputStageNoProcess.json new file mode 100644 index 000000000..8f1ae3caa --- /dev/null +++ b/src/test/resources/dataload/outputStageNoProcess.json @@ -0,0 +1,11 @@ +{ + "outputStage" : { + "schema" : "/gdc/datawarehouse/instances/instanceId/schemas/default", + "clientId" : "clientId", + "outputStagePrefix" : "outputStagePrefix", + "links" : { + "self" : "/gdc/dataload/projects/projectId/outputStage", + "outputStageDiff" : "/gdc/dataload/projects/projectId/outputStage/sqlDiff" + } + } +} \ No newline at end of file From 33a1460e81f51b2bf08784d93d8aaffd401fa6ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:49:00 +0100 Subject: [PATCH 0458/1191] remove unused imports --- src/main/java/com/gooddata/UriPrefixer.java | 1 - .../com/gooddata/collections/PageableListDeserializer.java | 1 - src/main/java/com/gooddata/featureflag/FeatureFlags.java | 1 - src/main/java/com/gooddata/gdc/Gdc.java | 5 ----- src/main/java/com/gooddata/md/ReportAttachment.java | 1 - .../com/gooddata/md/maintenance/ExportImportService.java | 1 - src/main/java/com/gooddata/md/report/Total.java | 1 - src/main/java/com/gooddata/notification/ProjectEvent.java | 1 - src/main/java/com/gooddata/project/UsersDeserializer.java | 1 - src/main/java/com/gooddata/util/GDDateDeserializer.java | 1 - src/main/java/com/gooddata/warehouse/WarehouseSchemas.java | 1 - src/main/java/com/gooddata/warehouse/Warehouses.java | 1 - src/test/java/com/gooddata/Example.java | 1 - src/test/java/com/gooddata/GoodDataRestExceptionTest.java | 4 ---- src/test/java/com/gooddata/dataset/DatasetServiceAT.java | 1 - src/test/java/com/gooddata/dataset/DatasetServiceIT.java | 3 --- src/test/java/com/gooddata/dataset/DatasetTest.java | 2 -- src/test/java/com/gooddata/dataset/UploadsInfoTest.java | 4 ---- src/test/java/com/gooddata/gdc/DataStoreServiceIT.java | 1 - src/test/java/com/gooddata/gdc/DatastoreServiceAT.java | 1 - src/test/java/com/gooddata/gdc/GdcServiceIT.java | 1 - src/test/java/com/gooddata/md/AttributeElementsTest.java | 1 - src/test/java/com/gooddata/md/EntryTest.java | 1 - src/test/java/com/gooddata/md/MetaTest.java | 1 - src/test/java/com/gooddata/md/MetadataServiceAT.java | 1 - src/test/java/com/gooddata/md/MetadataServiceIT.java | 2 -- src/test/java/com/gooddata/md/ScheduledMailTest.java | 2 -- .../com/gooddata/md/maintenance/ExportImportServiceTest.java | 1 - .../java/com/gooddata/md/report/AttributeInGridTest.java | 2 -- src/test/java/com/gooddata/md/report/GridTest.java | 1 - src/test/java/com/gooddata/model/ModelServiceIT.java | 1 - src/test/java/com/gooddata/project/ProjectServiceIT.java | 1 - src/test/java/com/gooddata/project/ProjectServiceTest.java | 1 - .../gooddata/project/ProjectValidationResultItemTest.java | 1 - src/test/java/com/gooddata/util/GDDateClass.java | 1 - src/test/java/com/gooddata/util/GDDateDeserializerTest.java | 2 -- src/test/java/com/gooddata/util/GDDateSerializerTest.java | 2 -- src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java | 1 - 38 files changed, 56 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index ed0f74a79..9b8a82148 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -12,7 +12,6 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static org.springframework.util.StringUtils.trimLeadingCharacter; -import static org.springframework.util.StringUtils.trimTrailingCharacter; /** * Used internally by GoodData SDK to hold and set URI prefix (hostname and port) of all requests. diff --git a/src/main/java/com/gooddata/collections/PageableListDeserializer.java b/src/main/java/com/gooddata/collections/PageableListDeserializer.java index a4d8e2a03..007bfbdfe 100644 --- a/src/main/java/com/gooddata/collections/PageableListDeserializer.java +++ b/src/main/java/com/gooddata/collections/PageableListDeserializer.java @@ -12,7 +12,6 @@ import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.jsontype.TypeDeserializer; import java.io.IOException; import java.util.ArrayList; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index 6b1331ff9..e57305609 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -17,7 +17,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.stream.Collectors; import static com.gooddata.util.Validate.notEmpty; import static java.util.stream.Collectors.toMap; diff --git a/src/main/java/com/gooddata/gdc/Gdc.java b/src/main/java/com/gooddata/gdc/Gdc.java index 63f53d8de..4d449030d 100644 --- a/src/main/java/com/gooddata/gdc/Gdc.java +++ b/src/main/java/com/gooddata/gdc/Gdc.java @@ -6,12 +6,7 @@ package com.gooddata.gdc; 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.gdc.AboutLinks.Link; import java.util.List; diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java index d66bde961..c392843ce 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Map; diff --git a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java index 2e0726f3a..95db3400d 100644 --- a/src/main/java/com/gooddata/md/maintenance/ExportImportService.java +++ b/src/main/java/com/gooddata/md/maintenance/ExportImportService.java @@ -10,7 +10,6 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; -import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.PollResult; import com.gooddata.gdc.TaskStatus; diff --git a/src/main/java/com/gooddata/md/report/Total.java b/src/main/java/com/gooddata/md/report/Total.java index f0cbd4839..51c464ee0 100644 --- a/src/main/java/com/gooddata/md/report/Total.java +++ b/src/main/java/com/gooddata/md/report/Total.java @@ -5,7 +5,6 @@ */ package com.gooddata.md.report; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import static com.gooddata.util.Validate.notNull; diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java index 6adfff901..1f1eacd01 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -14,7 +14,6 @@ import org.springframework.web.util.UriTemplate; -import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/gooddata/project/UsersDeserializer.java b/src/main/java/com/gooddata/project/UsersDeserializer.java index c740f3192..75ce4ec7d 100644 --- a/src/main/java/com/gooddata/project/UsersDeserializer.java +++ b/src/main/java/com/gooddata/project/UsersDeserializer.java @@ -7,7 +7,6 @@ import com.gooddata.collections.PageableListDeserializer; import com.gooddata.collections.Paging; -import com.gooddata.dataload.processes.Schedule; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/gooddata/util/GDDateDeserializer.java b/src/main/java/com/gooddata/util/GDDateDeserializer.java index b4f7aa912..f0c527536 100644 --- a/src/main/java/com/gooddata/util/GDDateDeserializer.java +++ b/src/main/java/com/gooddata/util/GDDateDeserializer.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; -import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.joda.time.format.DateTimeFormatter; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java b/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java index 2b4256f5a..42c99a95f 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchemas.java @@ -9,7 +9,6 @@ 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.Paging; import org.springframework.web.util.UriTemplate; diff --git a/src/main/java/com/gooddata/warehouse/Warehouses.java b/src/main/java/com/gooddata/warehouse/Warehouses.java index 96cd30754..e36d815a8 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouses.java +++ b/src/main/java/com/gooddata/warehouse/Warehouses.java @@ -6,7 +6,6 @@ package com.gooddata.warehouse; import com.gooddata.collections.PageableList; -import com.gooddata.collections.PageableListSerializer; import com.gooddata.collections.Paging; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/src/test/java/com/gooddata/Example.java b/src/test/java/com/gooddata/Example.java index f31da2f74..6182bd3f8 100644 --- a/src/test/java/com/gooddata/Example.java +++ b/src/test/java/com/gooddata/Example.java @@ -17,7 +17,6 @@ import com.gooddata.md.report.AttributeInGrid; import com.gooddata.md.report.GridReportDefinitionContent; import com.gooddata.md.report.MetricElement; -import com.gooddata.md.report.MetricGroup; import com.gooddata.md.report.Report; import com.gooddata.md.report.ReportDefinition; import com.gooddata.model.ModelDiff; diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index fe35ba5ac..22c133197 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -12,11 +12,7 @@ import java.io.InputStream; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.*; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.testng.Assert.*; public class GoodDataRestExceptionTest { @Test diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java index 6bb89ffdb..a97849779 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceAT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceAT.java @@ -10,7 +10,6 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.greaterThan; import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import com.gooddata.AbstractGoodDataAT; diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index d00d95847..cf5f5edb5 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -23,9 +23,6 @@ import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; public class DatasetServiceIT extends AbstractGoodDataIT { diff --git a/src/test/java/com/gooddata/dataset/DatasetTest.java b/src/test/java/com/gooddata/dataset/DatasetTest.java index 90aa076ea..53e132a2e 100644 --- a/src/test/java/com/gooddata/dataset/DatasetTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetTest.java @@ -9,12 +9,10 @@ import org.testng.annotations.Test; import java.io.InputStream; -import java.util.Collection; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasSize; public class DatasetTest { diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index 939e1dd12..083b33ee7 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -6,14 +6,10 @@ package com.gooddata.dataset; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import static org.testng.Assert.assertTrue; import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.testng.annotations.Test; import java.io.InputStream; diff --git a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java index dbd201c4c..25e0e8cf6 100644 --- a/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java +++ b/src/test/java/com/gooddata/gdc/DataStoreServiceIT.java @@ -6,7 +6,6 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; -import com.gooddata.util.ResourceUtils; import org.apache.commons.io.IOUtils; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 068a869a3..274fbf506 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -10,7 +10,6 @@ import com.gooddata.GoodDataRestException; import org.apache.commons.io.IOUtils; import org.testng.annotations.BeforeClass; -import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.io.File; diff --git a/src/test/java/com/gooddata/gdc/GdcServiceIT.java b/src/test/java/com/gooddata/gdc/GdcServiceIT.java index 98f503208..e52b75360 100644 --- a/src/test/java/com/gooddata/gdc/GdcServiceIT.java +++ b/src/test/java/com/gooddata/gdc/GdcServiceIT.java @@ -6,7 +6,6 @@ package com.gooddata.gdc; import com.gooddata.AbstractGoodDataIT; -import com.gooddata.util.ResourceUtils; import org.testng.annotations.Test; import static com.gooddata.util.ResourceUtils.readFromResource; diff --git a/src/test/java/com/gooddata/md/AttributeElementsTest.java b/src/test/java/com/gooddata/md/AttributeElementsTest.java index a725b9fb3..3da82955d 100644 --- a/src/test/java/com/gooddata/md/AttributeElementsTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementsTest.java @@ -15,7 +15,6 @@ import java.io.InputStream; import java.util.List; -import java.util.Set; public class AttributeElementsTest { diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 1feb3453a..176f2e0bf 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -10,7 +10,6 @@ import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import java.util.Collections; import java.util.Set; import static com.gooddata.JsonMatchers.serializesToJson; diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index 1ef3d2916..8078fa164 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -10,7 +10,6 @@ import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import java.util.Arrays; import java.util.LinkedHashSet; import java.util.Set; diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 2aa6ff219..86a331a28 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -19,7 +19,6 @@ import com.gooddata.md.report.Filter; import com.gooddata.md.report.GridReportDefinitionContent; import com.gooddata.md.report.MetricElement; -import com.gooddata.md.report.MetricGroup; import com.gooddata.md.report.Report; import org.joda.time.LocalDate; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index d8997218d..e6a0e552b 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -9,8 +9,6 @@ import com.gooddata.gdc.UriResponse; import com.gooddata.md.report.ReportDefinition; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; -import net.javacrumbs.jsonunit.JsonMatchers; import org.hamcrest.Matchers; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java index 668682810..9f7ac5246 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -11,10 +11,8 @@ import org.joda.time.LocalDate; import org.testng.annotations.Test; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.HashMap; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java index 71dfe8d7d..65636513e 100644 --- a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceTest.java @@ -9,7 +9,6 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; -import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index 4c6b0769c..464fc7e05 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -11,7 +11,6 @@ import org.testng.annotations.Test; import java.io.InputStream; -import java.util.Collection; import java.util.Iterator; import java.util.List; @@ -20,7 +19,6 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.Matchers.isOneOf; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index b84b5ac29..16c0fd052 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -9,7 +9,6 @@ import org.hamcrest.CoreMatchers; import org.testng.annotations.Test; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index 9356160a1..bfce9a281 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -9,7 +9,6 @@ import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.TaskStatus; import com.gooddata.project.Project; -import com.gooddata.util.ResourceUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index 86fad2eee..e67ad1f50 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -20,7 +20,6 @@ import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; diff --git a/src/test/java/com/gooddata/project/ProjectServiceTest.java b/src/test/java/com/gooddata/project/ProjectServiceTest.java index 3adab14e7..ee4782f6f 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceTest.java +++ b/src/test/java/com/gooddata/project/ProjectServiceTest.java @@ -22,7 +22,6 @@ import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.hasSize; import static org.mockito.Mockito.when; diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java index f260c4c2a..301c00d7c 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -11,7 +11,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.notNullValue; public class ProjectValidationResultItemTest { diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index c1829de8e..617567386 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import org.joda.time.DateTime; import org.joda.time.LocalDate; public class GDDateClass { diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java index 0cac3698b..2119896f9 100644 --- a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -7,8 +7,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java index 5aa2e1537..6abd62593 100644 --- a/src/test/java/com/gooddata/util/GDDateSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -7,8 +7,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; import org.joda.time.LocalDate; import org.testng.annotations.Test; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java index 64c2498fe..beda0bd14 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java @@ -12,7 +12,6 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; From 14bac21842a1ad42997ad28d3e54a648b0f51d0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:51:57 +0100 Subject: [PATCH 0459/1191] missing finals --- .../connector/IntegrationProcessStatus.java | 2 +- .../gooddata/dataload/processes/AsyncTask.java | 2 +- .../gooddata/dataload/processes/Schedule.java | 2 +- src/main/java/com/gooddata/dataset/Uploads.java | 2 +- .../com/gooddata/featureflag/FeatureFlag.java | 2 +- .../gooddata/featureflag/ProjectFeatureFlag.java | 2 +- src/main/java/com/gooddata/gdc/AsyncTask.java | 2 +- src/main/java/com/gooddata/md/AttributeSort.java | 4 ++-- .../java/com/gooddata/md/IdentifierAndUri.java | 4 ++-- src/main/java/com/gooddata/md/ScheduledMail.java | 2 +- .../com/gooddata/md/report/AttributeInGrid.java | 2 +- src/main/java/com/gooddata/model/ModelDiff.java | 6 +++--- src/main/java/com/gooddata/project/Project.java | 8 ++++---- src/main/java/com/gooddata/project/Role.java | 2 +- src/main/java/com/gooddata/project/User.java | 16 ++++++++-------- .../com/gooddata/util/ResponseErrorHandler.java | 2 +- .../java/com/gooddata/warehouse/Warehouse.java | 2 +- .../com/gooddata/warehouse/WarehouseUser.java | 6 +++--- src/test/java/com/gooddata/JsonMatchers.java | 2 +- src/test/java/com/gooddata/util/GDDateClass.java | 2 +- .../java/com/gooddata/util/GDDateTimeClass.java | 2 +- .../java/com/gooddata/util/ISODateClass.java | 2 +- 22 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index 94a058d2d..e87c4a62b 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -35,7 +35,7 @@ public class IntegrationProcessStatus { private final Status status; private final DateTime started; private final DateTime finished; - private Map links; + private final Map links; @JsonCreator protected IntegrationProcessStatus(@JsonProperty("status") Status status, diff --git a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java index afd76d510..d434ad847 100644 --- a/src/main/java/com/gooddata/dataload/processes/AsyncTask.java +++ b/src/main/java/com/gooddata/dataload/processes/AsyncTask.java @@ -25,7 +25,7 @@ class AsyncTask { @JsonProperty - private Links links; + private final Links links; @JsonCreator private AsyncTask(@JsonProperty("links") Links links) { diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 2a62d2899..1d3e22337 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -45,7 +45,7 @@ public class Schedule { private static final String PROCESS_ID = "PROCESS_ID"; private static final String EXECUTABLE = "EXECUTABLE"; - private String type; + private final String type; private String state; private String cron; private String timezone; diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/src/main/java/com/gooddata/dataset/Uploads.java index 3edf117bd..9b386424c 100644 --- a/src/main/java/com/gooddata/dataset/Uploads.java +++ b/src/main/java/com/gooddata/dataset/Uploads.java @@ -21,7 +21,7 @@ @JsonIgnoreProperties(ignoreUnknown = true) class Uploads { - private Collection uploads; + private final Collection uploads; Uploads(@JsonProperty("uploads") Collection uploads) { this.uploads = uploads; diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/src/main/java/com/gooddata/featureflag/FeatureFlag.java index 5e350a9ab..a5b008278 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlag.java @@ -14,7 +14,7 @@ public class FeatureFlag { private final String name; - private boolean enabled; + private final boolean enabled; public FeatureFlag(final String name, final boolean enabled) { this.name = notNull(name, "name"); diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java index f40b7d77f..2b1b0e775 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -28,7 +28,7 @@ public class ProjectFeatureFlag { private boolean enabled; @JsonIgnore - private Links links; + private final Links links; /** * Creates new project feature flag which is by default enabled (true). diff --git a/src/main/java/com/gooddata/gdc/AsyncTask.java b/src/main/java/com/gooddata/gdc/AsyncTask.java index e17dcb870..702ded79b 100644 --- a/src/main/java/com/gooddata/gdc/AsyncTask.java +++ b/src/main/java/com/gooddata/gdc/AsyncTask.java @@ -24,7 +24,7 @@ public class AsyncTask { @JsonProperty - private Link link; + private final Link link; @JsonCreator private AsyncTask(@JsonProperty("link") Link link) { diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/src/main/java/com/gooddata/md/AttributeSort.java index 73fedb906..d00956326 100644 --- a/src/main/java/com/gooddata/md/AttributeSort.java +++ b/src/main/java/com/gooddata/md/AttributeSort.java @@ -27,8 +27,8 @@ @JsonSerialize(using = AttributeSort.Serializer.class) class AttributeSort { - static String PK = "pk"; - static String BY_USED_DF = "byUsedDF"; + static final String PK = "pk"; + static final String BY_USED_DF = "byUsedDF"; private final String value; private final boolean linkType; diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index d776940da..aa7bfb1d9 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -13,9 +13,9 @@ */ class IdentifierAndUri { - private String identifier; + private final String identifier; - private String uri; + private final String uri; @JsonCreator IdentifierAndUri(@JsonProperty("identifier") String identifier, @JsonProperty("uri") String uri) { diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 8a2725091..2a485287b 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -24,7 +24,7 @@ public class ScheduledMail extends AbstractObj implements Queryable, Updatable { @JsonProperty("content") - private Content content; + private final Content content; @JsonCreator ScheduledMail(@JsonProperty("meta") Meta meta, @JsonProperty("content") Content content) { diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 28e903019..11cd22818 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -31,7 +31,7 @@ public class AttributeInGrid implements GridElement { private final String uri; private final String alias; - private List> totals; + private final List> totals; @JsonCreator AttributeInGrid(@JsonProperty("uri") String uri, @JsonProperty("totals") List> totals, diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index c5d1892e2..fed0467c0 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -109,9 +109,9 @@ private UpdateScript getUpdateScriptByFlags(final boolean preserveData, final bo @JsonIgnoreProperties(ignoreUnknown = true) static class UpdateScript { - private List maqlChunks; - private Boolean preserveData; - private Boolean cascadeDrops; + private final List maqlChunks; + private final Boolean preserveData; + private final Boolean cascadeDrops; /** * Create set of MAQL DDL scripts with one variant of side-effects (truncation of loaded data, drops of related objects...). diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index e6a546840..be003f981 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -42,10 +42,10 @@ public class Project { private static final Set PREPARING_STATES = new HashSet<>(asList("PREPARING", "PREPARED", "LOADING")); @JsonProperty("content") - private ProjectContent content; + private final ProjectContent content; @JsonProperty("meta") - private ProjectMeta meta; + private final ProjectMeta meta; @JsonIgnore private Links links; @@ -427,13 +427,13 @@ public void setEnvironment(final Environment environment) { private static class ProjectContent { @JsonProperty("authorizationToken") - private String authorizationToken; + private final String authorizationToken; @JsonProperty("driver") private String driver; @JsonProperty("guidedNavigation") - private String guidedNavigation; + private final String guidedNavigation; @JsonIgnore private String cluster; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index 2ad256603..c7846719d 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -43,7 +43,7 @@ public class Role { @JsonSerialize(contentUsing = BooleanStringSerializer.class) private final Map permissions; - private Meta meta; + private final Meta meta; private final Map links; diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index 5f295a088..858c24ffd 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -23,7 +23,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class User { - private UserContent content; + private final UserContent content; @JsonCreator User(@JsonProperty("content") final UserContent content) { @@ -63,25 +63,25 @@ public String getPhoneNumber() { private static class UserContent { @JsonProperty("email") - private String email; + private final String email; @JsonProperty("firstname") - private String firstName; + private final String firstName; @JsonProperty("userRoles") - private List userRoles; + private final List userRoles; @JsonProperty("phonenumber") - private String phoneNumber; + private final String phoneNumber; @JsonProperty("status") - private String status; + private final String status; @JsonProperty("lastname") - private String lastName; + private final String lastName; @JsonProperty("login") - private String login; + private final String login; @JsonCreator public UserContent(@JsonProperty("email") final String email, diff --git a/src/main/java/com/gooddata/util/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java index ca64aa79a..c9d0a3f72 100644 --- a/src/main/java/com/gooddata/util/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -24,7 +24,7 @@ */ public class ResponseErrorHandler extends DefaultResponseErrorHandler { - private HttpMessageConverterExtractor gdcErrorExtractor; + private final HttpMessageConverterExtractor gdcErrorExtractor; public ResponseErrorHandler(List> messageConverters) { gdcErrorExtractor = new HttpMessageConverterExtractor<>(GdcError.class, diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index e6842e117..944c64c1f 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -46,7 +46,7 @@ public class Warehouse { private String title; private String description; - private String authorizationToken; + private final String authorizationToken; private DateTime created; private DateTime updated; private String createdBy; diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index ff2208ea5..d695e866e 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -35,9 +35,9 @@ public class WarehouseUser { private static final String SELF_LINK = "self"; - private String role; - private String profile; - private String login; + private final String role; + private final String profile; + private final String login; private Map links; public WarehouseUser(final String role, final String profile, final String login) { diff --git a/src/test/java/com/gooddata/JsonMatchers.java b/src/test/java/com/gooddata/JsonMatchers.java index f05c8c814..a1afe313f 100644 --- a/src/test/java/com/gooddata/JsonMatchers.java +++ b/src/test/java/com/gooddata/JsonMatchers.java @@ -57,7 +57,7 @@ public static Matcher isJsonString(final String expectedResourceName) { private static class JsonFileMatcher extends BaseMatcher { - private String expectedResourceName; + private final String expectedResourceName; private String expectedJsonString; private String actualJsonString; private String errorString; diff --git a/src/test/java/com/gooddata/util/GDDateClass.java b/src/test/java/com/gooddata/util/GDDateClass.java index 617567386..6db28c7c9 100644 --- a/src/test/java/com/gooddata/util/GDDateClass.java +++ b/src/test/java/com/gooddata/util/GDDateClass.java @@ -12,7 +12,7 @@ import org.joda.time.LocalDate; public class GDDateClass { - private LocalDate date; + private final LocalDate date; @JsonCreator public GDDateClass(@JsonProperty("date") @JsonDeserialize(using = GDDateDeserializer.class) final LocalDate date) { diff --git a/src/test/java/com/gooddata/util/GDDateTimeClass.java b/src/test/java/com/gooddata/util/GDDateTimeClass.java index b3b5de704..7fb428981 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeClass.java +++ b/src/test/java/com/gooddata/util/GDDateTimeClass.java @@ -13,7 +13,7 @@ class GDDateTimeClass { - private DateTime date; + private final DateTime date; @JsonCreator public GDDateTimeClass(@JsonProperty("date") @JsonDeserialize(using = GDDateTimeDeserializer.class) final DateTime date) { diff --git a/src/test/java/com/gooddata/util/ISODateClass.java b/src/test/java/com/gooddata/util/ISODateClass.java index c6be9f531..aaae96993 100644 --- a/src/test/java/com/gooddata/util/ISODateClass.java +++ b/src/test/java/com/gooddata/util/ISODateClass.java @@ -13,7 +13,7 @@ class ISODateClass { - private DateTime date; + private final DateTime date; @JsonCreator public ISODateClass(@JsonProperty("date") @JsonDeserialize(using = ISODateTimeDeserializer.class) final DateTime date) { From 5c1818b4a631cf4189b4d66c2ee564224d9b5281 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:53:37 +0100 Subject: [PATCH 0460/1191] IOException in finally --- .../java/com/gooddata/dataload/processes/ProcessServiceAT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 7c05fa2cd..9f491bac7 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -53,7 +53,7 @@ public void createProcess() throws Exception { copy("workspace.prm", dir); process = gd.getProcessService().createProcess(project, new DataloadProcess(title, ProcessType.GRAPH), dir); } finally { - FileUtils.deleteDirectory(dir); + FileUtils.deleteQuietly(dir); } } From ebc20fe1d1e2b6d0e548ec6f6e490290b4e8fc2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:54:29 +0100 Subject: [PATCH 0461/1191] redundant type parameters --- src/main/java/com/gooddata/GoodData.java | 2 +- .../gooddata/collections/PageableList.java | 2 +- .../java/com/gooddata/gdc/TaskStatus.java | 2 +- src/main/java/com/gooddata/md/Attribute.java | 2 +- src/main/java/com/gooddata/md/Dataset.java | 4 ++-- src/main/java/com/gooddata/md/Dimension.java | 2 +- .../java/com/gooddata/md/MetadataService.java | 2 +- .../java/com/gooddata/md/ScheduledMail.java | 4 ++-- .../java/com/gooddata/md/report/Grid.java | 4 ++-- .../report/GridReportDefinitionContent.java | 4 ++-- .../OneNumberReportDefinitionContent.java | 2 +- .../java/com/gooddata/model/ModelDiff.java | 4 ++-- .../com/gooddata/project/ProjectService.java | 2 +- .../IntegrationProcessStatusTest.java | 20 +++++++++---------- .../processes/ProcessServiceTest.java | 2 +- .../gooddata/dataset/DatasetServiceTest.java | 4 ++-- .../com/gooddata/dataset/UploadsInfoTest.java | 2 +- .../com/gooddata/dataset/UploadsTest.java | 2 +- .../com/gooddata/md/MetadataServiceTest.java | 2 +- .../GridReportDefinitionContentTest.java | 4 ++-- .../java/com/gooddata/md/report/GridTest.java | 6 +++--- .../OneNumberReportDefinitionContentTest.java | 4 ++-- .../report/ReportDefinitionContentTest.java | 4 ++-- .../md/report/ReportDefinitionTest.java | 4 ++-- .../com/gooddata/model/ModelDiffTest.java | 4 ++-- .../com/gooddata/util/TagsSerializerTest.java | 2 +- .../warehouse/WarehouseUsersTest.java | 2 +- .../gooddata/warehouse/WarehousesTest.java | 2 +- 28 files changed, 50 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index a049771fa..ed4f3e490 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -225,7 +225,7 @@ static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient htt endpoint.getProtocol() ); final RestTemplate restTemplate = new RestTemplate(factory); - restTemplate.setInterceptors(Arrays.asList( + restTemplate.setInterceptors(Arrays.asList( new HeaderSettingRequestInterceptor(singletonMap("Accept", getAcceptHeaderValue())))); restTemplate.setErrorHandler(new ResponseErrorHandler(restTemplate.getMessageConverters())); diff --git a/src/main/java/com/gooddata/collections/PageableList.java b/src/main/java/com/gooddata/collections/PageableList.java index 0c53bd6e2..4bdd32f2a 100644 --- a/src/main/java/com/gooddata/collections/PageableList.java +++ b/src/main/java/com/gooddata/collections/PageableList.java @@ -33,7 +33,7 @@ public class PageableList implements List { * Creates empty list with no next page. */ public PageableList() { - this(Collections.emptyList(), null); + this(Collections.emptyList(), null); } /** diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index 1b5fc5b96..f36dbacdb 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -41,7 +41,7 @@ private TaskStatus(@JsonProperty("status") String status, @JsonProperty("poll") } public TaskStatus(final String status, final String pollUri) { - this(status, pollUri, Collections.emptyList()); + this(status, pollUri, Collections.emptyList()); } public String getStatus() { diff --git a/src/main/java/com/gooddata/md/Attribute.java b/src/main/java/com/gooddata/md/Attribute.java index 7d02795c5..a4d44202f 100644 --- a/src/main/java/com/gooddata/md/Attribute.java +++ b/src/main/java/com/gooddata/md/Attribute.java @@ -30,7 +30,7 @@ private Attribute(@JsonProperty("meta") Meta meta, @JsonProperty("content") Nest /* Just for serialization test */ Attribute(String title, Key primaryKey, Key foreignKey) { - this(new Meta(title), new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null, null, null, null, null, + this(new Meta(title), new Content(asList(primaryKey), asList(foreignKey), Collections.emptyList(), null, null, null, null, null, null, null, null, null, null, null)); } } diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index 2be8f1f35..b04d7f332 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -49,8 +49,8 @@ private Dataset(@JsonProperty("meta") Meta meta, @JsonProperty("content") Conten /* Just for serialization test */ Dataset(String title) { - this(new Meta(title), new Content(Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), - Collections.emptyList(), false), null); + this(new Meta(title), new Content(Collections.emptyList(), null, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), false), null); } @JsonIgnore diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index 8203f5353..a89cdc528 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -34,7 +34,7 @@ private Dimension(@JsonProperty("meta") Meta meta, @JsonProperty("content") Cont /* for serialization test */ Dimension(String title) { - this(new Meta(title), new Content(Collections.emptyList())); + this(new Meta(title), new Content(Collections.emptyList())); } @JsonIgnore diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index 48b17e9ab..b66a6b981 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -324,7 +324,7 @@ public Collection usedBy(Project project, String uri, boolean nearest, Cl notNull(project, "project"); final Collection usages = usedBy(project, asList(uri), nearest, types); - return usages.size() > 0 ? usages.iterator().next().getUsedBy() : Collections.emptyList(); + return usages.size() > 0 ? usages.iterator().next().getUsedBy() : Collections.emptyList(); } /** diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 2a485287b..5e8eaaaaf 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -52,7 +52,7 @@ private ScheduledMail(String title, String summary, Set tags, boolean de * @param summary the summary of the MD object */ public ScheduledMail(String title, String summary) { - super(new Meta(null, null, null, null, summary, title, null, Collections.emptySet(), null, null, false, + super(new Meta(null, null, null, null, summary, title, null, Collections.emptySet(), null, null, false, null, false, false, null)); this.content = new Content(); } @@ -74,7 +74,7 @@ public ScheduledMail(String title, String summary) { public ScheduledMail(String title, String summary, String recurrency, LocalDate startDate, String timeZone, Collection toAddresses, Collection bccAddresses, String subject, String body, List attachments) { - this(title, summary, Collections.emptySet(), false, recurrency, startDate, timeZone, toAddresses, + this(title, summary, Collections.emptySet(), false, recurrency, startDate, timeZone, toAddresses, bccAddresses, subject, body, attachments); } diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index b4982538e..764f1b160 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -61,8 +61,8 @@ public Grid(List columns, List row this.rows = rows; this.metrics = metrics; sort = new LinkedHashMap<>(); - sort.put("columns", Collections.emptyList()); - sort.put("rows", Collections.emptyList()); + sort.put("columns", Collections.emptyList()); + sort.put("rows", Collections.emptyList()); columnWidths = Collections.emptyList(); } diff --git a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java index fb89a9612..a7b1c44a5 100644 --- a/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/GridReportDefinitionContent.java @@ -35,7 +35,7 @@ private GridReportDefinitionContent( } GridReportDefinitionContent(Grid grid) { - this(grid, Collections.emptyList()); + this(grid, Collections.emptyList()); } public String getFormat() { @@ -44,7 +44,7 @@ public String getFormat() { public static ReportDefinition create(String title, List columns, List rows, List metrics) { - return create(title, columns, rows, metrics, Collections.emptyList()); + return create(title, columns, rows, metrics, Collections.emptyList()); } public static ReportDefinition create(String title, List columns, List rows, diff --git a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java index d7d556ae1..cfa7660d0 100644 --- a/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/OneNumberReportDefinitionContent.java @@ -78,7 +78,7 @@ public String getDescription() { public static ReportDefinition create(String title, List columns, List rows, List metrics) { - return create(title, columns, rows, metrics, Collections.emptyList()); + return create(title, columns, rows, metrics, Collections.emptyList()); } public static ReportDefinition create(String title, List columns, List rows, diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index fed0467c0..714fe91eb 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -35,7 +35,7 @@ public class ModelDiff { */ @JsonCreator ModelDiff(@JsonProperty("updateScripts") List updateScripts) { - this.updateScripts = updateScripts == null ? Collections.emptyList() : updateScripts; + this.updateScripts = updateScripts == null ? Collections.emptyList() : updateScripts; } /** @@ -126,7 +126,7 @@ static class UpdateScript { @JsonProperty("maqlDdlChunks") List maqlChunks) { this.preserveData = preserveData; this.cascadeDrops = cascadeDrops; - this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; + this.maqlChunks = maqlChunks == null ? Collections.emptyList() : maqlChunks; } /** diff --git a/src/main/java/com/gooddata/project/ProjectService.java b/src/main/java/com/gooddata/project/ProjectService.java index 62177cc40..25cf32b14 100644 --- a/src/main/java/com/gooddata/project/ProjectService.java +++ b/src/main/java/com/gooddata/project/ProjectService.java @@ -171,7 +171,7 @@ public Collection getProjectTemplates(Project project) { notNull(project, "project"); try { final ProjectTemplates templates = restTemplate.getForObject(ProjectTemplate.URI, ProjectTemplates.class, project.getId()); - return templates != null && templates.getTemplatesInfo() != null ? templates.getTemplatesInfo() : Collections.emptyList(); + return templates != null && templates.getTemplatesInfo() != null ? templates.getTemplatesInfo() : Collections.emptyList(); } catch (GoodDataRestException | RestClientException e) { throw new GoodDataException("Unable to get project templates", e); } diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index 33ddb7439..c13bc4a47 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -42,61 +42,61 @@ public void testShouldDeserialize() throws Exception { @Test public void testIsFinishedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(true)); } @Test public void testIsFinishedOnUploading() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(UPLOADING.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFinishedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFinished(), is(false)); } @Test public void testIsFailedOnError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnUserError() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(USER_ERROR.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(true)); } @Test public void testIsFailedOnSynchronized() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(SYNCHRONIZED.name(), "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnNullCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status(null, "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } @Test public void testIsFailedOnUnknownCode() throws Exception { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); assertThat(process.isFailed(), is(false)); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 1c4fb3181..39092b899 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -211,7 +211,7 @@ public void testListUserProcessesWithNullResponse() throws Exception { @Test public void testListUserProcessesWithNoProcesses() throws Exception { when(restTemplate.getForObject(create(USER_PROCESS_URI), DataloadProcesses.class)) - .thenReturn(new DataloadProcesses(Collections.emptyList())); + .thenReturn(new DataloadProcesses(Collections.emptyList())); final Collection result = processService.listUserProcesses(); assertThat(result, empty()); } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index d15a35312..65b032bbd 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -232,7 +232,7 @@ public void testGetDataSetInfoEmptyResponse() throws Exception { public void testListUploadsForDatasetMissingUri() throws Exception { mockDataSetInfo(); - assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); + assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); } @Test(expectedExceptions = GoodDataException.class) @@ -262,7 +262,7 @@ public void testListUploadsForDatasetEmptyResponseBody() throws Exception { when(restTemplate.getForObject(DATASET_UPLOADS_URI, Uploads.class)).thenReturn(new Uploads(null)); - assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); + assertThat(service.listUploadsForDataset(project, DATASET_ID), Matchers.empty()); } @Test diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index 083b33ee7..69bf201ba 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -34,6 +34,6 @@ public void shouldDeserialize() throws Exception { @Test(expectedExceptions = DatasetNotFoundException.class) public void getDatasetUploadInfoFails() throws Exception { - new UploadsInfo(Collections.emptyList()).getDataSet("dataset.non_existing_one"); + new UploadsInfo(Collections.emptyList()).getDataSet("dataset.non_existing_one"); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java index 929411798..66dd73797 100644 --- a/src/test/java/com/gooddata/dataset/UploadsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -24,7 +24,7 @@ public void shouldDeserialize() throws Exception { final Uploads uploads = new ObjectMapper().readValue(input, Uploads.class); assertThat(uploads, notNullValue()); - assertThat(uploads.items(), not(Matchers.empty())); + assertThat(uploads.items(), not(Matchers.empty())); assertThat(uploads.items().size(), is(2)); } } diff --git a/src/test/java/com/gooddata/md/MetadataServiceTest.java b/src/test/java/com/gooddata/md/MetadataServiceTest.java index a2c6de9b2..107e7e6d4 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceTest.java +++ b/src/test/java/com/gooddata/md/MetadataServiceTest.java @@ -351,7 +351,7 @@ public void testGetAttributeElementsEmpty() throws Exception { when(attr.getDefaultDisplayForm()).thenReturn(attrDisplayForm); when(restTemplate.getForObject("elementsUri", AttributeElements.class)) - .thenReturn(new AttributeElements(Collections.emptyList())); + .thenReturn(new AttributeElements(Collections.emptyList())); final List elements = service.getAttributeElements(attr); assertThat(elements, hasSize(0)); } diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index 2705728bf..cfea902dc 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -30,8 +30,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final GridReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList())); + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 16c0fd052..5ca33a8c2 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -32,7 +32,7 @@ public void testDeserialization() throws Exception { assertThat(grid.getColumns(), is(notNullValue())); assertThat(grid.getColumns(), hasSize(1)); - assertThat(grid.getColumns().iterator().next(), CoreMatchers.is(METRIC_GROUP)); + assertThat(grid.getColumns().iterator().next(), CoreMatchers.is(METRIC_GROUP)); assertThat(grid.getRows(), is(notNullValue())); assertThat(grid.getRows(), hasSize(1)); @@ -55,8 +55,8 @@ public void testSerialization() throws Exception { final Map colWidths = new HashMap<>(); final Map> sort = new HashMap<>(); colWidths.put("width", 343); - sort.put("columns", Collections.emptyList()); - sort.put("rows", Collections.emptyList()); + sort.put("columns", Collections.emptyList()); + sort.put("rows", Collections.emptyList()); final Grid grid = new Grid( asList(METRIC_GROUP), asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", "attr")), diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 754d8e3cf..8d212477f 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -31,8 +31,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final OneNumberReportDefinitionContent def = new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc", Collections.emptyList() + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc", Collections.emptyList() ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index cda4f3118..55d8724ea 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -30,8 +30,8 @@ public void testDeserialization() throws Exception { @Test public void testSerialization() throws Exception { final ReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList())); + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index c3e85777b..421553ef8 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -35,8 +35,8 @@ public void testDeserialization() throws Exception { public void testSerialization() throws Exception { final ReportDefinition def = new ReportDefinition("Untitled", new OneNumberReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()), "desc", asList(new Filter("(SELECT [/gdc/md/projectId/obj/123]) >= 2"))) + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList()), "desc", asList(new Filter("(SELECT [/gdc/md/projectId/obj/123]) >= 2"))) ); assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); } diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 9e617ed59..cac5e5945 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -61,14 +61,14 @@ public void testGetUpdateMaqlsNoPreserveData() throws Exception { @Test public void testGetUpdateMaqlsNoUpdateScript() throws Exception { - final ModelDiff diff = new ModelDiff(Collections.emptyList()); + final ModelDiff diff = new ModelDiff(Collections.emptyList()); assertThat(diff.getUpdateMaql(), hasSize(0)); } @Test public void testGetUpdateMaqlsNoMaqlInUpdateScript() throws Exception { - final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); assertThat(diff.getUpdateMaql(), hasSize(0)); } diff --git a/src/test/java/com/gooddata/util/TagsSerializerTest.java b/src/test/java/com/gooddata/util/TagsSerializerTest.java index 2541fbabb..24e42f15d 100644 --- a/src/test/java/com/gooddata/util/TagsSerializerTest.java +++ b/src/test/java/com/gooddata/util/TagsSerializerTest.java @@ -29,7 +29,7 @@ public void shouldSerializeOneTag() throws Exception { @Test public void shouldSerializeZeroTags() throws Exception { - final TagsTestClass tags = new TagsTestClass(Collections.emptySet()); + final TagsTestClass tags = new TagsTestClass(Collections.emptySet()); final String jsonString = MAPPER.writeValueAsString(tags); assertThat(jsonString, is("{\"tags\":\"\"}")); } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java index beda0bd14..09b944c0a 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUsersTest.java @@ -21,7 +21,7 @@ public class WarehouseUsersTest { private final WarehouseUsers users = readObjectFromResource("/warehouse/users.json", WarehouseUsers.class); - private final WarehouseUsers empty = new WarehouseUsers(Collections.emptyList(), null); + private final WarehouseUsers empty = new WarehouseUsers(Collections.emptyList(), null); @Test public void testDeserialization() throws Exception { diff --git a/src/test/java/com/gooddata/warehouse/WarehousesTest.java b/src/test/java/com/gooddata/warehouse/WarehousesTest.java index f51775667..860643aa6 100644 --- a/src/test/java/com/gooddata/warehouse/WarehousesTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehousesTest.java @@ -20,7 +20,7 @@ public class WarehousesTest { private final Warehouses warehouses = readObjectFromResource("/warehouse/warehouses.json", Warehouses.class); - private final Warehouses empty = new Warehouses(Collections.emptyList(), null); + private final Warehouses empty = new Warehouses(Collections.emptyList(), null); @Test public void testDeserialization() throws Exception { From 2511b8284cf0e8e478264d30b8475cfbb3258a14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:54:53 +0100 Subject: [PATCH 0462/1191] redundant cast to integer --- src/test/java/com/gooddata/md/report/GridTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 5ca33a8c2..de1d7044b 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -46,7 +46,7 @@ public void testDeserialization() throws Exception { assertThat(grid.getColumnWidths(), hasSize(1)); final Map colWidth = grid.getColumnWidths().iterator().next(); - assertThat((Integer) colWidth.get("width"), is(343)); + assertThat(colWidth.get("width"), is(343)); } From 587c83a08eab184e927e2beb971eb8df11d6048f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:56:02 +0100 Subject: [PATCH 0463/1191] unnecessary semicolon --- src/main/java/com/gooddata/connector/Status.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java index 40fdc54c8..63abb44e4 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/src/main/java/com/gooddata/connector/Status.java @@ -72,7 +72,7 @@ public boolean isFailed() { */ public enum Code { NEW, SCHEDULED, DOWNLOADING, DOWNLOADED, TRANSFORMING, TRANSFORMED, UPLOADING, UPLOADED, SYNCHRONIZED, - ERROR, USER_ERROR; + ERROR, USER_ERROR } } From d94b5f91b06c1c51b057c72ec286de3d668683e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:56:56 +0100 Subject: [PATCH 0464/1191] redundant final for interface field --- src/main/java/com/gooddata/connector/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/connector/Settings.java b/src/main/java/com/gooddata/connector/Settings.java index 5fe32a69e..421d17762 100644 --- a/src/main/java/com/gooddata/connector/Settings.java +++ b/src/main/java/com/gooddata/connector/Settings.java @@ -20,7 +20,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public interface Settings { - final String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; + String URL = "/gdc/projects/{project}/connectors/{connector}/integration/settings"; @JsonIgnore ConnectorType getConnectorType(); From 21562c59dea558f829e0f6f36273881bc1e39e49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 15 Dec 2016 23:58:05 +0100 Subject: [PATCH 0465/1191] redudant modifier for inner enum --- src/main/java/com/gooddata/md/Restriction.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/md/Restriction.java b/src/main/java/com/gooddata/md/Restriction.java index 45af7c069..2a87eab0d 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/src/main/java/com/gooddata/md/Restriction.java @@ -57,7 +57,7 @@ public static Restriction summary(String value) { return new Restriction(Type.SUMMARY, value); } - static enum Type { + enum Type { IDENTIFIER, TITLE, SUMMARY } } From 18b6ac8d4f1b87ad1c3a198bc8ebbe0bd58b9cb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Wed, 14 Dec 2016 11:08:25 +0100 Subject: [PATCH 0466/1191] add dependency commons-lang3 --- pom.xml | 6 +++--- .../com/gooddata/dataload/processes/ProcessService.java | 2 +- src/main/java/com/gooddata/dataset/DatasetService.java | 2 +- src/main/java/com/gooddata/md/Meta.java | 7 ++++++- src/main/java/com/gooddata/util/TagsSerializer.java | 2 +- src/test/java/com/gooddata/md/ExportImportServiceAT.java | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index ab785c041..02a76cb54 100644 --- a/pom.xml +++ b/pom.xml @@ -282,9 +282,9 @@ 0.9.4 - commons-lang - commons-lang - 2.6 + org.apache.commons + commons-lang3 + 3.5 org.apache.httpcomponents diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index d64ce6294..6cb3e2575 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -44,7 +44,7 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; import static java.util.Collections.emptyList; -import static org.apache.commons.lang.Validate.isTrue; +import static org.apache.commons.lang3.Validate.isTrue; /** * Service to manage dataload processes and process executions. diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 0c559612c..53ef7ecda 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -14,7 +14,7 @@ import com.gooddata.gdc.*; import com.gooddata.gdc.AboutLinks.Link; import com.gooddata.project.Project; -import org.apache.commons.lang.RandomStringUtils; +import org.apache.commons.lang3.RandomStringUtils; import org.springframework.http.client.ClientHttpResponse; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index 5354cef71..d528dad7d 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -17,7 +17,7 @@ import java.io.Serializable; import java.util.Set; -import static org.apache.commons.lang.StringUtils.substring; +import static org.apache.commons.lang3.StringUtils.substring; /** * Metadata meta information (meant just for internal SDK usage) @@ -240,4 +240,9 @@ public Boolean isSharedWithSomeone() { public void setSharedWithSomeone(final Boolean sharedWithSomeone) { this.sharedWithSomeone = sharedWithSomeone; } + + @Override + public String toString() { + return GoodDataToStringBuilder.toStringExclude(this); + } } diff --git a/src/main/java/com/gooddata/util/TagsSerializer.java b/src/main/java/com/gooddata/util/TagsSerializer.java index 06e76f7a3..a1b541101 100644 --- a/src/main/java/com/gooddata/util/TagsSerializer.java +++ b/src/main/java/com/gooddata/util/TagsSerializer.java @@ -8,7 +8,7 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.util.Set; diff --git a/src/test/java/com/gooddata/md/ExportImportServiceAT.java b/src/test/java/com/gooddata/md/ExportImportServiceAT.java index a09bad008..39418f826 100644 --- a/src/test/java/com/gooddata/md/ExportImportServiceAT.java +++ b/src/test/java/com/gooddata/md/ExportImportServiceAT.java @@ -15,7 +15,7 @@ import com.gooddata.model.ModelService; import com.gooddata.project.Environment; import com.gooddata.project.Project; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; From d8c124e3470a821d1f3aa8caa08a8e1be27aa355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Wed, 14 Dec 2016 11:09:08 +0100 Subject: [PATCH 0467/1191] add reasonable toString implementations to domain objects --- pom.xml | 6 + .../java/com/gooddata/account/Account.java | 6 + .../com/gooddata/connector/Integration.java | 6 + .../connector/IntegrationProcessStatus.java | 6 + .../java/com/gooddata/connector/Status.java | 5 + .../connector/Zendesk4ProcessExecution.java | 11 ++ .../gooddata/connector/Zendesk4Settings.java | 6 + .../com/gooddata/dataload/OutputStage.java | 6 + .../dataload/processes/DataloadProcess.java | 6 + .../dataload/processes/DataloadProcesses.java | 6 + .../dataload/processes/ProcessExecution.java | 6 + .../processes/ProcessExecutionDetail.java | 6 + .../gooddata/dataload/processes/Schedule.java | 5 + .../com/gooddata/dataset/DatasetManifest.java | 11 ++ .../gooddata/dataset/DatasetManifests.java | 6 + .../java/com/gooddata/dataset/EtlMode.java | 6 + src/main/java/com/gooddata/dataset/Pull.java | 6 + .../java/com/gooddata/dataset/TaskState.java | 6 + .../java/com/gooddata/dataset/Upload.java | 6 + .../gooddata/dataset/UploadStatistics.java | 6 + .../java/com/gooddata/dataset/Uploads.java | 6 + .../com/gooddata/dataset/UploadsInfo.java | 16 ++ .../com/gooddata/featureflag/FeatureFlag.java | 4 +- .../gooddata/featureflag/FeatureFlags.java | 3 +- .../featureflag/ProjectFeatureFlag.java | 11 +- .../featureflag/ProjectFeatureFlags.java | 5 + .../java/com/gooddata/gdc/AboutLinks.java | 11 ++ .../java/com/gooddata/gdc/AbstractMaql.java | 6 +- .../java/com/gooddata/gdc/LinkEntries.java | 11 ++ .../java/com/gooddata/gdc/TaskStatus.java | 5 + .../java/com/gooddata/gdc/UriResponse.java | 3 +- .../java/com/gooddata/md/AbstractObj.java | 6 + src/main/java/com/gooddata/md/Attachment.java | 6 + .../com/gooddata/md/AttributeDisplayForm.java | 11 ++ .../com/gooddata/md/AttributeElement.java | 6 + .../com/gooddata/md/AttributeElements.java | 6 + .../java/com/gooddata/md/AttributeSort.java | 6 + src/main/java/com/gooddata/md/Column.java | 10 ++ .../com/gooddata/md/DashboardAttachment.java | 9 +- .../com/gooddata/md/DataLoadingColumn.java | 16 ++ src/main/java/com/gooddata/md/Dataset.java | 11 ++ src/main/java/com/gooddata/md/Dimension.java | 11 ++ .../java/com/gooddata/md/DisplayForm.java | 16 ++ src/main/java/com/gooddata/md/Entry.java | 5 + src/main/java/com/gooddata/md/Expression.java | 6 + src/main/java/com/gooddata/md/Fact.java | 11 ++ .../com/gooddata/md/IdentifierAndUri.java | 6 + .../java/com/gooddata/md/IdentifierToUri.java | 6 + .../com/gooddata/md/IdentifiersAndUris.java | 6 + src/main/java/com/gooddata/md/InUseMany.java | 6 + src/main/java/com/gooddata/md/Key.java | 6 + src/main/java/com/gooddata/md/MaqlAst.java | 11 ++ src/main/java/com/gooddata/md/Meta.java | 2 +- src/main/java/com/gooddata/md/Metric.java | 11 ++ .../java/com/gooddata/md/NestedAttribute.java | 11 ++ .../com/gooddata/md/ProjectDashboard.java | 16 ++ src/main/java/com/gooddata/md/Query.java | 11 ++ .../com/gooddata/md/ReportAttachment.java | 7 +- .../java/com/gooddata/md/Restriction.java | 7 + .../java/com/gooddata/md/ScheduledMail.java | 9 ++ .../com/gooddata/md/ScheduledMailWhen.java | 6 + src/main/java/com/gooddata/md/Table.java | 11 ++ .../java/com/gooddata/md/TableDataLoad.java | 11 ++ src/main/java/com/gooddata/md/Usage.java | 7 + src/main/java/com/gooddata/md/UseMany.java | 6 + .../java/com/gooddata/md/UseManyEntries.java | 6 + .../md/maintenance/PartialMdArtifact.java | 6 + .../md/maintenance/PartialMdExport.java | 6 + .../md/maintenance/PartialMdExportToken.java | 6 + .../gooddata/md/report/AttributeInGrid.java | 6 + .../java/com/gooddata/md/report/Filter.java | 6 + .../java/com/gooddata/md/report/Grid.java | 6 + .../com/gooddata/md/report/MetricElement.java | 6 + .../java/com/gooddata/md/report/Report.java | 11 ++ .../gooddata/md/report/ReportDefinition.java | 5 + .../md/report/ReportDefinitionContent.java | 6 + .../java/com/gooddata/model/DiffRequest.java | 5 + .../java/com/gooddata/model/ModelDiff.java | 11 ++ .../gooddata/notification/ProjectEvent.java | 6 + .../java/com/gooddata/project/Project.java | 16 ++ .../com/gooddata/project/ProjectTemplate.java | 5 + .../gooddata/project/ProjectTemplates.java | 6 + .../project/ProjectValidationResult.java | 6 + ...ProjectValidationResultGdcTimeElParam.java | 3 +- .../project/ProjectValidationResultItem.java | 11 ++ .../ProjectValidationResultObjectParam.java | 3 +- .../ProjectValidationResultSliElParam.java | 3 +- .../ProjectValidationResultStringParam.java | 3 +- .../project/ProjectValidationResults.java | 5 + .../project/ProjectValidationType.java | 6 + .../gooddata/project/ProjectValidations.java | 6 + .../java/com/gooddata/project/Projects.java | 6 + src/main/java/com/gooddata/project/Role.java | 6 + src/main/java/com/gooddata/project/Roles.java | 6 + src/main/java/com/gooddata/project/User.java | 11 ++ .../gooddata/report/ExecuteDefinition.java | 6 + .../com/gooddata/report/ExecuteReport.java | 6 + .../util/GoodDataToStringBuilder.java | 37 +++++ .../com/gooddata/warehouse/Warehouse.java | 6 + .../gooddata/warehouse/WarehouseSchema.java | 6 + .../com/gooddata/warehouse/WarehouseUser.java | 5 + .../com/gooddata/account/AccountTest.java | 8 + .../IntegrationProcessStatusTest.java | 8 + .../gooddata/connector/IntegrationTest.java | 8 + .../com/gooddata/connector/StatusTest.java | 8 + .../Zendesk4ProcessExecutionTest.java | 8 + .../connector/Zendesk4SettingsTest.java | 8 + .../gooddata/dataload/OutputStageTest.java | 11 +- .../processes/DataloadProcessTest.java | 8 + .../processes/DataloadProcessesTest.java | 9 ++ .../processes/ProcessExecutionDetailTest.java | 9 ++ .../processes/ProcessExecutionTest.java | 9 ++ .../dataload/processes/ScheduleTest.java | 8 + .../gooddata/dataset/DatasetManifestTest.java | 8 + .../java/com/gooddata/dataset/PullTest.java | 8 + .../com/gooddata/dataset/TaskStateTest.java | 9 ++ .../dataset/UploadStatisticsTest.java | 9 ++ .../java/com/gooddata/dataset/UploadTest.java | 9 ++ .../com/gooddata/dataset/UploadsInfoTest.java | 9 ++ .../com/gooddata/dataset/UploadsTest.java | 9 ++ .../featureflag/FeatureFlagsTest.java | 8 + .../featureflag/ProjectFeatureFlagTest.java | 8 + .../com/gooddata/gdc/LinkEntriesTest.java | 9 ++ .../gooddata/md/AttributeDisplayFormTest.java | 9 ++ .../com/gooddata/md/AttributeElementTest.java | 8 + .../com/gooddata/md/AttributeSortTest.java | 8 + src/test/java/com/gooddata/md/ColumnTest.java | 9 ++ .../gooddata/md/DataLoadingColumnTest.java | 9 ++ .../java/com/gooddata/md/DatasetTest.java | 8 + .../java/com/gooddata/md/DimensionTest.java | 8 + .../java/com/gooddata/md/DisplayFormTest.java | 9 ++ src/test/java/com/gooddata/md/EntryTest.java | 9 ++ .../java/com/gooddata/md/ExpressionTest.java | 8 + src/test/java/com/gooddata/md/FactTest.java | 8 + src/test/java/com/gooddata/md/KeyTest.java | 8 + src/test/java/com/gooddata/md/MetaTest.java | 9 ++ src/test/java/com/gooddata/md/MetricTest.java | 9 ++ .../com/gooddata/md/NestedAttributeTest.java | 8 + .../com/gooddata/md/ProjectDashboardTest.java | 8 + src/test/java/com/gooddata/md/QueryTest.java | 8 + .../java/com/gooddata/md/RestrictionTest.java | 7 + .../com/gooddata/md/ScheduledMailTest.java | 8 + .../com/gooddata/md/TableDataLoadTest.java | 9 ++ src/test/java/com/gooddata/md/TableTest.java | 9 ++ .../md/maintenance/PartialMdArtifactTest.java | 8 + .../md/maintenance/PartialMdExportTest.java | 9 ++ .../maintenance/PartialMdExportTokenTest.java | 8 + .../md/report/AttributeInGridTest.java | 9 ++ .../java/com/gooddata/md/report/GridTest.java | 10 ++ .../gooddata/md/report/MetricElementTest.java | 8 + .../report/ReportDefinitionContentTest.java | 10 ++ .../md/report/ReportDefinitionTest.java | 9 ++ .../com/gooddata/md/report/ReportTest.java | 8 + .../com/gooddata/model/ModelDiffTest.java | 8 + .../notification/ProjectEventTest.java | 7 + .../gooddata/project/ProjectTemplateTest.java | 9 ++ .../com/gooddata/project/ProjectTest.java | 8 + .../project/ProjectValidationResultTest.java | 9 ++ .../java/com/gooddata/project/RolesTest.java | 9 ++ .../java/com/gooddata/project/UserTest.java | 9 ++ .../report/ExecuteDefinitionTest.java | 8 + .../gooddata/report/ExecuteReportTest.java | 8 + .../util/GoodDataToStringBuilderTest.java | 149 ++++++++++++++++++ .../warehouse/WarehouseSchemaTest.java | 9 ++ .../com/gooddata/warehouse/WarehouseTest.java | 8 + .../gooddata/warehouse/WarehouseUserTest.java | 9 ++ 166 files changed, 1425 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/gooddata/util/GoodDataToStringBuilder.java create mode 100644 src/test/java/com/gooddata/util/GoodDataToStringBuilderTest.java diff --git a/pom.xml b/pom.xml index 02a76cb54..fdfa513f4 100644 --- a/pom.xml +++ b/pom.xml @@ -376,6 +376,12 @@ 1.3 test + + org.hamcrest + java-hamcrest + 2.0.0.0 + test + net.javacrumbs.json-unit json-unit diff --git a/src/main/java/com/gooddata/account/Account.java b/src/main/java/com/gooddata/account/Account.java index 5e7c2eba6..4b4c731d1 100644 --- a/src/main/java/com/gooddata/account/Account.java +++ b/src/main/java/com/gooddata/account/Account.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; /** @@ -148,4 +149,9 @@ public String getProjects() { static String getId(String uri) { return TEMPLATE.match(uri).get("id"); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this, "password", "verifyPassword"); + } } diff --git a/src/main/java/com/gooddata/connector/Integration.java b/src/main/java/com/gooddata/connector/Integration.java index f63321b69..5c881df34 100644 --- a/src/main/java/com/gooddata/connector/Integration.java +++ b/src/main/java/com/gooddata/connector/Integration.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notEmpty; @@ -78,4 +79,9 @@ public IntegrationProcessStatus getLastSuccessfulProcess() { public IntegrationProcessStatus getRunningProcess() { return runningProcess; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java index e87c4a62b..25701b44e 100644 --- a/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java +++ b/src/main/java/com/gooddata/connector/IntegrationProcessStatus.java @@ -8,6 +8,7 @@ import static com.gooddata.util.Validate.notNullState; import com.fasterxml.jackson.annotation.JsonInclude; +import com.gooddata.util.GoodDataToStringBuilder; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -93,4 +94,9 @@ public String getUri() { public String getId() { return TEMPLATE.match(getUri()).get("process"); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/connector/Status.java b/src/main/java/com/gooddata/connector/Status.java index 63abb44e4..859f83a8a 100644 --- a/src/main/java/com/gooddata/connector/Status.java +++ b/src/main/java/com/gooddata/connector/Status.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 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; @@ -75,4 +76,8 @@ public enum Code { ERROR, USER_ERROR } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java index 5d85cfd6c..2a02faed7 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java +++ b/src/main/java/com/gooddata/connector/Zendesk4ProcessExecution.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import com.gooddata.util.ISODateTimeSerializer; import org.joda.time.DateTime; @@ -77,6 +78,11 @@ public void setDownloadParams(DownloadParams downloadParams) { this.downloadParams = downloadParams; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) public static class DownloadParams { private Boolean useBackup; @@ -125,5 +131,10 @@ public Integer getParallelBatchSeconds() { public void setParallelBatchSeconds(Integer parallelBatchSeconds) { this.parallelBatchSeconds = parallelBatchSeconds; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/connector/Zendesk4Settings.java b/src/main/java/com/gooddata/connector/Zendesk4Settings.java index 7b5ea53e1..13b01959f 100644 --- a/src/main/java/com/gooddata/connector/Zendesk4Settings.java +++ b/src/main/java/com/gooddata/connector/Zendesk4Settings.java @@ -7,6 +7,7 @@ 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; @@ -64,4 +65,9 @@ public ConnectorType getConnectorType() { * Type of Zendesk account. */ public enum Zendesk4Type {plus, enterprise} + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataload/OutputStage.java b/src/main/java/com/gooddata/dataload/OutputStage.java index 0484236cd..c8ec74ea0 100644 --- a/src/main/java/com/gooddata/dataload/OutputStage.java +++ b/src/main/java/com/gooddata/dataload/OutputStage.java @@ -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.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Map; @@ -137,4 +138,9 @@ public String getOutputStageDiffUri() { public String getDataloadProcessUri() { return notNullState(links, "links").get(DATALOAD_PROCESS); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java index 98a954e04..3a978c441 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcess.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.util.CollectionUtils; import org.springframework.web.util.UriTemplate; @@ -149,4 +150,9 @@ public void validateExecutable(final String executable) { throw new IllegalArgumentException("Executable " + executable + " not found in process executables " + getExecutables()); } } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java index 0a4e92c7d..7e00aec88 100644 --- a/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java +++ b/src/main/java/com/gooddata/dataload/processes/DataloadProcesses.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Collection; @@ -39,4 +40,9 @@ class DataloadProcesses { Collection getItems() { return items; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index a7a44eb48..2426599bf 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.HashMap; import java.util.Map; @@ -64,4 +65,9 @@ public Map getHiddenParams() { String getExecutionsUri() { return executionsUri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this, "hiddenParams", "executionsUri"); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java index f2f9550e6..963085e58 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecutionDetail.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.gooddata.gdc.ErrorStructure; +import com.gooddata.util.GoodDataToStringBuilder; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; import org.joda.time.DateTime; @@ -131,4 +132,9 @@ public boolean isSuccess() { public static URI uriFromExecutionUri(URI executionUri) { return URI.create(executionUri.toString() + "/detail"); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 1d3e22337..4fe94cb93 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -6,6 +6,7 @@ package com.gooddata.dataload.processes; import com.fasterxml.jackson.annotation.JsonInclude; +import com.gooddata.util.GoodDataToStringBuilder; import com.gooddata.util.ISODateTimeDeserializer; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; @@ -253,4 +254,8 @@ public String getId() { return TEMPLATE.match(getUri()).get("scheduleId"); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/DatasetManifest.java b/src/main/java/com/gooddata/dataset/DatasetManifest.java index 30656428e..6f6ce8614 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifest.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifest.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.io.InputStream; import java.util.List; @@ -125,6 +126,11 @@ public void setSource(final InputStream source) { this.source = notNull(source, "source"); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this, "source"); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) public static class Part { @@ -197,5 +203,10 @@ public Map getConstraints() { public void setConstraints(Map constraints) { this.constraints = constraints; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/dataset/DatasetManifests.java b/src/main/java/com/gooddata/dataset/DatasetManifests.java index 622c28294..4aaa25329 100644 --- a/src/main/java/com/gooddata/dataset/DatasetManifests.java +++ b/src/main/java/com/gooddata/dataset/DatasetManifests.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -32,4 +33,9 @@ public DatasetManifests(@JsonProperty("dataSetSLIManifestList") Collection getManifests() { return manifests; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/EtlMode.java b/src/main/java/com/gooddata/dataset/EtlMode.java index 65a0162e5..eeb63f16c 100644 --- a/src/main/java/com/gooddata/dataset/EtlMode.java +++ b/src/main/java/com/gooddata/dataset/EtlMode.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; @JsonTypeName("etlMode") @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @@ -38,4 +39,9 @@ public EtlModeType getMode() { public LookupMode getLookup() { return lookup; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/Pull.java b/src/main/java/com/gooddata/dataset/Pull.java index 4d5d98b75..d9c1c49e5 100644 --- a/src/main/java/com/gooddata/dataset/Pull.java +++ b/src/main/java/com/gooddata/dataset/Pull.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; /** @@ -30,4 +31,9 @@ public Pull(String remoteDir) { public String getRemoteDir() { return remoteDir; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/TaskState.java b/src/main/java/com/gooddata/dataset/TaskState.java index c73040024..2fb7b1af2 100644 --- a/src/main/java/com/gooddata/dataset/TaskState.java +++ b/src/main/java/com/gooddata/dataset/TaskState.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; /** * Update Project Data task status (for internal use). @@ -50,4 +51,9 @@ public boolean isSuccess() { public boolean isFinished() { return OK.equals(status) || ERROR.equals(status); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/Upload.java b/src/main/java/com/gooddata/dataset/Upload.java index b834e4fe1..e973aeb11 100644 --- a/src/main/java/com/gooddata/dataset/Upload.java +++ b/src/main/java/com/gooddata/dataset/Upload.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.gooddata.util.BooleanDeserializer; import com.gooddata.util.GDDateTimeDeserializer; +import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; @@ -121,4 +122,9 @@ private UploadMode toUploadMode(Boolean fullUpload) { return fullUpload ? UploadMode.FULL : UploadMode.INCREMENTAL; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/UploadStatistics.java b/src/main/java/com/gooddata/dataset/UploadStatistics.java index 478c36698..b2d2c9c63 100644 --- a/src/main/java/com/gooddata/dataset/UploadStatistics.java +++ b/src/main/java/com/gooddata/dataset/UploadStatistics.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.HashMap; @@ -43,4 +44,9 @@ public int getUploadsCount(String uploadStatus) { return uploadsCount != null ? uploadsCount : 0; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/Uploads.java b/src/main/java/com/gooddata/dataset/Uploads.java index 9b386424c..193947b5e 100644 --- a/src/main/java/com/gooddata/dataset/Uploads.java +++ b/src/main/java/com/gooddata/dataset/Uploads.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -33,4 +34,9 @@ class Uploads { Collection items() { return uploads; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/dataset/UploadsInfo.java b/src/main/java/com/gooddata/dataset/UploadsInfo.java index 4b305d2c1..e59f6aa14 100644 --- a/src/main/java/com/gooddata/dataset/UploadsInfo.java +++ b/src/main/java/com/gooddata/dataset/UploadsInfo.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.md.Meta; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Collection; @@ -59,6 +60,11 @@ DataSet getDataSet(String datasetId) { } } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + /** * Contains information about dataset uploads for one dataset in the project. Information contain: *
    @@ -105,6 +111,11 @@ String getUploadsUri() { String getLastUploadUri() { return lastUpload.uri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } /** @@ -121,5 +132,10 @@ private static class LastUpload { private LastUpload(@JsonProperty("uri") String uri) { this.uri = uri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlag.java b/src/main/java/com/gooddata/featureflag/FeatureFlag.java index a5b008278..e84808f78 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlag.java @@ -7,6 +7,8 @@ import static com.gooddata.util.Validate.notNull; +import com.gooddata.util.GoodDataToStringBuilder; + /** * Feature flag is a boolean flag used for enabling / disabling some specific feature of GoodData platform. * It can be used in various scopes (per project, per project group, per user, global etc.). @@ -50,6 +52,6 @@ public int hashCode() { @Override public String toString() { - return "{name='" + name + '\'' + ", enabled=" + enabled + "}"; + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/featureflag/FeatureFlags.java b/src/main/java/com/gooddata/featureflag/FeatureFlags.java index e57305609..f85eceeb8 100644 --- a/src/main/java/com/gooddata/featureflag/FeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/FeatureFlags.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Iterator; @@ -100,6 +101,6 @@ public int hashCode() { @Override public String toString() { - return "FeatureFlags{" + featureFlags + "}"; + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java index 2b1b0e775..c76dc9dc4 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlag.java @@ -6,6 +6,7 @@ package com.gooddata.featureflag; import com.fasterxml.jackson.annotation.*; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import static com.gooddata.util.Validate.notEmpty; @@ -104,11 +105,7 @@ public int hashCode() { @Override public String toString() { - return "ProjectFeatureFlag{" + - "name='" + name + '\'' + - ", enabled=" + enabled + - ", links=" + links + - '}'; + return GoodDataToStringBuilder.defaultToString(this); } @JsonIgnoreProperties(ignoreUnknown = true) @@ -126,9 +123,7 @@ public String getSelf() { @Override public String toString() { - return "Links{" + - "self='" + self + '\'' + - '}'; + return GoodDataToStringBuilder.defaultToString(this); } } } diff --git a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java index f3db98dc2..2db961853 100644 --- a/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java +++ b/src/main/java/com/gooddata/featureflag/ProjectFeatureFlags.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.*; import com.gooddata.project.Project; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Iterator; @@ -55,4 +56,8 @@ public boolean isEnabled(final String flagName) { return false; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/gdc/AboutLinks.java b/src/main/java/com/gooddata/gdc/AboutLinks.java index de90d6726..b95f46e04 100644 --- a/src/main/java/com/gooddata/gdc/AboutLinks.java +++ b/src/main/java/com/gooddata/gdc/AboutLinks.java @@ -6,6 +6,7 @@ package com.gooddata.gdc; import com.fasterxml.jackson.annotation.*; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.List; @@ -50,6 +51,11 @@ public Collection getLinks() { return links; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + /** * Link with metadata. * Deserialization only. @@ -101,5 +107,10 @@ public String getCategory() { public String getSummary() { return summary; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/gdc/AbstractMaql.java b/src/main/java/com/gooddata/gdc/AbstractMaql.java index e73d53ae3..940436f25 100644 --- a/src/main/java/com/gooddata/gdc/AbstractMaql.java +++ b/src/main/java/com/gooddata/gdc/AbstractMaql.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; /** * Abstract MAQL statement. @@ -31,5 +32,8 @@ public String getMaql() { return maql; } - + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/gdc/LinkEntries.java b/src/main/java/com/gooddata/gdc/LinkEntries.java index 965e0814c..5848c6138 100644 --- a/src/main/java/com/gooddata/gdc/LinkEntries.java +++ b/src/main/java/com/gooddata/gdc/LinkEntries.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -29,6 +30,11 @@ protected List getEntries() { return entries; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) protected static class LinkEntry { private final String uri; @@ -56,5 +62,10 @@ public String getUri() { public String getCategory() { return category; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/gdc/TaskStatus.java b/src/main/java/com/gooddata/gdc/TaskStatus.java index f36dbacdb..e7cdf02ee 100644 --- a/src/main/java/com/gooddata/gdc/TaskStatus.java +++ b/src/main/java/com/gooddata/gdc/TaskStatus.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.Collections; @@ -64,4 +65,8 @@ public boolean isRunning() { return RUNNING.equals(status); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/gdc/UriResponse.java b/src/main/java/com/gooddata/gdc/UriResponse.java index 3c91eadf0..6a84335f2 100644 --- a/src/main/java/com/gooddata/gdc/UriResponse.java +++ b/src/main/java/com/gooddata/gdc/UriResponse.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Response containing URI string. @@ -32,6 +33,6 @@ public String getUri() { @Override public String toString() { - return uri; + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/md/AbstractObj.java b/src/main/java/com/gooddata/md/AbstractObj.java index a3b753cbe..56930221a 100644 --- a/src/main/java/com/gooddata/md/AbstractObj.java +++ b/src/main/java/com/gooddata/md/AbstractObj.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.DateTime; import java.util.Set; @@ -156,4 +157,9 @@ protected static String[] uris(T... objs) { return uris; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + } diff --git a/src/main/java/com/gooddata/md/Attachment.java b/src/main/java/com/gooddata/md/Attachment.java index a22988efe..e258dd67a 100644 --- a/src/main/java/com/gooddata/md/Attachment.java +++ b/src/main/java/com/gooddata/md/Attachment.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.gooddata.util.GoodDataToStringBuilder; /** * Common ancestor to {@link ScheduledMail} attachments. @@ -48,4 +49,9 @@ public boolean equals(Object o) { public int hashCode() { return uri != null ? uri.hashCode() : 0; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/AttributeDisplayForm.java b/src/main/java/com/gooddata/md/AttributeDisplayForm.java index c0cbb6f87..7de6e2e53 100644 --- a/src/main/java/com/gooddata/md/AttributeDisplayForm.java +++ b/src/main/java/com/gooddata/md/AttributeDisplayForm.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; /** * Display form of attribute @@ -44,6 +45,11 @@ public boolean isDefault() { return Boolean.TRUE.equals(content.isDefault()); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content extends DisplayForm.Content { @@ -62,5 +68,10 @@ private Content(@JsonProperty("formOf") String formOf, @JsonProperty("expression public Boolean isDefault() { return isDefault; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/AttributeElement.java b/src/main/java/com/gooddata/md/AttributeElement.java index 04ec0f850..4e9794276 100644 --- a/src/main/java/com/gooddata/md/AttributeElement.java +++ b/src/main/java/com/gooddata/md/AttributeElement.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Represent one element of attribute values @@ -55,4 +56,9 @@ public int hashCode() { result = 31 * result + (title != null ? title.hashCode() : 0); return result; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/AttributeElements.java b/src/main/java/com/gooddata/md/AttributeElements.java index 6f2b81177..c379a106b 100644 --- a/src/main/java/com/gooddata/md/AttributeElements.java +++ b/src/main/java/com/gooddata/md/AttributeElements.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.List; @@ -58,4 +59,9 @@ public boolean equals(Object o) { public int hashCode() { return elements != null ? elements.hashCode() : 0; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/AttributeSort.java b/src/main/java/com/gooddata/md/AttributeSort.java index d00956326..9f83bbb1b 100644 --- a/src/main/java/com/gooddata/md/AttributeSort.java +++ b/src/main/java/com/gooddata/md/AttributeSort.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.io.IOException; @@ -50,6 +51,11 @@ boolean isLinkType() { return linkType; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + static class Deserializer extends JsonDeserializer { @Override diff --git a/src/main/java/com/gooddata/md/Column.java b/src/main/java/com/gooddata/md/Column.java index 9bfeb9e8c..d9b1a8ca8 100644 --- a/src/main/java/com/gooddata/md/Column.java +++ b/src/main/java/com/gooddata/md/Column.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; /** * Represents physical data model column. Doesn't implement all fields right now. @@ -88,6 +89,10 @@ public boolean isDisplayForm() { return TYPE_DISPLAY_FORM.equals(getType()); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @@ -114,5 +119,10 @@ public String getColumnDBName() { public String getColumnType() { return columnType; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/DashboardAttachment.java b/src/main/java/com/gooddata/md/DashboardAttachment.java index 8a541280e..83e8c8d54 100644 --- a/src/main/java/com/gooddata/md/DashboardAttachment.java +++ b/src/main/java/com/gooddata/md/DashboardAttachment.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Arrays; import java.util.Collection; @@ -61,13 +62,9 @@ public int hashCode() { return result; } + @Override public String toString() { - return "DashboardAttachment{" + - "uri=" + getUri() + - ", allTabs=" + allTabs + - ", tabs=" + tabs + - ", executionContext='" + executionContext + '\'' + - '}'; + return new GoodDataToStringBuilder(this).append("uri", getUri()).toString(); } } diff --git a/src/main/java/com/gooddata/md/DataLoadingColumn.java b/src/main/java/com/gooddata/md/DataLoadingColumn.java index fe883011b..d7f10371e 100644 --- a/src/main/java/com/gooddata/md/DataLoadingColumn.java +++ b/src/main/java/com/gooddata/md/DataLoadingColumn.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.gooddata.gdc.UriResponse; import com.gooddata.util.BooleanDeserializer; +import com.gooddata.util.GoodDataToStringBuilder; /** * Represents datasets' loading column. @@ -88,6 +89,11 @@ public Integer getSynchronizePrecision() { return content.getColumnSynchronize() != null ? content.getColumnSynchronize().getPrecision() : null; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + private static class Content { private final UriResponse columnUri; @@ -145,6 +151,11 @@ public boolean isColumnNull() { public ColumnSynchronize getColumnSynchronize() { return columnSynchronize; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } private static class ColumnSynchronize { @@ -171,5 +182,10 @@ public Integer getLength() { public Integer getPrecision() { return precision; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Dataset.java b/src/main/java/com/gooddata/md/Dataset.java index b04d7f332..b604e4364 100644 --- a/src/main/java/com/gooddata/md/Dataset.java +++ b/src/main/java/com/gooddata/md/Dataset.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collections; import java.util.List; @@ -113,6 +114,11 @@ public String getUploadConfigurationUri() { return notNullState(links, "links").get(UPLOAD_CONFIGURATION_LINK); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { private final List ties; @@ -162,5 +168,10 @@ public List getAttributes() { public Boolean hasUploadConfiguration() { return hasUploadConfiguration; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Dimension.java b/src/main/java/com/gooddata/md/Dimension.java index a89cdc528..e72b2dc2b 100644 --- a/src/main/java/com/gooddata/md/Dimension.java +++ b/src/main/java/com/gooddata/md/Dimension.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.Collections; @@ -42,6 +43,11 @@ public Collection getAttributes() { return content.getAttributes(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + private static class Content { @JsonProperty("attributes") @@ -55,5 +61,10 @@ public Content(@JsonProperty("attributes") Collection attribute public Collection getAttributes() { return attributes; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/DisplayForm.java b/src/main/java/com/gooddata/md/DisplayForm.java index 2b0d5941a..0c34a079d 100644 --- a/src/main/java/com/gooddata/md/DisplayForm.java +++ b/src/main/java/com/gooddata/md/DisplayForm.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Display form @@ -67,6 +68,11 @@ public String getElementsUri() { return links.getElements(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) protected static class Content { @@ -101,6 +107,11 @@ public String getLdmExpression() { public String getType() { return type; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } @JsonIgnoreProperties(ignoreUnknown = true) @@ -115,6 +126,11 @@ protected Links(@JsonProperty("elements") String elements) { public String getElements() { return elements; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Entry.java b/src/main/java/com/gooddata/md/Entry.java index 361baab7f..685d68aa4 100644 --- a/src/main/java/com/gooddata/md/Entry.java +++ b/src/main/java/com/gooddata/md/Entry.java @@ -154,4 +154,9 @@ public boolean isUnlisted() { public Boolean getUnlisted() { return unlisted; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/Expression.java b/src/main/java/com/gooddata/md/Expression.java index e6582364c..3d098a2ca 100644 --- a/src/main/java/com/gooddata/md/Expression.java +++ b/src/main/java/com/gooddata/md/Expression.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Expression of fact @@ -33,4 +34,9 @@ public String getData() { public String getType() { return type; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/Fact.java b/src/main/java/com/gooddata/md/Fact.java index 06e3c40b1..672ddf1be 100644 --- a/src/main/java/com/gooddata/md/Fact.java +++ b/src/main/java/com/gooddata/md/Fact.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -53,6 +54,11 @@ public Collection getFolders() { return content.getFolders(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { @@ -75,5 +81,10 @@ public Collection getExpression() { public Collection getFolders() { return folders; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/IdentifierAndUri.java b/src/main/java/com/gooddata/md/IdentifierAndUri.java index aa7bfb1d9..bea4c87b4 100644 --- a/src/main/java/com/gooddata/md/IdentifierAndUri.java +++ b/src/main/java/com/gooddata/md/IdentifierAndUri.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Encapsulates identifier and its URI. @@ -30,4 +31,9 @@ public String getIdentifier() { public String getUri() { return uri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/IdentifierToUri.java b/src/main/java/com/gooddata/md/IdentifierToUri.java index df0018534..d9e71f22f 100644 --- a/src/main/java/com/gooddata/md/IdentifierToUri.java +++ b/src/main/java/com/gooddata/md/IdentifierToUri.java @@ -6,6 +6,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -45,4 +46,9 @@ public boolean equals(Object o) { public int hashCode() { return identifiers.hashCode(); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index 922c191bc..dd9a7f790 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.*; @@ -40,4 +41,9 @@ public Map asMap() { } return Collections.unmodifiableMap(identifiersToUris); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/InUseMany.java b/src/main/java/com/gooddata/md/InUseMany.java index 5cf185d03..8cf257c54 100644 --- a/src/main/java/com/gooddata/md/InUseMany.java +++ b/src/main/java/com/gooddata/md/InUseMany.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.HashSet; @@ -97,4 +98,9 @@ public Set getTypes() { public boolean isNearest() { return nearest; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/Key.java b/src/main/java/com/gooddata/md/Key.java index 666f2c39a..01989fe73 100644 --- a/src/main/java/com/gooddata/md/Key.java +++ b/src/main/java/com/gooddata/md/Key.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Key (primary/foreign) of attribute @@ -33,4 +34,9 @@ public String getData() { public String getType() { return type; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/MaqlAst.java b/src/main/java/com/gooddata/md/MaqlAst.java index 5f612ab2b..0e6dfd097 100644 --- a/src/main/java/com/gooddata/md/MaqlAst.java +++ b/src/main/java/com/gooddata/md/MaqlAst.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * MAQL AST representation @@ -57,6 +58,11 @@ public void setValue(final String value) { this.value = value; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + public static class MaqlAstPosition { private final int line; @@ -75,6 +81,11 @@ public int getColumn() { public int getLine() { return line; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Meta.java b/src/main/java/com/gooddata/md/Meta.java index d528dad7d..08ec86ac3 100644 --- a/src/main/java/com/gooddata/md/Meta.java +++ b/src/main/java/com/gooddata/md/Meta.java @@ -243,6 +243,6 @@ public void setSharedWithSomeone(final Boolean sharedWithSomeone) { @Override public String toString() { - return GoodDataToStringBuilder.toStringExclude(this); + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/md/Metric.java b/src/main/java/com/gooddata/md/Metric.java index 3e3062d0d..a79aa44e2 100644 --- a/src/main/java/com/gooddata/md/Metric.java +++ b/src/main/java/com/gooddata/md/Metric.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -61,6 +62,11 @@ public Collection getFolders() { return content.getFolders(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { @@ -109,5 +115,10 @@ public MaqlAst getMaqlAst() { public Collection getFolders() { return folders; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/NestedAttribute.java b/src/main/java/com/gooddata/md/NestedAttribute.java index 72cbce184..c30131477 100644 --- a/src/main/java/com/gooddata/md/NestedAttribute.java +++ b/src/main/java/com/gooddata/md/NestedAttribute.java @@ -6,6 +6,7 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.*; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -169,6 +170,11 @@ public Collection getGrain() { return content.getGrain(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonInclude(JsonInclude.Include.NON_NULL) protected static class Content { private final Collection pk; @@ -306,6 +312,11 @@ public Collection getFolders() { public Collection getGrain() { return grain; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/ProjectDashboard.java b/src/main/java/com/gooddata/md/ProjectDashboard.java index 7fc345144..d6e854062 100644 --- a/src/main/java/com/gooddata/md/ProjectDashboard.java +++ b/src/main/java/com/gooddata/md/ProjectDashboard.java @@ -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.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.Objects; @@ -62,6 +63,11 @@ public Tab getTabByName(String name) { return null; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class Content { @@ -72,6 +78,11 @@ private static class Content { private Content(@JsonProperty("tabs") Collection tabs) { this.tabs = tabs; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } @JsonIgnoreProperties(ignoreUnknown = true) @@ -94,5 +105,10 @@ public String getIdentifier() { public String getTitle() { return title; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Query.java b/src/main/java/com/gooddata/md/Query.java index d97217208..69904b676 100644 --- a/src/main/java/com/gooddata/md/Query.java +++ b/src/main/java/com/gooddata/md/Query.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -51,6 +52,11 @@ public String getTitle() { return meta.getTitle(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class Meta { @@ -77,6 +83,11 @@ public String getSummary() { public String getTitle() { return title; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/ReportAttachment.java b/src/main/java/com/gooddata/md/ReportAttachment.java index c392843ce..7f2590e43 100644 --- a/src/main/java/com/gooddata/md/ReportAttachment.java +++ b/src/main/java/com/gooddata/md/ReportAttachment.java @@ -8,6 +8,7 @@ import com.gooddata.report.ReportExportFormat; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Arrays; import java.util.Collection; @@ -123,10 +124,6 @@ public int hashCode() { @Override public String toString() { - return "ReportAttachment{" + - "uri=" + getUri() + - ", formats=" + formats + - ", exportOptions=" + exportOptions + - '}'; + return new GoodDataToStringBuilder(this).append("uri", getUri()).toString(); } } diff --git a/src/main/java/com/gooddata/md/Restriction.java b/src/main/java/com/gooddata/md/Restriction.java index 2a87eab0d..a5358c0dc 100644 --- a/src/main/java/com/gooddata/md/Restriction.java +++ b/src/main/java/com/gooddata/md/Restriction.java @@ -5,6 +5,8 @@ */ package com.gooddata.md; +import com.gooddata.util.GoodDataToStringBuilder; + /** * Metadata query restriction. See static factory methods to get instance of desired restriction type. */ @@ -57,6 +59,11 @@ public static Restriction summary(String value) { return new Restriction(Type.SUMMARY, value); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + enum Type { IDENTIFIER, TITLE, SUMMARY } diff --git a/src/main/java/com/gooddata/md/ScheduledMail.java b/src/main/java/com/gooddata/md/ScheduledMail.java index 5e8eaaaaf..601d4b8eb 100644 --- a/src/main/java/com/gooddata/md/ScheduledMail.java +++ b/src/main/java/com/gooddata/md/ScheduledMail.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.*; import com.gooddata.md.report.ReportDefinition; import com.gooddata.report.ReportExportFormat; +import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; import java.util.*; @@ -164,6 +165,10 @@ public void setAttachments(Collection attachments) { this.attachments = attachments; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } @JsonIgnore @@ -252,4 +257,8 @@ public ScheduledMail addDashboardAttachment(String uri, Integer allTabs, String return this; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/ScheduledMailWhen.java b/src/main/java/com/gooddata/md/ScheduledMailWhen.java index a60a09545..130ccffc7 100644 --- a/src/main/java/com/gooddata/md/ScheduledMailWhen.java +++ b/src/main/java/com/gooddata/md/ScheduledMailWhen.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.LocalDate; /** @@ -78,4 +79,9 @@ public void setStartDate(LocalDate startDate) { public void setTimeZone(String timeZone) { this.timeZone = timeZone; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/Table.java b/src/main/java/com/gooddata/md/Table.java index 972a668dd..595c4153b 100644 --- a/src/main/java/com/gooddata/md/Table.java +++ b/src/main/java/com/gooddata/md/Table.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -57,6 +58,11 @@ public String getActiveDataLoad() { return content.getActiveDataLoad(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @@ -89,5 +95,10 @@ public Collection getTableDataLoads() { public Integer getWeight() { return weight; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/TableDataLoad.java b/src/main/java/com/gooddata/md/TableDataLoad.java index 3f391bc00..b30eff24f 100644 --- a/src/main/java/com/gooddata/md/TableDataLoad.java +++ b/src/main/java/com/gooddata/md/TableDataLoad.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; /** * Represents data load of physical table. @@ -58,6 +59,11 @@ public String getType() { return content.getTypeOfLoad(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) private static class Content { @@ -77,5 +83,10 @@ public String getDataSourceLocation() { public String getTypeOfLoad() { return typeOfLoad; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/Usage.java b/src/main/java/com/gooddata/md/Usage.java index 6c99cf4a1..9a642eaca 100644 --- a/src/main/java/com/gooddata/md/Usage.java +++ b/src/main/java/com/gooddata/md/Usage.java @@ -5,6 +5,8 @@ */ package com.gooddata.md; +import com.gooddata.util.GoodDataToStringBuilder; + import java.util.Collection; /** @@ -33,4 +35,9 @@ public String getUri() { public Collection getUsedBy() { return usedBy; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/UseMany.java b/src/main/java/com/gooddata/md/UseMany.java index 0a51821a1..bb29a1525 100644 --- a/src/main/java/com/gooddata/md/UseMany.java +++ b/src/main/java/com/gooddata/md/UseMany.java @@ -9,6 +9,7 @@ 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.Collection; @@ -31,4 +32,9 @@ class UseMany { public Collection getUseMany() { return useMany; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/UseManyEntries.java b/src/main/java/com/gooddata/md/UseManyEntries.java index 146a0acc5..224a7939c 100644 --- a/src/main/java/com/gooddata/md/UseManyEntries.java +++ b/src/main/java/com/gooddata/md/UseManyEntries.java @@ -9,6 +9,7 @@ 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.Collection; @@ -34,4 +35,9 @@ public String getUri() { public Collection getEntries() { return entries; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java index c30bd877e..31b8cd20f 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdArtifact.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.*; import com.gooddata.gdc.UriResponse; +import com.gooddata.util.GoodDataToStringBuilder; /** * Partial metadata export result structure. @@ -39,4 +40,9 @@ public String getToken() { private UriResponse getStatus() { return status; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java index 34ebd6f8b..1ab179dc8 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExport.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Collection; @@ -88,4 +89,9 @@ public boolean isCrossDataCenterExport() { public boolean isExportAttributeProperties() { return exportAttributeProperties; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java index a18f9f3e9..c40644321 100644 --- a/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java +++ b/src/main/java/com/gooddata/md/maintenance/PartialMdExportToken.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; /** @@ -113,4 +114,9 @@ public void setUpdateLDMObjects(boolean updateLDMObjects) { public void setImportAttributeProperties(boolean importAttributeProperties) { this.importAttributeProperties = importAttributeProperties; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index 11cd22818..d694499db 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -14,6 +14,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.gooddata.md.Attribute; import com.gooddata.md.DisplayForm; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.ArrayList; import java.util.List; @@ -138,4 +139,9 @@ public String getUri() { public String getAlias() { return alias; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/Filter.java b/src/main/java/com/gooddata/md/report/Filter.java index b13551481..2b5efae31 100644 --- a/src/main/java/com/gooddata/md/report/Filter.java +++ b/src/main/java/com/gooddata/md/report/Filter.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notEmpty; @@ -29,4 +30,9 @@ public Filter(@JsonProperty("expression") final String expression) { public String getExpression() { return expression; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/Grid.java b/src/main/java/com/gooddata/md/report/Grid.java index 764f1b160..8e94fe283 100644 --- a/src/main/java/com/gooddata/md/report/Grid.java +++ b/src/main/java/com/gooddata/md/report/Grid.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; import java.util.Collections; @@ -87,4 +88,9 @@ public Collection> getColumnWidths() { public Map> getSort() { return sort; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/MetricElement.java b/src/main/java/com/gooddata/md/report/MetricElement.java index 3895e3421..7ef741807 100644 --- a/src/main/java/com/gooddata/md/report/MetricElement.java +++ b/src/main/java/com/gooddata/md/report/MetricElement.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.gooddata.md.Metric; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; @@ -81,4 +82,9 @@ public String getFormat() { public String getDrillAcrossStepAttributeDisplayFormUri() { return drillAcrossStepAttributeDisplayFormUri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/Report.java b/src/main/java/com/gooddata/md/report/Report.java index 7b9a75de2..1ff274bce 100644 --- a/src/main/java/com/gooddata/md/report/Report.java +++ b/src/main/java/com/gooddata/md/report/Report.java @@ -15,6 +15,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collection; @@ -58,6 +59,11 @@ public Collection getDomains() { return content.getDomains(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + private static class Content { private final Collection definitions; private final Collection domains; @@ -76,5 +82,10 @@ public Collection getDefinitions() { public Collection getDomains() { return domains; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinition.java b/src/main/java/com/gooddata/md/report/ReportDefinition.java index 4ce2bed10..3957db5ce 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinition.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinition.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Map; @@ -78,4 +79,8 @@ public String getExplainUri() { return notNullState(links, "links").get(EXPLAIN_LINK); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java index e967aed80..8825fcda0 100644 --- a/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java +++ b/src/main/java/com/gooddata/md/report/ReportDefinitionContent.java @@ -9,6 +9,7 @@ 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.Collection; @@ -47,4 +48,9 @@ public Grid getGrid() { public Collection getFilters() { return filters; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/model/DiffRequest.java b/src/main/java/com/gooddata/model/DiffRequest.java index f57e7897a..d3308ae63 100644 --- a/src/main/java/com/gooddata/model/DiffRequest.java +++ b/src/main/java/com/gooddata/model/DiffRequest.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonRawValue; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; @@ -45,4 +46,8 @@ public String getTargetModel() { return targetModel; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/model/ModelDiff.java b/src/main/java/com/gooddata/model/ModelDiff.java index 714fe91eb..fa86ed195 100644 --- a/src/main/java/com/gooddata/model/ModelDiff.java +++ b/src/main/java/com/gooddata/model/ModelDiff.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.Collections; import java.util.List; @@ -101,6 +102,11 @@ private UpdateScript getUpdateScriptByFlags(final boolean preserveData, final bo return result; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + /** * Set of MAQL DDL scripts with one variant of side-effects (truncation of loaded data, drops of related objects...). */ @@ -166,5 +172,10 @@ public Boolean isPreserveData() { public Boolean isCascadeDrops() { return cascadeDrops; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java index 1f1eacd01..93f2a363c 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.HashMap; @@ -85,4 +86,9 @@ public int hashCode() { result = 31 * result + (parameters != null ? parameters.hashCode() : 0); return result; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/Project.java b/src/main/java/com/gooddata/project/Project.java index be003f981..f84723bbc 100644 --- a/src/main/java/com/gooddata/project/Project.java +++ b/src/main/java/com/gooddata/project/Project.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.util.GoodDataToStringBuilder; import org.joda.time.DateTime; import org.springframework.web.util.UriTemplate; @@ -422,6 +423,11 @@ public void setEnvironment(final Environment environment) { setEnvironment(environment.name()); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class ProjectContent { @@ -505,6 +511,11 @@ public String getEnvironment() { public void setEnvironment(final String environment) { this.environment = environment; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } @JsonIgnoreProperties(ignoreUnknown = true) @@ -673,5 +684,10 @@ public String getProjectTemplate() { public void setProjectTemplate(String projectTemplate) { this.projectTemplate = projectTemplate; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/project/ProjectTemplate.java b/src/main/java/com/gooddata/project/ProjectTemplate.java index b8747c586..be5734c22 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplate.java +++ b/src/main/java/com/gooddata/project/ProjectTemplate.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; /** * Project template. @@ -44,4 +45,8 @@ public String getVersion() { return version; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/ProjectTemplates.java b/src/main/java/com/gooddata/project/ProjectTemplates.java index 809edd263..6b8dd0923 100644 --- a/src/main/java/com/gooddata/project/ProjectTemplates.java +++ b/src/main/java/com/gooddata/project/ProjectTemplates.java @@ -9,6 +9,7 @@ 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.Collection; @@ -30,4 +31,9 @@ class ProjectTemplates { public Collection getTemplatesInfo() { return templatesInfo; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResult.java b/src/main/java/com/gooddata/project/ProjectValidationResult.java index a8810d73e..65f2165cf 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResult.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResult.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -96,4 +97,9 @@ public int hashCode() { return result; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java index 5fa88b0bb..d1396c01f 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultGdcTimeElParam.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; import java.util.Objects; @@ -58,6 +59,6 @@ public int hashCode() { @Override public String toString() { - return ids.toString(); + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java index 554b74716..a2986d951 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultItem.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultItem.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -35,6 +36,11 @@ ProjectValidationType getValidation() { return validation; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) private static class Body { @@ -44,5 +50,10 @@ private static class Body { private Body(@JsonProperty("log") List logs) { this.logs = logs; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java index e258d0163..5eabf72b2 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultObjectParam.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; @JsonTypeName("object") @JsonIgnoreProperties(ignoreUnknown = true) @@ -36,7 +37,7 @@ public String getUri() { @Override public String toString() { - return name + " (" + uri + ")"; + return GoodDataToStringBuilder.defaultToString(this); } @Override diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java index 6e7ee0406..0d5b2ca40 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultSliElParam.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.LinkedHashMap; import java.util.List; @@ -109,6 +110,6 @@ public int hashCode() { @Override public String toString() { - return ids + " " + vals; + return GoodDataToStringBuilder.defaultToString(this); } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java index 8e828f5f5..56167a175 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResultStringParam.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; @JsonTypeName("common") @JsonIgnoreProperties(ignoreUnknown = true) @@ -30,7 +31,7 @@ public String getValue() { @Override public String toString() { - return value; + return GoodDataToStringBuilder.defaultToString(this); } @Override diff --git a/src/main/java/com/gooddata/project/ProjectValidationResults.java b/src/main/java/com/gooddata/project/ProjectValidationResults.java index 7c08537e1..995e5569e 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationResults.java +++ b/src/main/java/com/gooddata/project/ProjectValidationResults.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.LinkedList; import java.util.List; @@ -95,4 +96,8 @@ public List getResults() { return results; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/ProjectValidationType.java b/src/main/java/com/gooddata/project/ProjectValidationType.java index 458f11363..bdd5c38a3 100644 --- a/src/main/java/com/gooddata/project/ProjectValidationType.java +++ b/src/main/java/com/gooddata/project/ProjectValidationType.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; +import com.gooddata.util.GoodDataToStringBuilder; /** * Represents project validation type. @@ -49,4 +50,9 @@ public boolean equals(Object o) { public int hashCode() { return value.hashCode(); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/ProjectValidations.java b/src/main/java/com/gooddata/project/ProjectValidations.java index 680d5f870..4b21c8ab7 100644 --- a/src/main/java/com/gooddata/project/ProjectValidations.java +++ b/src/main/java/com/gooddata/project/ProjectValidations.java @@ -9,6 +9,7 @@ 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.HashSet; import java.util.Set; @@ -41,4 +42,9 @@ public Set getValidations() { return validations; } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + } diff --git a/src/main/java/com/gooddata/project/Projects.java b/src/main/java/com/gooddata/project/Projects.java index b768694ec..1992c9e45 100644 --- a/src/main/java/com/gooddata/project/Projects.java +++ b/src/main/java/com/gooddata/project/Projects.java @@ -9,6 +9,7 @@ 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.Collection; @@ -30,4 +31,9 @@ public Projects(@JsonProperty("projects") Collection projects) { public Collection getProjects() { return projects; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index c7846719d..3b190520c 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.annotation.JsonTypeName; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Collections; @@ -130,4 +131,9 @@ public int hashCode() { result = 31 * result + (getIdentifier() != null ? getIdentifier().hashCode() : 0); return result; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/Roles.java b/src/main/java/com/gooddata/project/Roles.java index bf3cf87e1..59bb8f88b 100644 --- a/src/main/java/com/gooddata/project/Roles.java +++ b/src/main/java/com/gooddata/project/Roles.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Set; @@ -34,4 +35,9 @@ class Roles { Set getRoles() { return roles; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/project/User.java b/src/main/java/com/gooddata/project/User.java index 858c24ffd..664e911e5 100644 --- a/src/main/java/com/gooddata/project/User.java +++ b/src/main/java/com/gooddata/project/User.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import java.util.List; @@ -58,6 +59,11 @@ public String getPhoneNumber() { return content.getPhoneNumber(); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) private static class UserContent { @@ -127,5 +133,10 @@ public String getLastName() { public String getLogin() { return login; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } } diff --git a/src/main/java/com/gooddata/report/ExecuteDefinition.java b/src/main/java/com/gooddata/report/ExecuteDefinition.java index 12e352fba..99982b6c7 100644 --- a/src/main/java/com/gooddata/report/ExecuteDefinition.java +++ b/src/main/java/com/gooddata/report/ExecuteDefinition.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; @@ -22,4 +23,9 @@ public ExecuteDefinition(final String reportDefinitionUri) { public String getReportDefinitionUri() { return reportDefinitionUri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/report/ExecuteReport.java b/src/main/java/com/gooddata/report/ExecuteReport.java index d97f9a2fc..2c2b63ede 100644 --- a/src/main/java/com/gooddata/report/ExecuteReport.java +++ b/src/main/java/com/gooddata/report/ExecuteReport.java @@ -7,6 +7,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import com.gooddata.util.GoodDataToStringBuilder; import static com.gooddata.util.Validate.notNull; @@ -22,4 +23,9 @@ public ExecuteReport(final String reportUri) { public String getReportUri() { return reportUri; } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/util/GoodDataToStringBuilder.java b/src/main/java/com/gooddata/util/GoodDataToStringBuilder.java new file mode 100644 index 000000000..a569f38df --- /dev/null +++ b/src/main/java/com/gooddata/util/GoodDataToStringBuilder.java @@ -0,0 +1,37 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.util; + +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.builder.RecursiveToStringStyle; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; + +/** + * GoodDataToStringBuilder enables to create string representation based on fields of an object and exclude specified fields. + * links field is excluded by default. + */ +public class GoodDataToStringBuilder extends ReflectionToStringBuilder { + + private static final String LINKS_FIELD_NAME = "links"; + + public GoodDataToStringBuilder(Object object) { + super(object, RecursiveToStringStyle.SHORT_PREFIX_STYLE); + setExcludeFieldNames(LINKS_FIELD_NAME); + } + + /** + * creates String representation of an object using reflection to get fields of an object. + * links field of an object is ignored by default, allows to specify more fields to be excluded + * + * @param object to create String representation for + * @param excludeFieldNames name of fields of an object to be excluded from String representation + * @return String representation, which excludes links field by default + */ + public static String defaultToString(Object object, String... excludeFieldNames) { + return new GoodDataToStringBuilder(object).setExcludeFieldNames(ArrayUtils.add(excludeFieldNames, LINKS_FIELD_NAME)) + .toString(); + } +} diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 944c64c1f..443b46b3c 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.gooddata.project.Environment; +import com.gooddata.util.GoodDataToStringBuilder; import com.gooddata.util.ISODateTimeDeserializer; import com.gooddata.util.ISODateTimeSerializer; import com.fasterxml.jackson.annotation.JsonCreator; @@ -167,4 +168,9 @@ public String getId() { public boolean isEnabled() { return STATUS_ENABLED.equals(status); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseSchema.java b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java index c8057f630..8b23ef65c 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseSchema.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseSchema.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Map; @@ -68,4 +69,9 @@ public String getUri() { public String getInstanceUri() { return notNullState(links, "links").get(INSTANCE_LINK); } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/main/java/com/gooddata/warehouse/WarehouseUser.java b/src/main/java/com/gooddata/warehouse/WarehouseUser.java index d695e866e..ab4a5cca1 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseUser.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseUser.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.gooddata.util.GoodDataToStringBuilder; import org.springframework.web.util.UriTemplate; import java.util.Map; @@ -85,4 +86,8 @@ public String getUri() { return notNullState(links, "links").get(SELF_LINK); } + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } } diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index 8e5827f92..d428990bb 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class AccountTest { @@ -46,4 +47,11 @@ public void testSerializationOfCreateAccount() { assertThat(account, serializesToJson("/account/create-account.json")); } + @Test + public void testToStringFormat() { + final Account account = new Account(FIRST_NAME, LAST_NAME, null); + + assertThat(account.toString(), matchesPattern(Account.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index c13bc4a47..c3a1224bc 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -20,6 +20,7 @@ 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; import static org.joda.time.DateTime.now; public class IntegrationProcessStatusTest { @@ -100,4 +101,11 @@ public void testIsFailedOnUnknownCode() throws Exception { assertThat(process.isFailed(), is(false)); } + @Test + public void testToStringFormat() { + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); + + assertThat(process.toString(), matchesPattern(IntegrationProcessStatus.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index 00e0dccb2..0fee2cfb9 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class IntegrationTest { @@ -43,4 +44,11 @@ public void testSimplifiedConstructor() throws Exception { assertThat(integration.isActive(), is(true)); } + @Test + public void testToStringFormat() { + final Integration integration = new Integration("template"); + + assertThat(integration.toString(), matchesPattern(Integration.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/StatusTest.java b/src/test/java/com/gooddata/connector/StatusTest.java index d8fa6d8b5..c45eb794f 100644 --- a/src/test/java/com/gooddata/connector/StatusTest.java +++ b/src/test/java/com/gooddata/connector/StatusTest.java @@ -13,6 +13,7 @@ import static com.gooddata.connector.Status.Code.USER_ERROR; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class StatusTest { @@ -66,4 +67,11 @@ public void testIsFailedOnUnknownCode() throws Exception { assertThat(new Status("unknown code", "", "").isFailed(), is(false)); } + @Test + public void testToStringFormat() { + final Status status = new Status("unknown code", "", ""); + + assertThat(status.toString(), matchesPattern(Status.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java index 27edcf41e..dcdfa46cf 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4ProcessExecutionTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class Zendesk4ProcessExecutionTest { @@ -52,4 +53,11 @@ public void testGetDownloadParams() throws Exception { final DownloadParams downloadParams = execution.getDownloadParams(); assertThat(downloadParams, notNullValue()); } + + @Test + public void testToStringFormat() { + final Zendesk4ProcessExecution execution = new Zendesk4ProcessExecution(); + + assertThat(execution.toString(), matchesPattern(Zendesk4ProcessExecution.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java index c47c57315..83cf5aef3 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 org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class Zendesk4SettingsTest { @@ -58,4 +59,11 @@ public void testSetApiUrl() throws Exception { settings.setApiUrl("new url"); assertThat(settings.getApiUrl(), is("new url")); } + + @Test + public void testToStringFormat() { + final Zendesk4Settings settings = new Zendesk4Settings("old url"); + + assertThat(settings.toString(), matchesPattern(Zendesk4Settings.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/OutputStageTest.java b/src/test/java/com/gooddata/dataload/OutputStageTest.java index c03cb1bcd..6d9cf1cd8 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageTest.java +++ b/src/test/java/com/gooddata/dataload/OutputStageTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -66,7 +67,7 @@ public void testDeserialization() throws Exception { assertThat(outputStage.hasOutputStagePrefix(), is(false)); } - @Test(dependsOnMethods = "testDeserialization") + @Test public void testSerializationAfterDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); @@ -76,4 +77,12 @@ public void testSerializationAfterDeserialization() throws Exception { outputStage.setOutputStagePrefix(OUTPUT_STAGE_PREFIX); assertThat(outputStage, serializesToJson("/dataload/outputStageNoProcess.json")); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); + final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + + assertThat(outputStage.toString(), matchesPattern(OutputStage.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index c69796763..cac3617dc 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -42,4 +43,11 @@ public void testSerialization() { final DataloadProcess processWithPath = new DataloadProcess("testProcess", "GROOVY", "/uploads/process.zip"); assertThat(processWithPath, serializesToJson("/dataload/processes/process-input-withPath.json")); } + + @Test + public void testToStringFormat() { + final DataloadProcess process = new DataloadProcess("testProcess", "GROOVY"); + + assertThat(process.toString(), matchesPattern(DataloadProcess.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java index cf77010ef..0aabe61c4 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class DataloadProcessesTest { @@ -24,4 +25,12 @@ public void testDeserialization() throws Exception { assertThat(processes.getItems(), hasSize(1)); } + @Test + public void testToStringFormat() throws Exception { + final DataloadProcesses processes = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), DataloadProcesses.class); + + assertThat(processes.toString(), matchesPattern(DataloadProcesses.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 823d68cdc..467ff2782 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.core.Is.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ProcessExecutionDetailTest { @@ -37,4 +38,12 @@ public void testDeserialization() throws Exception { assertThat(executionDetail.getExecutionUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); } + @Test + public void testToStringFormat() throws Exception { + final ProcessExecutionDetail executionDetail = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/executionDetail.json"), + ProcessExecutionDetail.class); + + assertThat(executionDetail.toString(), matchesPattern(ProcessExecutionDetail.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index 98e698021..c26bc28fd 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -7,6 +7,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -31,4 +32,12 @@ public void testSerialization() throws Exception { assertThat(execution, serializesToJson("/dataload/processes/execution.json")); } + @Test + public void testToStringFormat() throws Exception { + final DataloadProcess process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); + final ProcessExecution execution = new ProcessExecution(process, "test.groovy"); + + assertThat(execution.toString(), matchesPattern(ProcessExecution.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 7a4f89790..00e885592 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -26,6 +26,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; import static org.testng.Assert.fail; @@ -213,4 +214,11 @@ public void testCreateTriggeredScheduleWithNotCreatedSchedule() { final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); new Schedule(process, EXECUTABLE, schedule); } + + @Test + public void testToStringFormat() { + final Schedule schedule = new Schedule(process, EXECUTABLE, "0 0 * * *"); + + assertThat(schedule.toString(), matchesPattern(Schedule.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 4a432d513..c95012832 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -17,6 +17,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class DatasetManifestTest { @@ -94,4 +95,11 @@ public void shouldFailOnSetFileNull() { final DatasetManifest manifest = new DatasetManifest("dataset.name"); manifest.setFile(null); } + + @Test + public void testToStringFormat() { + final DatasetManifest manifest = new DatasetManifest("dataset.name"); + + assertThat(manifest.toString(), matchesPattern(DatasetManifest.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/dataset/PullTest.java b/src/test/java/com/gooddata/dataset/PullTest.java index b99051912..8dc8722ed 100644 --- a/src/test/java/com/gooddata/dataset/PullTest.java +++ b/src/test/java/com/gooddata/dataset/PullTest.java @@ -9,6 +9,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class PullTest { @@ -17,4 +18,11 @@ public void testSerialization() throws Exception { final Pull pull = new Pull("DIR"); assertThat(pull, serializesToJson("/dataset/pull.json")); } + + @Test + public void testToStringFormat() { + final Pull pull = new Pull("DIR"); + + assertThat(pull.toString(), matchesPattern(Pull.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/dataset/TaskStateTest.java b/src/test/java/com/gooddata/dataset/TaskStateTest.java index 593e62845..1927c9344 100644 --- a/src/test/java/com/gooddata/dataset/TaskStateTest.java +++ b/src/test/java/com/gooddata/dataset/TaskStateTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class TaskStateTest { @@ -23,4 +24,12 @@ public void testDeserialize() throws IOException { assertThat(taskState.getStatus(), is("OK")); assertThat(taskState.getMessage(), is("ok message")); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataset/taskStateOK.json"); + TaskState taskState = new ObjectMapper().readValue(stream, TaskState.class); + + assertThat(taskState.toString(), matchesPattern(TaskState.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java index c32cc7de3..f3a2fedfa 100644 --- a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -28,4 +29,12 @@ public void shouldDeserialize() throws Exception { assertThat(uploadStatistics.getUploadsCount("RUNNING"), is(1)); assertThat(uploadStatistics.getUploadsCount("NOT_DEFINED"), is(0)); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-uploads-info.json"); + final UploadStatistics uploadStatistics = new ObjectMapper().readValue(input, UploadStatistics.class); + + assertThat(uploadStatistics.toString(), matchesPattern(UploadStatistics.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadTest.java b/src/test/java/com/gooddata/dataset/UploadTest.java index 56b7727e8..1273b803a 100644 --- a/src/test/java/com/gooddata/dataset/UploadTest.java +++ b/src/test/java/com/gooddata/dataset/UploadTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; @@ -34,4 +35,12 @@ public void shouldDeserialize() throws Exception { assertThat(upload.getSize(), is(130501)); assertThat(upload.getProcessedAt(), is(new DateTime(2016, 4, 8, 12, 55, 25, DateTimeZone.UTC))); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/upload.json"); + final Upload upload = new ObjectMapper().readValue(input, Upload.class); + + assertThat(upload.toString(), matchesPattern(Upload.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index 69bf201ba..ca7c2fead 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -36,4 +37,12 @@ public void shouldDeserialize() throws Exception { public void getDatasetUploadInfoFails() throws Exception { new UploadsInfo(Collections.emptyList()).getDataSet("dataset.non_existing_one"); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); + final UploadsInfo uploadsInfo = new ObjectMapper().readValue(input, UploadsInfo.class); + + assertThat(uploadsInfo.toString(), matchesPattern(UploadsInfo.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java index 66dd73797..0b1044b8f 100644 --- a/src/test/java/com/gooddata/dataset/UploadsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; @@ -27,4 +28,12 @@ public void shouldDeserialize() throws Exception { assertThat(uploads.items(), not(Matchers.empty())); assertThat(uploads.items().size(), is(2)); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream input = getClass().getResourceAsStream("/dataset/uploads/uploads.json"); + final Uploads uploads = new ObjectMapper().readValue(input, Uploads.class); + + assertThat(uploads.toString(), matchesPattern(Uploads.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java index 9f035fc9f..6e948d845 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagsTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.isOneOf; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; @@ -74,4 +75,11 @@ public void testRemoveFlag() throws Exception { assertFalse(flags.isEnabled("enabledFlag")); assertFalse(flags.iterator().hasNext()); } + + @Test + public void testToStringFormat() { + final FeatureFlags flags = new FeatureFlags(); + + assertThat(flags.toString(), matchesPattern(FeatureFlags.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java index 187af80d2..895af1679 100644 --- a/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java +++ b/src/test/java/com/gooddata/featureflag/ProjectFeatureFlagTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ProjectFeatureFlagTest { @@ -33,4 +34,11 @@ public void testEmptyName() throws Exception { public void testEmptyNameWithValue() throws Exception { new ProjectFeatureFlag(" ", false); } + + @Test + public void testToStringFormat() { + final ProjectFeatureFlag flag = new ProjectFeatureFlag("test", false); + + assertThat(flag.toString(), matchesPattern(ProjectFeatureFlag.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index 0f7390453..b7724377c 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -14,6 +14,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class LinkEntriesTest { @@ -30,4 +31,12 @@ public void testDeserialization() throws Exception { assertThat(linkEntries.getEntries().get(0).getUri(), is("URI")); assertThat(linkEntries.getEntries().get(0).getCategory(), is("tasks-status")); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/gdc/linkEntries.json"); + final LinkEntries linkEntries = new ObjectMapper().readValue(stream, LinkEntries.class); + + assertThat(linkEntries.toString(), matchesPattern(LinkEntries.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 9b8b54455..4324f7b40 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -14,6 +14,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class AttributeDisplayFormTest { @@ -56,4 +57,12 @@ public void shouldSerializeSameAsDeserializationInput() throws Exception { assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-inputOrig.json")); } + @Test + public void testToStringFormat() { + final DisplayForm attrDF = new AttributeDisplayForm("Person Name", FORM_OF, EXPRESSION, DEFAULT, + LDM_EXPRESSION, TYPE, ELEMENTS_LINK); + + assertThat(attrDF.toString(), matchesPattern(AttributeDisplayForm.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/md/AttributeElementTest.java b/src/test/java/com/gooddata/md/AttributeElementTest.java index adda94868..4fa6b4b6b 100644 --- a/src/test/java/com/gooddata/md/AttributeElementTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -29,4 +30,11 @@ public void shouldDeserialize() throws Exception { assertThat(element.getTitle(), is(TITLE)); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/attributeElement.json"); + final AttributeElement element = new ObjectMapper().readValue(stream, AttributeElement.class); + + assertThat(element.toString(), matchesPattern(AttributeElement.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/AttributeSortTest.java b/src/test/java/com/gooddata/md/AttributeSortTest.java index 56e0bd309..a52c86126 100644 --- a/src/test/java/com/gooddata/md/AttributeSortTest.java +++ b/src/test/java/com/gooddata/md/AttributeSortTest.java @@ -7,6 +7,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.JsonMatchers; @@ -41,4 +42,11 @@ public void testDeserializeLink() throws Exception { assertThat(attributeSort, is(notNullValue())); assertThat(attributeSort.getValue(), is("/gdc/md/PROJECT_ID/obj/1806")); } + + @Test + public void testToStringFormat() { + final AttributeSort attributeSort = new AttributeSort("/gdc/md/PROJECT_ID/obj/1806", true); + + assertThat(attributeSort.toString(), matchesPattern(AttributeSort.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 0d85a3352..5d0b9872d 100644 --- a/src/test/java/com/gooddata/md/ColumnTest.java +++ b/src/test/java/com/gooddata/md/ColumnTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -32,4 +33,12 @@ public void shouldDeserialize() throws Exception { assertThat(column.isDisplayForm(), is(false)); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/column.json"); + final Column column = new ObjectMapper().readValue(stream, Column.class); + + assertThat(column.toString(), matchesPattern(Column.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 6defc2e50..933ec30e0 100644 --- a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -9,6 +9,7 @@ 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; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -40,5 +41,13 @@ public void shouldDeserialize() throws Exception { assertThat(column.getSynchronizePrecision(), is(0)); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/dataLoadingColumn.json"); + final DataLoadingColumn column = new ObjectMapper().readValue(stream, DataLoadingColumn.class); + + assertThat(column.toString(), matchesPattern(DataLoadingColumn.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 114e37c73..b85e52743 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -59,4 +60,11 @@ public void shouldSerialize() throws Exception { assertThat(dataset, serializesToJson("/md/dataset-input.json")); } + @Test + public void testToStringFormat() { + final Dataset dataset = new Dataset("Dataset"); + + assertThat(dataset.toString(), matchesPattern(Dataset.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 a4b2047f4..769afbb5a 100644 --- a/src/test/java/com/gooddata/md/DimensionTest.java +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -36,4 +37,11 @@ public void shouldSerialize() throws Exception { assertThat(dimension, serializesToJson("/md/dimension-input.json")); } + + @Test + public void testToStringFormat() { + final Dimension dimension = new Dimension("Dimension"); + + assertThat(dimension.toString(), matchesPattern(Dimension.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 81e15b09f..bf8979d32 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -15,6 +15,7 @@ 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; public class DisplayFormTest { @@ -46,4 +47,12 @@ public void testSerialization() throws Exception { assertThat(displayForm, serializesToJson("/md/displayForm-input.json")); } + @Test + public void testToStringFormat() { + final DisplayForm displayForm = new DisplayForm(new Meta("Person Name"), + new DisplayForm.Content(FORM_OF, EXPRESSION, LDM_EXPRESSION, null), new DisplayForm.Links(ELEMENTS_LINK)); + + assertThat(displayForm.toString(), matchesPattern(DisplayForm.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 176f2e0bf..1174d274c 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -17,6 +17,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class EntryTest { @@ -63,4 +64,12 @@ public void testSerialization() throws Exception { assertThat(entry, serializesToJson("/md/entry.json")); } + @Test + public void testToStringFormat() { + final Entry entry = new Entry(URI, TITLE, SUMMARY, CATEGORY, AUTHOR, CONTRIBUTOR, DEPRECATED, IDENTIFIER, TAGS, + CREATED, UPDATED, LOCKED, UNLISTED); + + assertThat(entry.toString(), matchesPattern(Entry.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index d7db2b6ac..786b2e047 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ExpressionTest { @@ -32,4 +33,11 @@ public void testSerialize() throws Exception { final Expression expression = new Expression(DATA, TYPE); assertThat(MAPPER.writeValueAsString(expression), is(JSON)); } + + @Test + public void testToStringFormat() { + final Expression expression = new Expression(DATA, TYPE); + + assertThat(expression.toString(), matchesPattern(Expression.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 40b09636a..4decd7e40 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class FactTest { @@ -32,4 +33,11 @@ public void testSerialization() throws Exception { assertThat(fact, serializesToJson("/md/fact-input.json")); } + @Test + public void testToStringFormat() { + final Fact fact = new Fact("Person Shoe Size", "/gdc/md/PROJECT_ID/obj/COL_ID", "col", "/gdc/md/PROJECT_ID/obj/FOLDER_ID"); + + assertThat(fact.toString(), matchesPattern(Fact.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 aaec5d682..24be70932 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class KeyTest { @@ -33,4 +34,11 @@ public void testSerialize() throws Exception { final String json = MAPPER.writeValueAsString(key); assertThat(json, is(JSON)); } + + @Test + public void testToStringFormat() { + final Key key = new Key(DATA, TYPE); + + assertThat(key.toString(), matchesPattern(Key.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 8078fa164..c91271be6 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class MetaTest { @@ -66,4 +67,12 @@ public void testSerialization() throws Exception { assertThat(meta, serializesToJson("/md/meta.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); + + assertThat(meta.toString(), matchesPattern(Meta.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index a3ce4160a..7e16e70b5 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -12,6 +12,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import org.testng.annotations.Test; @@ -66,4 +67,12 @@ public void shouldIgnoreLinksProperty() throws Exception { .readValue(getClass().getResourceAsStream("/md/metric-links.json"), Metric.class); assertThat(metric, serializesToJson("/md/metric-out.json")); } + + @Test + public void testToStringFormat() throws Exception { + final Metric metric = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + + assertThat(metric.toString(), matchesPattern(Metric.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 9098a0218..302a70c9b 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; @@ -56,4 +57,11 @@ public void testDeserialization() throws Exception { assertThat(attribute.getDimensionLink(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); assertThat(attribute.getDimensionUri(), is("/gdc/md/PROJECT_ID/obj/DIM_ID")); } + + @Test + public void testToStringFormat() throws Exception { + final NestedAttribute attribute = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/dimensionAttribute.json"), NestedAttribute.class); + + assertThat(attribute.toString(), matchesPattern(NestedAttribute.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 f83300d39..166d15558 100644 --- a/src/test/java/com/gooddata/md/ProjectDashboardTest.java +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; @@ -31,4 +32,11 @@ public void testDeserialization() throws Exception { assertThat(dashboard.getTabByName("Undefined"), nullValue()); } + + @Test + public void testToStringFormat() throws Exception { + final ProjectDashboard dashboard = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/projectDashboard.json"), ProjectDashboard.class); + + assertThat(dashboard.toString(), matchesPattern(ProjectDashboard.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index 4b29b6dfa..b4963d67f 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class QueryTest { @@ -22,4 +23,11 @@ public void testDeserialization() throws Exception { assertThat(query.getTitle(), is("List of allTypes")); assertThat(query.getSummary(), is("Metadata Query Resources for project 'PROJ_ID'")); } + + @Test + public void testToStringFormat() throws Exception { + final Query query = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/query.json"), Query.class); + + assertThat(query.toString(), matchesPattern(Query.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/RestrictionTest.java b/src/test/java/com/gooddata/md/RestrictionTest.java index da0ad4acf..29a326735 100644 --- a/src/test/java/com/gooddata/md/RestrictionTest.java +++ b/src/test/java/com/gooddata/md/RestrictionTest.java @@ -10,6 +10,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class RestrictionTest { @@ -36,4 +37,10 @@ public void testSummary() throws Exception { assertThat(id.getType(), is(Restriction.Type.SUMMARY)); assertThat(id.getValue(), is("my summary")); } + + @Test + public void testToStringFormat() { + final Restriction id = Restriction.summary("my summary"); + assertThat(id.toString(), matchesPattern(Restriction.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 9f7ac5246..5d845e0d5 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -17,6 +17,7 @@ import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ScheduledMailTest { @@ -64,4 +65,11 @@ public void testSerialization() throws Exception { assertThat(scheduledMail, JsonMatchers.serializesToJson("/md/scheduledMail.json")); } + @Test + public void testToStringFormat() throws Exception { + final ScheduledMail scheduledMail = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/scheduledMail.json"), ScheduledMail.class); + + assertThat(scheduledMail.toString(), matchesPattern(ScheduledMail.class.getSimpleName() + "\\[.*\\]")); + } + } diff --git a/src/test/java/com/gooddata/md/TableDataLoadTest.java b/src/test/java/com/gooddata/md/TableDataLoadTest.java index e73196f97..b00bf22d8 100644 --- a/src/test/java/com/gooddata/md/TableDataLoadTest.java +++ b/src/test/java/com/gooddata/md/TableDataLoadTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -28,4 +29,12 @@ public void shouldDeserialize() throws Exception { assertThat(load.isIncremental(), is(true)); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/tableDataLoad.json"); + final TableDataLoad load = new ObjectMapper().readValue(stream, TableDataLoad.class); + + assertThat(load.toString(), matchesPattern(TableDataLoad.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 adfe2a93c..783cbbf65 100644 --- a/src/test/java/com/gooddata/md/TableTest.java +++ b/src/test/java/com/gooddata/md/TableTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -30,4 +31,12 @@ public void shouldDeserialize() throws Exception { "/gdc/md/PROJECT_ID/obj/625412")); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/md/table.json"); + final Table table = new ObjectMapper().readValue(stream, Table.class); + + assertThat(table.toString(), matchesPattern(Table.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java index 8eae923a2..0da3e56be 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -8,6 +8,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.gdc.UriResponse; @@ -32,4 +33,11 @@ public void shouldSerialize() throws Exception { assertThat(partialMdArtifact, serializesToJson("/md/maintenance/partialMDArtifact.json")); } + + @Test + public void testToStringFormat() { + final PartialMdArtifact partialMdArtifact = new PartialMdArtifact(new UriResponse("/gdc/md/projectId/tasks/taskId/status"), "TOKEN123"); + + assertThat(partialMdArtifact.toString(), matchesPattern(PartialMdArtifact.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java index 308b66bcd..c307aa93c 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTest.java @@ -7,6 +7,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import org.testng.annotations.Test; @@ -32,4 +33,12 @@ public void shouldNotSerializeDefaultValues() { public void testEmptyUris() throws Exception { new PartialMdExport(); } + + @Test + public void testToStringFormat() { + final PartialMdExport partialMdExport = + new PartialMdExport(false, false, "/gdc/md/projectId/obj/123", "/gdc/md/projectId/obj/234"); + + assertThat(partialMdExport.toString(), matchesPattern(PartialMdExport.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java index f31b7957f..218fe2675 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdExportTokenTest.java @@ -7,6 +7,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import org.testng.annotations.Test; @@ -20,4 +21,11 @@ public void shouldSerialize() throws Exception { assertThat(partialMdExportToken, serializesToJson("/md/maintenance/partialMDImport.json")); } + + @Test + public void testToStringFormat() { + final PartialMdExportToken partialMdExportToken = new PartialMdExportToken("TOKEN123"); + + assertThat(partialMdExportToken.toString(), matchesPattern(PartialMdExportToken.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 464fc7e05..c4a581ec9 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -20,6 +20,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -81,4 +82,12 @@ public void testCreateFromDisplayForm() throws Exception { assertThat(attrInGrid.getUri(), is(URI)); assertThat(attrInGrid.getAlias(), is(ALIAS)); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/attributeInGrid.json"); + final AttributeInGrid attr = new ObjectMapper().readValue(is, AttributeInGrid.class); + + assertThat(attr.toString(), matchesPattern(AttributeInGrid.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 de1d7044b..525c84b9e 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -21,6 +21,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class GridTest { @@ -66,4 +67,13 @@ public void testSerialization() throws Exception { assertThat(grid, serializesToJson("/md/report/grid-input.json")); } + + @Test + public void testToStringFormat() throws Exception { + final Grid grid = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/md/report/grid.json"), Grid.class); + + assertThat(grid.toString(), matchesPattern(Grid.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 dc5aa71af..6b337f556 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -15,6 +15,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -52,4 +53,11 @@ public void testCreateFromMetric() throws Exception { assertThat(element.getUri(), is(URI)); assertThat(element.getAlias(), is(ALIAS)); } + + @Test + public void testToStringFormat() { + final MetricElement element = new MetricElement(URI, ALIAS, FORMAT, DRILL_URI); + + assertThat(element.toString(), matchesPattern(MetricElement.class.getSimpleName() + "\\[.*\\]")); + } } \ 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 55d8724ea..2904b949a 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -15,6 +15,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ReportDefinitionContentTest { @@ -35,4 +36,13 @@ public void testSerialization() throws Exception { assertThat(def, serializesToJson("/md/report/gridReportDefinitionContent-input.json")); } + @Test + public void testToStringFormat() { + final ReportDefinitionContent def = new GridReportDefinitionContent( + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); + + assertThat(def.toString(), matchesPattern(GridReportDefinitionContent.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index 421553ef8..b9e61cb89 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -16,6 +16,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ReportDefinitionTest { @@ -41,4 +42,12 @@ public void testSerialization() throws Exception { assertThat(def, serializesToJson("/md/report/oneNumberReportDefinition-input.json")); } + @Test + public void testToStringFormat() throws Exception { + final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinition.json"); + final ReportDefinition def = new ObjectMapper().readValue(is, ReportDefinition.class); + + assertThat(def.toString(), matchesPattern(ReportDefinition.class.getSimpleName() + "\\[.*\\]")); + } + } \ 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 2ce04d5a1..847d09b29 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -13,6 +13,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -43,4 +44,11 @@ public void testSerialization() throws Exception { assertThat(report, serializesToJson("/md/report/report-input.json")); } + @Test + public void testToStringFormat() throws Exception { + final Report report = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/report/report.json"), Report.class); + + assertThat(report.toString(), matchesPattern(Report.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index cac5e5945..e345e5aae 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -18,6 +18,7 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ModelDiffTest { @@ -86,4 +87,11 @@ public void testDeserialization() throws Exception { assertThat(diff.getUpdateScripts().get(0).getMaqlChunks(), contains( "CREATE FOLDER {ffld.employee} VISUAL(TITLE \"Employee\") TYPE FACT;\nCREATE FACT {fact.employee.age} VISUAL(TITLE \"Employee Age\", FOLDER {ffld.employee}) AS {f_employee.f_age};\nALTER DATASET {dataset.employee} ADD {fact.employee.age};\nSYNCHRONIZE {dataset.employee} PRESERVE DATA;")); } + + @Test + public void testToStringFormat() { + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); + + assertThat(diff.toString(), matchesPattern(ModelDiff.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/notification/ProjectEventTest.java b/src/test/java/com/gooddata/notification/ProjectEventTest.java index fc6601808..3d729cbcc 100644 --- a/src/test/java/com/gooddata/notification/ProjectEventTest.java +++ b/src/test/java/com/gooddata/notification/ProjectEventTest.java @@ -7,6 +7,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import org.testng.annotations.Test; @@ -19,4 +20,10 @@ public void testSerialization() { assertThat(projectEvent, serializesToJson("/notification/projectEvent.json")); } + @Test + public void testToStringFormat() { + final ProjectEvent projectEvent = new ProjectEvent("etl.test"); + + assertThat(projectEvent.toString(), matchesPattern(ProjectEvent.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectTemplateTest.java b/src/test/java/com/gooddata/project/ProjectTemplateTest.java index 1ba53c021..a770eec07 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplateTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplateTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ProjectTemplateTest { @@ -24,4 +25,12 @@ public void shouldDeserialize() throws Exception { assertThat(template.getUrn(), is("urn:gooddata:ZendeskAnalytics")); assertThat(template.getVersion(), is("11")); } + + @Test + public void testToStringFormat() throws Exception { + final ProjectTemplate template = new ObjectMapper() + .readValue(getClass().getResource("/project/project-template.json"), ProjectTemplate.class); + + assertThat(template.toString(), matchesPattern(ProjectTemplate.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index cdb0e39b5..7b57e6c8b 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -14,6 +14,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringStartsWith.startsWith; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ProjectTest { @@ -125,4 +126,11 @@ public void testSerializeVerticaProject() throws Exception { assertThat(serializedProject, startsWith("{\"project\"")); assertThat(serializedProject, containsString("\"driver\":\"vertica\"")); } + + @Test + public void testToStringFormat() { + final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); + + assertThat(project.toString(), matchesPattern(Project.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java index b2f7dd1d1..143f5ec99 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -11,6 +11,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ProjectValidationResultTest { @@ -25,4 +26,12 @@ public void testDeserialize() throws Exception { assertThat(log.getParams(), hasSize(7)); } + + @Test + public void testToStringFormat() throws Exception { + final ProjectValidationResult log = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/project/project-validationResultLog.json"), ProjectValidationResult.class); + + assertThat(log.toString(), matchesPattern(ProjectValidationResult.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java index b93225cbc..4d878869c 100644 --- a/src/test/java/com/gooddata/project/RolesTest.java +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -14,6 +14,7 @@ import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class RolesTest { @@ -27,4 +28,12 @@ public void testDeserialization() throws Exception { assertThat(roles.getRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE1")); assertThat(roles.getRoles(), hasItem("/gdc/projects/PROJECT_ID/roles/ROLE2")); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/project/project-roles.json"); + final Roles roles = new ObjectMapper().readValue(stream, Roles.class); + + assertThat(roles.toString(), matchesPattern(Roles.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java index e23d65459..46f48beed 100644 --- a/src/test/java/com/gooddata/project/UserTest.java +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -14,6 +14,7 @@ import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class UserTest { @@ -32,4 +33,12 @@ public void testDeserialization() throws Exception { assertThat(user.getLogin(), is("ateam+ads-testing@gooddata.com")); } + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/project/project-user.json"); + final User user = new ObjectMapper().readValue(stream, User.class); + + assertThat(user.toString(), matchesPattern(User.class.getSimpleName() + "\\[.*\\]")); + } + } \ No newline at end of file diff --git a/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java index 2d3e6e5f4..2803457f4 100644 --- a/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java +++ b/src/test/java/com/gooddata/report/ExecuteDefinitionTest.java @@ -9,6 +9,7 @@ import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ExecuteDefinitionTest { @@ -17,4 +18,11 @@ public void testSerialization() throws Exception { final ReportRequest request = new ExecuteDefinition("DEF-URI"); assertThat(request, JsonMatchers.serializesToJson("/report/executeDefinition.json")); } + + @Test + public void testToStringFormat() { + final ReportRequest request = new ExecuteDefinition("DEF-URI"); + + assertThat(request.toString(), matchesPattern(ExecuteDefinition.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/report/ExecuteReportTest.java b/src/test/java/com/gooddata/report/ExecuteReportTest.java index 493a4b667..fa65c542c 100644 --- a/src/test/java/com/gooddata/report/ExecuteReportTest.java +++ b/src/test/java/com/gooddata/report/ExecuteReportTest.java @@ -9,6 +9,7 @@ import org.testng.annotations.Test; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class ExecuteReportTest { @@ -17,4 +18,11 @@ public void testSerialization() throws Exception { final ReportRequest request = new ExecuteReport("DEF-URI"); assertThat(request, JsonMatchers.serializesToJson("/report/executeReport.json")); } + + @Test + public void testToStringFormat() { + final ReportRequest request = new ExecuteReport("DEF-URI"); + + assertThat(request.toString(), matchesPattern(ExecuteReport.class.getSimpleName() + "\\[.*\\]")); + } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/GoodDataToStringBuilderTest.java b/src/test/java/com/gooddata/util/GoodDataToStringBuilderTest.java new file mode 100644 index 000000000..e3b038e6c --- /dev/null +++ b/src/test/java/com/gooddata/util/GoodDataToStringBuilderTest.java @@ -0,0 +1,149 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.util; + +import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.MatcherAssert.assertThat; + +import org.testng.annotations.Test; + +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * two nested classes have toString() method implemented using {@link GoodDataToStringBuilder} and check if + * output of their toString() methods are as expected + */ +public class GoodDataToStringBuilderTest { + + //static nested classes are denoted with outer class, we need a name of outer class in this test + private static final String OUTER_CLASS_NAME = GoodDataToStringBuilderTest.class.getSimpleName(); + + private static final String TEST_CLASS_NAME = TestClass.class.getSimpleName(); + + private static final String ANOTHER_TEST_CLASS_NAME = AnotherTestClass.class.getSimpleName(); + + private static final String CLASS_WITH_ADDITIONAL_PARAM = ClassWithAdditionalParam.class.getSimpleName(); + + private static final String STRING_FIELD_VALUE = "STRING_FIELD"; + + private static final Long LONG_FIELD_VALUE = 10L; + + private static final List LIST_VALUE = Arrays.asList(1, 2, 3); + + private static final String ANOTHER_TEST_CLASS_STRING_EXPECTED = format("%s.%s[stringField=%s]", + OUTER_CLASS_NAME, ANOTHER_TEST_CLASS_NAME, STRING_FIELD_VALUE); + + @Test + public void testDefaultToStringNonRecursive() throws Exception { + final AnotherTestClass anotherTestClass = new AnotherTestClass(); + + final String toStringResult = anotherTestClass.toString(); + + assertThat(toStringResult, is(notNullValue())); + assertThat(toStringResult, is(ANOTHER_TEST_CLASS_STRING_EXPECTED)); + + } + + /** + * TestClass have field reference to {@link AnotherTestClass} + */ + @Test + public void testDefaultToStringRecursive() { + final TestClass testClass = new TestClass(); + + final String toStringResult = testClass.toString(); + + assertThat(toStringResult, is(notNullValue())); + assertThat(toStringResult, is(format("%s.%s[stringField=%s,longField=%d,list=%s,anotherTestClass=%s]", + OUTER_CLASS_NAME, TEST_CLASS_NAME, STRING_FIELD_VALUE, LONG_FIELD_VALUE, LIST_VALUE.toString(), + ANOTHER_TEST_CLASS_STRING_EXPECTED))); + } + + @Test + public void testToStringIncludeAdditionalParam() { + final ClassWithAdditionalParam classWithAdditionalParam = new ClassWithAdditionalParam(); + + final String toStringResult = classWithAdditionalParam.toString(); + + assertThat(toStringResult, is(notNullValue())); + assertThat(toStringResult, is(format("%s.%s[newField=%s]", + OUTER_CLASS_NAME, CLASS_WITH_ADDITIONAL_PARAM, STRING_FIELD_VALUE))); + } + + static class TestClass { + private Map links = new LinkedHashMap() {{ + put("self", "/gdc/link"); + }}; + private String stringField = STRING_FIELD_VALUE; + private Long longField = LONG_FIELD_VALUE; + private String toBeExcludedField = "SHOULD_NOT_BE_THERE"; + private String anotherToBeExcludedField = "ALSO_SHOULD_NOT_BE_THERE"; + private List list = LIST_VALUE; + private AnotherTestClass anotherTestClass = new AnotherTestClass(); + + public Map getLinks() { + return links; + } + + public String getStringField() { + return stringField; + } + + public Long getLongField() { + return longField; + } + + public String getToBeExcludedField() { + return toBeExcludedField; + } + + public String getAnotherToBeExcludedField() { + return anotherToBeExcludedField; + } + + public List getList() { + return list; + } + + public AnotherTestClass getTestClass2() { + return anotherTestClass; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this, "toBeExcludedField", "anotherToBeExcludedField"); + } + } + + static class AnotherTestClass { + private Map links = new LinkedHashMap() {{ + put("self", "/gdc/link2"); + }}; + + private String stringField = STRING_FIELD_VALUE; + + public String getStringField() { + return stringField; + } + + @Override + public String toString() { + return GoodDataToStringBuilder.defaultToString(this); + } + } + + static class ClassWithAdditionalParam { + @Override + public String toString() { + return new GoodDataToStringBuilder(this).append("newField", STRING_FIELD_VALUE).toString(); + } + } +} diff --git a/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java index fe5f12a85..e8ea543ad 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java @@ -8,6 +8,7 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; @@ -38,4 +39,12 @@ public void testDeserialization() throws Exception { assertThat(warehouseSchema.getDescription(), is(DESCRIPTION)); assertThat(warehouseSchema.getLinks(), is(equalTo(LINKS))); } + + @Test + public void testToStringFormat() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/schema.json"); + final WarehouseSchema warehouseSchema = new ObjectMapper().readValue(stream, WarehouseSchema.class); + + assertThat(warehouseSchema.toString(), matchesPattern(WarehouseSchema.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index bd77c543a..62007685e 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -9,6 +9,7 @@ import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; import com.gooddata.project.Environment; import com.fasterxml.jackson.databind.ObjectMapper; @@ -93,4 +94,11 @@ public void testDeserializationWithNullToken() throws Exception { assertThat(warehouse.getLinks(), is(LINKS)); assertThat(warehouse.getConnectionUrl(), is(CONNECTION_URL)); } + + @Test + public void testToStringFormat() { + final Warehouse warehouse = new Warehouse(TITLE, null, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, CONNECTION_URL, LINKS); + + assertThat(warehouse.toString(), matchesPattern(Warehouse.class.getSimpleName() + "\\[.*\\]")); + } } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index 396397d60..a4555edd3 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -14,6 +14,7 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class WarehouseUserTest { @@ -61,4 +62,12 @@ public void testGetId() throws Exception { final WarehouseUser user = new WarehouseUser(ROLE, PROFILE, LOGIN, LINKS); assertThat(user.getId(), is("{profile-id}")); } + + @Test + public void testToStringFormat() throws Exception { + final WarehouseUser user = new ObjectMapper() + .readValue(getClass().getResourceAsStream("/warehouse/user.json"), WarehouseUser.class); + + assertThat(user.toString(), matchesPattern(WarehouseUser.class.getSimpleName() + "\\[.*\\]")); + } } From a8e8cd0036e0e112b2f49083cc08dccebdd4bccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 19 Dec 2016 20:01:09 +0100 Subject: [PATCH 0468/1191] migrate old constructs to java 8 constructs --- src/main/java/com/gooddata/AbstractService.java | 7 +------ .../dataload/processes/ProcessExecution.java | 4 ++-- .../java/com/gooddata/dataset/DatasetService.java | 7 ++----- .../java/com/gooddata/md/IdentifiersAndUris.java | 7 ++----- src/main/java/com/gooddata/md/MetadataService.java | 9 +++------ .../com/gooddata/md/report/AttributeInGrid.java | 9 +++------ .../com/gooddata/notification/ProjectEvent.java | 2 +- src/main/java/com/gooddata/project/Role.java | 13 ++++--------- .../com/gooddata/warehouse/WarehouseService.java | 2 +- .../gooddata/connector/ProcessExecutionTest.java | 7 +------ .../java/com/gooddata/md/MetadataServiceAT.java | 5 ++--- 11 files changed, 22 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/gooddata/AbstractService.java b/src/main/java/com/gooddata/AbstractService.java index 642d42b32..ef8b170fc 100644 --- a/src/main/java/com/gooddata/AbstractService.java +++ b/src/main/java/com/gooddata/AbstractService.java @@ -35,12 +35,7 @@ public abstract class AbstractService { protected final ObjectMapper mapper = new ObjectMapper(); - private final ResponseExtractor reusableResponseExtractor = new ResponseExtractor() { - @Override - public ClientHttpResponse extractData(final ClientHttpResponse response) throws IOException { - return new ReusableClientHttpResponse(response); - } - }; + private final ResponseExtractor reusableResponseExtractor = ReusableClientHttpResponse::new; /** diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java index 2426599bf..cfa4cf3df 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessExecution.java @@ -32,11 +32,11 @@ public class ProcessExecution { private final Map hiddenParams; public ProcessExecution(DataloadProcess process, String executable) { - this(process, executable, new HashMap(), new HashMap()); + this(process, executable, new HashMap<>(), new HashMap<>()); } public ProcessExecution(DataloadProcess process, String executable, Map params) { - this(process, executable, params, new HashMap()); + this(process, executable, params, new HashMap<>()); } public ProcessExecution(DataloadProcess process, String executable, Map params, Map hiddenParams) { diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 53ef7ecda..eef92c864 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -26,6 +26,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.stream.Collectors; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -223,11 +224,7 @@ protected void onFinish() { */ @Deprecated public Collection listDatasets(Project project) { - final HashSet datasets = new HashSet<>(); - for (final Link link : listDatasetLinks(project)) { - datasets.add(new Dataset(link.getIdentifier(), link.getUri(), link.getTitle())); - } - return datasets; + return listDatasetLinks(project).stream().map(link -> new Dataset(link.getIdentifier(), link.getUri(), link.getTitle())).collect(Collectors.toCollection(HashSet::new)); } /** diff --git a/src/main/java/com/gooddata/md/IdentifiersAndUris.java b/src/main/java/com/gooddata/md/IdentifiersAndUris.java index dd9a7f790..ebb77e500 100644 --- a/src/main/java/com/gooddata/md/IdentifiersAndUris.java +++ b/src/main/java/com/gooddata/md/IdentifiersAndUris.java @@ -10,6 +10,7 @@ import com.gooddata.util.GoodDataToStringBuilder; import java.util.*; +import java.util.stream.Collectors; /** * Encapsulates list of identifiers and their URIs. @@ -27,11 +28,7 @@ class IdentifiersAndUris { } public List getUris() { - final List uris = new ArrayList<>(); - for (IdentifierAndUri idAndUri : identifiersAndUris) { - uris.add(idAndUri.getUri()); - } - return uris; + return identifiersAndUris.stream().map(IdentifierAndUri::getUri).collect(Collectors.toList()); } public Map asMap() { diff --git a/src/main/java/com/gooddata/md/MetadataService.java b/src/main/java/com/gooddata/md/MetadataService.java index b66a6b981..044de2928 100644 --- a/src/main/java/com/gooddata/md/MetadataService.java +++ b/src/main/java/com/gooddata/md/MetadataService.java @@ -16,6 +16,7 @@ import org.springframework.web.client.RestTemplate; import java.util.*; +import java.util.stream.Collectors; import static com.gooddata.util.Validate.noNullElements; import static com.gooddata.util.Validate.notNull; @@ -287,9 +288,7 @@ public Collection findUris(Project project, Restriction... restrictions) { final Collection entries = find(project, cls, restrictions); final Collection result = new ArrayList<>(entries.size()); - for (Entry entry : entries) { - result.add(entry.getUri()); - } + result.addAll(entries.stream().map(Entry::getUri).collect(Collectors.toList())); return result; } @@ -350,9 +349,7 @@ public Collection usedBy(Project project, Collection uris, boolea } final List usages = new ArrayList<>(uris.size()); final Collection useManyEntries = response.getUseMany(); - for (UseManyEntries useMany : useManyEntries) { - usages.add(new Usage(useMany.getUri(), useMany.getEntries())); - } + usages.addAll(useManyEntries.stream().map(useMany -> new Usage(useMany.getUri(), useMany.getEntries())).collect(Collectors.toList())); return usages; } diff --git a/src/main/java/com/gooddata/md/report/AttributeInGrid.java b/src/main/java/com/gooddata/md/report/AttributeInGrid.java index d694499db..ee48bc83e 100644 --- a/src/main/java/com/gooddata/md/report/AttributeInGrid.java +++ b/src/main/java/com/gooddata/md/report/AttributeInGrid.java @@ -18,6 +18,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static com.gooddata.util.Validate.notNull; @@ -73,9 +74,7 @@ public AttributeInGrid(String uri, String alias, List> totals) { notNull(totals, "totals"); for (List totalList : totals) { final List totalStringList = new ArrayList<>(totalList.size()); - for (Total total : totalList) { - totalStringList.add(total.toString()); - } + totalStringList.addAll(totalList.stream().map(Total::toString).collect(Collectors.toList())); this.totals.add(totalStringList); } } @@ -124,9 +123,7 @@ public List> getTotals() { final List> enumTotals = new ArrayList<>(totals.size()); for (List totalList : totals) { final List totalEnumList = new ArrayList<>(totalList.size()); - for (String total : totalList) { - totalEnumList.add(Total.of(total)); - } + totalEnumList.addAll(totalList.stream().map(Total::of).collect(Collectors.toList())); enumTotals.add(totalEnumList); } return enumTotals; diff --git a/src/main/java/com/gooddata/notification/ProjectEvent.java b/src/main/java/com/gooddata/notification/ProjectEvent.java index 93f2a363c..4b4e1f25c 100644 --- a/src/main/java/com/gooddata/notification/ProjectEvent.java +++ b/src/main/java/com/gooddata/notification/ProjectEvent.java @@ -34,7 +34,7 @@ public class ProjectEvent { private final Map parameters; public ProjectEvent(final String type) { - this(type, new HashMap()); + this(type, new HashMap<>()); } public ProjectEvent(final String type, final Map parameters) { diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index 3b190520c..e423d40ff 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Set; +import java.util.stream.Collectors; /** * Project Role @@ -52,9 +53,9 @@ public class Role { Role(@JsonProperty("permissions") final Map permissions, @JsonProperty("meta") final Meta meta, @JsonProperty("links") final Map links) { - this.permissions = permissions == null ? new HashMap() : permissions; + this.permissions = permissions == null ? new HashMap<>() : permissions; this.meta = meta == null ? new Meta(null) : meta; - this.links = links == null ? new HashMap() : links; + this.links = links == null ? new HashMap<>() : links; } /** @@ -72,13 +73,7 @@ public Set getPermissions() { * @return set of granted permissions */ public Set getGrantedPermissions() { - final Set permissions = new HashSet<>(); - for (Entry entry : this.permissions.entrySet()) { - if (entry.getValue()) { - permissions.add(entry.getKey()); - } - } - return permissions; + return permissions.entrySet().stream().filter(Entry::getValue).map(Entry::getKey).collect(Collectors.toSet()); } /** diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 95d9d680c..4538d8189 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -186,7 +186,7 @@ public PageableList listWarehouseUsers(final Warehouse warehouse, final UriComponentsBuilder builder = UriComponentsBuilder.fromUri(WarehouseUsers.TEMPLATE.expand(warehouse.getId())); final URI uri = page.getPageUri(builder); final WarehouseUsers result = restTemplate.getForObject(uri, WarehouseUsers.class); - return result != null ? result : new PageableList(); + return result != null ? result : new PageableList<>(); } catch (GoodDataException | RestClientException e) { throw new GoodDataException("Unable to list users of warehouse " + warehouse.getId(), e); } diff --git a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java index 776644b45..a33984b9b 100644 --- a/src/test/java/com/gooddata/connector/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/connector/ProcessExecutionTest.java @@ -15,12 +15,7 @@ public class ProcessExecutionTest { @Test public void shouldSerialize() throws Exception { - final ProcessExecution execution = new ProcessExecution(){ - @Override - public ConnectorType getConnectorType() { - return ZENDESK4; - } - }; + final ProcessExecution execution = () -> ZENDESK4; assertThat(execution, serializesToJson("/connector/process-execution-empty.json")); } diff --git a/src/test/java/com/gooddata/md/MetadataServiceAT.java b/src/test/java/com/gooddata/md/MetadataServiceAT.java index 86a331a28..5d9f9202d 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceAT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceAT.java @@ -30,6 +30,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; /** * Metadata acceptance tests. @@ -172,9 +173,7 @@ public void getAttributeElements() throws Exception { final List elements = gd.getMetadataService().getAttributeElements(attr); assertThat("there should be 2 elements", elements, hasSize(2)); final Set titles = new HashSet<>(elements.size()); - for (AttributeElement element : elements) { - titles.add(element.getTitle()); - } + titles.addAll(elements.stream().map(AttributeElement::getTitle).collect(Collectors.toList())); assertThat(titles, hasItems("DevOps", "HR")); } } From a22541485c8a4be7ac59802316941aeb62fd602e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 19 Dec 2016 20:01:37 +0100 Subject: [PATCH 0469/1191] redudant toString() call --- src/main/java/com/gooddata/warehouse/WarehouseService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/warehouse/WarehouseService.java b/src/main/java/com/gooddata/warehouse/WarehouseService.java index 4538d8189..74ab47c80 100644 --- a/src/main/java/com/gooddata/warehouse/WarehouseService.java +++ b/src/main/java/com/gooddata/warehouse/WarehouseService.java @@ -350,7 +350,7 @@ public WarehouseSchema getWarehouseSchemaByUri(final String uri) { return restTemplate.getForObject(uri, WarehouseSchema.class); } catch (GoodDataRestException e) { if (HttpStatus.NOT_FOUND.value() == e.getStatusCode()) { - throw new WarehouseSchemaNotFoundException(uri.toString(), e); + throw new WarehouseSchemaNotFoundException(uri, e); } else { throw e; } From d4213e32a90c0803aab49190e8efc27135077ec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 19 Dec 2016 20:02:44 +0100 Subject: [PATCH 0470/1191] redundant type arguments --- .../com/gooddata/connector/IntegrationProcessStatusTest.java | 2 +- .../com/gooddata/md/report/ReportDefinitionContentTest.java | 4 ++-- src/test/java/com/gooddata/model/ModelDiffTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index c3a1224bc..95efece28 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -103,7 +103,7 @@ public void testIsFailedOnUnknownCode() throws Exception { @Test public void testToStringFormat() { - final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); + final IntegrationProcessStatus process = new IntegrationProcessStatus(new Status("unknown code", "", ""), now(), now(), Collections.emptyMap()); assertThat(process.toString(), matchesPattern(IntegrationProcessStatus.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index 2904b949a..a33690ac4 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -39,8 +39,8 @@ public void testSerialization() throws Exception { @Test public void testToStringFormat() { final ReportDefinitionContent def = new GridReportDefinitionContent( - new Grid(Collections.emptyList(), Collections.emptyList(), - Collections.emptyList())); + new Grid(Collections.emptyList(), Collections.emptyList(), + Collections.emptyList())); assertThat(def.toString(), matchesPattern(GridReportDefinitionContent.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index e345e5aae..2a1758b56 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -90,7 +90,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() { - final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); + final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, Collections.emptyList())); assertThat(diff.toString(), matchesPattern(ModelDiff.class.getSimpleName() + "\\[.*\\]")); } From 9132e6707472ef70540c4e220267b612d21858a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 19 Dec 2016 20:13:11 +0100 Subject: [PATCH 0471/1191] replace jackson deprecated methods with their newer variants --- src/main/java/com/gooddata/report/ReportService.java | 4 ++-- src/main/java/com/gooddata/util/BooleanDeserializer.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gooddata/report/ReportService.java b/src/main/java/com/gooddata/report/ReportService.java index a312b88bc..5f39f5073 100644 --- a/src/main/java/com/gooddata/report/ReportService.java +++ b/src/main/java/com/gooddata/report/ReportService.java @@ -122,9 +122,9 @@ private String exportReport(final JsonNode execResult, final ReportExportFormat final ObjectNode root = mapper.createObjectNode(); final ObjectNode child = mapper.createObjectNode(); - child.put("result", execResult); + child.set("result", execResult); child.put("format", format.getValue()); - root.put("result_req", child); + root.set("result_req", child); try { return restTemplate.postForObject(EXPORTING_URI, root, UriResponse.class).getUri(); diff --git a/src/main/java/com/gooddata/util/BooleanDeserializer.java b/src/main/java/com/gooddata/util/BooleanDeserializer.java index 7b69f6b25..4973d26e6 100644 --- a/src/main/java/com/gooddata/util/BooleanDeserializer.java +++ b/src/main/java/com/gooddata/util/BooleanDeserializer.java @@ -5,13 +5,13 @@ */ package com.gooddata.util; +import static com.fasterxml.jackson.databind.JsonMappingException.from; import static com.gooddata.util.Validate.notNull; import com.fasterxml.jackson.databind.JsonNode; 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 java.io.IOException; @@ -31,7 +31,7 @@ public Boolean deserialize(JsonParser jp, DeserializationContext ctx) throws IOE } else if (root.isTextual()) { return "1".equals(root.textValue()); } else { - throw new JsonMappingException("Unknown value of type: " + root.getNodeType(), jp.getCurrentLocation()); + throw from(jp, "Unknown value of type: " + root.getNodeType()); } } From 1af222e40314977f35b096589d92afcbf0289391 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 19 Dec 2016 20:13:35 +0100 Subject: [PATCH 0472/1191] remove unused imports --- src/main/java/com/gooddata/GoodData.java | 1 - src/main/java/com/gooddata/project/Role.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index ed4f3e490..03b7d80d0 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -29,7 +29,6 @@ import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.VersionInfo; import org.springframework.http.MediaType; -import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; diff --git a/src/main/java/com/gooddata/project/Role.java b/src/main/java/com/gooddata/project/Role.java index e423d40ff..624fc9888 100644 --- a/src/main/java/com/gooddata/project/Role.java +++ b/src/main/java/com/gooddata/project/Role.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; From ea0443f8844811a18c3d4ed61a62aeea1d7a1811 Mon Sep 17 00:00:00 2001 From: Matej Kupciha Date: Mon, 2 Jan 2017 17:04:33 +0100 Subject: [PATCH 0473/1191] Use demo applications when deploying ruby processes from git in integration tests These demo applications are available on both production and staging environments. --- .../com/gooddata/dataload/processes/ProcessServiceAT.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 9f491bac7..07af74d45 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -101,17 +101,17 @@ public void updateSchedule() { public void createProcessFromGit() { processAppstore = gd.getProcessService().createProcessFromAppstore(project, new DataloadProcess("sdktest ruby appstore " + System.getenv("BUILD_NUMBER"), ProcessType.RUBY.toString(), - "${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyHello")).get(); + "${PUBLIC_APPSTORE}:branch/demo:/test/HelloApp")).get(); assertThat(processAppstore.getExecutables(), contains("hello.rb")); } @Test(groups = "process", dependsOnMethods = "createProcessFromGit") public void updateProcessFromGit() { - processAppstore.setPath("${PUBLIC_APPSTORE}:tag/prodigy-testing:/test/rubyBonjour"); + processAppstore.setPath("${PUBLIC_APPSTORE}:branch/demo:/test/AhojApp"); processAppstore = gd.getProcessService().updateProcessFromAppstore(processAppstore).get(); - assertThat(processAppstore.getExecutables(), contains("bonjour.rb")); + assertThat(processAppstore.getExecutables(), contains("ahoj.rb")); } public void copy(final String file, final File dir) throws IOException { From 48df861e6e803383399b4373150309d543f297da Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 9 Jan 2017 16:40:16 +0100 Subject: [PATCH 0474/1191] fix: grab all pages before asserting --- .../com/gooddata/warehouse/WarehouseServiceAT.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java index e8d313477..fc2a0df2a 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceAT.java @@ -16,6 +16,7 @@ import org.testng.annotations.Test; import java.util.Collection; +import java.util.LinkedList; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -74,8 +75,17 @@ public void getWarehouse() throws Exception { @Test(groups = "warehouse", dependsOnMethods = "createWarehouse") public void listWarehouses() throws Exception { - final Collection warehouses = service.listWarehouses(); - assertThat(warehouses, hasItem(hasSameIdAs(warehouse))); + final LinkedList result = new LinkedList<>(); + Page page = new PageRequest(1000); + PageableList warehouses; + + do { + warehouses = service.listWarehouses(page); + result.addAll(warehouses); + page = warehouses.getNextPage(); + } while (warehouses.hasNextPage()); + + assertThat(result, hasItem(hasSameIdAs(warehouse))); } @Test(groups = "warehouse", dependsOnMethods = {"createWarehouse", "listWarehouses"}) From 27bf242db08dcf10d084ee9b3a9ade843bb2b7de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Mon, 9 Jan 2017 17:39:36 +0100 Subject: [PATCH 0475/1191] improve PageRequest to be usable as ModelAttribute in Controller --- .../com/gooddata/collections/PageRequest.java | 34 +++++++++++++++++-- .../gooddata/collections/PageRequestTest.java | 17 ++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index 474408f13..64cf2fd80 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -16,8 +16,17 @@ */ public class PageRequest implements Page { - private final String offset; - private final int limit; + public static final Integer DEFAULT_LIMIT = 100; + + private String offset; + private int limit; + + /** + * Creates new page definition with default values + */ + public PageRequest() { + this(null, DEFAULT_LIMIT); + } /** * Creates new page definition with provided values. @@ -48,6 +57,27 @@ public PageRequest(final int limit) { this(null, limit); } + + public String getOffset() { + return offset; + } + + public void setOffset(final String offset) { + this.offset = offset; + } + + public int getLimit() { + return limit; + } + + public int getSanitizedLimit() { + return limit > 0 ? limit : DEFAULT_LIMIT; + } + + public void setLimit(final int limit) { + this.limit = limit; + } + @Override public URI getPageUri(final UriComponentsBuilder uriBuilder) { notNull(uriBuilder, "uriBuilder"); diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index 8667fe972..4d59a2139 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -10,6 +10,7 @@ import java.net.URI; +import static com.gooddata.collections.PageRequest.DEFAULT_LIMIT; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; @@ -59,4 +60,20 @@ public void testUpdateWithPageParamsIdempotency() throws Exception { final String pageUri = uriBuilder3.build().toUriString(); assertThat(pageUri, is("test_uri/{test}?offset=12&limit=10")); } + + @Test + public void testGetPageUriDefaultValue() throws Exception { + final PageRequest pageRequest = new PageRequest(); + final UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUriString("test_uri"); + final URI pageUri = pageRequest.getPageUri(uriBuilder); + assertThat(pageUri, notNullValue()); + assertThat(pageUri.toString(), is("test_uri?limit=100")); + } + + @Test + public void testGetSanitizedLimit() throws Exception { + final PageRequest pageRequest = new PageRequest(); + pageRequest.setLimit(-2); + assertThat(pageRequest.getSanitizedLimit(), is(DEFAULT_LIMIT)); + } } From e6199261f4044d87b8e47a219c406211e3b079ce Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 10 Jan 2017 15:59:50 +0100 Subject: [PATCH 0476/1191] add javadocs links --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2e23bb377..cc858f63e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) +# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Javadocs](http://javadoc.io/badge/com.gooddata/gooddata-java.svg)](http://javadoc.io/doc/com.gooddata/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 @@ -19,9 +19,10 @@ See [releases page](https://github.com/martiner/gooddata-java/releases) for info the [Upgrading Guide](https://github.com/martiner/gooddata-java/wiki/Upgrading-GoodData-Java-SDK) will navigate you through changes between major versions. -See [Wiki](https://github.com/martiner/gooddata-java/wiki) for +See [Javadocs](http://javadoc.io/doc/com.gooddata/gooddata-java) +or [Wiki](https://github.com/martiner/gooddata-java/wiki) for [Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) -and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-GoodData-Java-SDK). +and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-). ### Dependencies From bf8480991dbf05c371769440397616670c551ca2 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Wed, 7 Dec 2016 14:16:39 +0100 Subject: [PATCH 0477/1191] introduce services as beans Enables to register services as spring beans using Bean lite mode. To use this feature register GoodData as bean in xml config and add --- pom.xml | 11 +++--- src/main/java/com/gooddata/GoodData.java | 16 ++++++++ .../spring/GoodDataBeansAsServicesTest.java | 38 +++++++++++++++++++ .../resources/spring/gd-annotationConfig.xml | 14 +++++++ 4 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 src/test/java/com/gooddata/spring/GoodDataBeansAsServicesTest.java create mode 100644 src/test/resources/spring/gd-annotationConfig.xml diff --git a/pom.xml b/pom.xml index fdfa513f4..c5b38016d 100644 --- a/pom.xml +++ b/pom.xml @@ -314,12 +314,14 @@ org.springframework spring-aop - - org.springframework - spring-context - + + org.springframework + spring-context + ${spring.version} + true + com.fasterxml.jackson.core jackson-core @@ -418,7 +420,6 @@ 0.11 test - diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 03b7d80d0..b45aa20b0 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -28,6 +28,7 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.VersionInfo; +import org.springframework.context.annotation.Bean; import org.springframework.http.MediaType; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @@ -303,6 +304,7 @@ public void logout() { * * @return initialized service for project management */ + @Bean public ProjectService getProjectService() { return projectService; } @@ -312,6 +314,7 @@ public ProjectService getProjectService() { * * @return initialized service for account management */ + @Bean public AccountService getAccountService() { return accountService; } @@ -322,6 +325,7 @@ public AccountService getAccountService() { * * @return initialized service for metadata management */ + @Bean public MetadataService getMetadataService() { return metadataService; } @@ -331,6 +335,7 @@ public MetadataService getMetadataService() { * * @return initialized service for model management */ + @Bean public ModelService getModelService() { return modelService; } @@ -340,6 +345,7 @@ public ModelService getModelService() { * * @return initialized service for API root management */ + @Bean public GdcService getGdcService() { return gdcService; } @@ -349,6 +355,7 @@ public GdcService getGdcService() { * * @return initialized service for data store management */ + @Bean public DataStoreService getDataStoreService() { return dataStoreService; } @@ -358,6 +365,7 @@ public DataStoreService getDataStoreService() { * * @return initialized service for dataset management */ + @Bean public DatasetService getDatasetService() { return datasetService; } @@ -367,6 +375,7 @@ public DatasetService getDatasetService() { * * @return initialized service for report management */ + @Bean public ReportService getReportService() { return reportService; } @@ -376,6 +385,7 @@ public ReportService getReportService() { * * @return initialized service for dataload processes management and process executions */ + @Bean public ProcessService getProcessService() { return processService; } @@ -385,6 +395,7 @@ public ProcessService getProcessService() { * * @return initialized service for ADS management */ + @Bean public WarehouseService getWarehouseService() { return warehouseService; } @@ -394,6 +405,7 @@ public WarehouseService getWarehouseService() { * * @return initialized service for connector integration management */ + @Bean public ConnectorService getConnectorService() { return connectorService; } @@ -403,6 +415,7 @@ public ConnectorService getConnectorService() { * * @return initialized service for project notifications management */ + @Bean public NotificationService getNotificationService() { return notificationService; } @@ -412,6 +425,7 @@ public NotificationService getNotificationService() { * * @return initialized service for metadata export/import */ + @Bean public ExportImportService getExportImportService() { return exportImportService; } @@ -421,6 +435,7 @@ public ExportImportService getExportImportService() { * * @return initialized service for feature flag management */ + @Bean public FeatureFlagService getFeatureFlagService() { return featureFlagService; } @@ -430,6 +445,7 @@ public FeatureFlagService getFeatureFlagService() { * * @return initialized service for output stage management */ + @Bean public OutputStageService getOutputStageService() { return outputStageService; } diff --git a/src/test/java/com/gooddata/spring/GoodDataBeansAsServicesTest.java b/src/test/java/com/gooddata/spring/GoodDataBeansAsServicesTest.java new file mode 100644 index 000000000..e22a1de77 --- /dev/null +++ b/src/test/java/com/gooddata/spring/GoodDataBeansAsServicesTest.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * This source code is licensed under the BSD-style license found in the + * LICENSE.txt file in the root directory of this source tree. + */ +package com.gooddata.spring; + +import com.gooddata.GoodData; +import com.gooddata.project.ProjectService; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ClassPathXmlApplicationContext; +import org.testng.annotations.Test; + +import java.lang.reflect.Method; +import java.util.Arrays; + +import static org.testng.Assert.*; + +public class GoodDataBeansAsServicesTest { + + @Test + public void servicesRegisteredFromXmlUsingAnnotationConfig() throws Exception { + final ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/gd-annotationConfig.xml"); + Arrays.stream(GoodData.class.getDeclaredMethods()) + .map(Method::getReturnType) + .filter(rt -> rt.getName().endsWith("Service")) + .forEach(rt -> assertNotNull(context.getBean(rt), "Bean of type " + rt + " should be registered")); + } +} \ No newline at end of file diff --git a/src/test/resources/spring/gd-annotationConfig.xml b/src/test/resources/spring/gd-annotationConfig.xml new file mode 100644 index 000000000..e899861f4 --- /dev/null +++ b/src/test/resources/spring/gd-annotationConfig.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file From ff9505f516a9617a093a0e61ba5449d0099279e0 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 11 Jan 2017 10:10:35 +0100 Subject: [PATCH 0478/1191] fix link in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc858f63e..6da536a83 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ through changes between major versions. See [Javadocs](http://javadoc.io/doc/com.gooddata/gooddata-java) or [Wiki](https://github.com/martiner/gooddata-java/wiki) for [Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) -and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending-). +and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending). ### Dependencies From 4e8e8da4eff6abd2b1dd0a0ffef51366ac25c707 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Wed, 11 Jan 2017 12:48:42 +0100 Subject: [PATCH 0479/1191] add javadoc overview --- src/main/javadoc/overview.html | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/javadoc/overview.html diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html new file mode 100644 index 000000000..ba7525d61 --- /dev/null +++ b/src/main/javadoc/overview.html @@ -0,0 +1,21 @@ + + + +The GoodData Java SDK encapsulates the REST API provided by the GoodData +platform. + +

    + Entry point for GoodData SDK usage is class {@link com.gooddata.GoodData}. +

    + +

    + See Wiki for + Code Examples + and Extensibility How-To. +

    + + \ No newline at end of file From f254cbb8c8c40b6641b39d4984da03780dfb49ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Thu, 19 Jan 2017 15:19:22 +0100 Subject: [PATCH 0480/1191] fix occasional fails of update output stage test --- .../com/gooddata/dataload/OutputStageService.java | 12 +++++++++--- .../com/gooddata/dataload/OutputStageServiceIT.java | 6 ------ .../gooddata/dataload/OutputStageServiceTest.java | 12 +++++++++++- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gooddata/dataload/OutputStageService.java b/src/main/java/com/gooddata/dataload/OutputStageService.java index caa5782b3..4d796d74d 100644 --- a/src/main/java/com/gooddata/dataload/OutputStageService.java +++ b/src/main/java/com/gooddata/dataload/OutputStageService.java @@ -13,6 +13,9 @@ import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.project.Project; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -66,11 +69,14 @@ public OutputStage getOutputStage(final Project project) { public OutputStage updateOutputStage(final OutputStage outputStage) { notNull(outputStage, "outputStage"); try { - restTemplate.put(outputStage.getUri(), outputStage); + HttpEntity outputStageHttpEntity = new HttpEntity<>(outputStage); + ResponseEntity response = restTemplate.exchange(outputStage.getUri(), HttpMethod.PUT, outputStageHttpEntity, OutputStage.class); + if (response.getBody() == null) { + throw new RestClientException("unexpected response body"); + } + return response.getBody(); } catch (GoodDataRestException | RestClientException e) { throw new GoodDataException("Unable to update output stage, uri: " + outputStage.getUri()); } - - return getOutputStageByUri(outputStage.getUri()); } } diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java index 10ef69fe1..a6e593d31 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java @@ -86,12 +86,6 @@ public void shouldUpdateOutputStage() throws Exception { .havingPathEqualTo(outputStage.getUri()) .havingBody(jsonEquals(readStringFromResource(OUTPUT_STAGE_NO_PROCESS))) .respond() - .withStatus(200); - - onRequest() - .havingMethodEqualTo("GET") - .havingPathEqualTo(outputStage.getUri()) - .respond() .withBody(readFromResource(OUTPUT_STAGE_ALL_FIELDS)) .withStatus(200); diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java index 081e4260e..64961660c 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java @@ -8,16 +8,22 @@ import static com.gooddata.util.ResourceUtils.readFromResource; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.core.Is.is; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.mockito.Matchers.any; import static org.hamcrest.MatcherAssert.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.project.Project; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.springframework.http.HttpMethod; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -79,8 +85,12 @@ public void testUpdateOutputStageNullOutputStage() throws Exception { @Test public void testUpdateOutputStage() throws Exception { + ResponseEntity responseEntity = mock(ResponseEntity.class); + when(restTemplate.exchange(eq(outputStage.getUri()), eq(HttpMethod.PUT), any(RequestEntity.class), eq(OutputStage.class))).thenReturn(responseEntity); + doReturn(outputStage).when(responseEntity).getBody(); + outputStageService.updateOutputStage(outputStage); - verify(restTemplate,times(1)).put(outputStage.getUri(), outputStage); + verify(restTemplate, times(1)).exchange(eq(outputStage.getUri()), eq(HttpMethod.PUT), any(RequestEntity.class), eq(OutputStage.class)); } } \ No newline at end of file From 570c74fe30689a3ba4849a5d216ddf0192b91680 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 27 Jan 2017 13:28:00 +0100 Subject: [PATCH 0481/1191] chg: change wording, pronounce the project as official --- README.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6da536a83..267efa107 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Javadocs](http://javadoc.io/badge/com.gooddata/gooddata-java.svg)](http://javadoc.io/doc/com.gooddata/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) -The *GoodData Java SDK* encapsulates the REST API provided by the [GoodData](http://www.gooddata.com) platform. -The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014 -and currently the SDK is transitioned to be an official GoodData project. +The *GoodData Java SDK* encapsulates the REST API of the **GoodData Platform**. +The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014. +It is free and open-source software provided "as-is" under the [BSD License](LICENSE.txt) as an official project by [GoodData Corporation](http://www.gooddata.com). ## Usage @@ -33,10 +33,6 @@ The *GoodData Java SDK* uses: * the *Jackson JSON Processor* version 2.8.* * the *Java Development Kit (JDK)* version 8 or later -## License and conditions - -The *GoodData Java SDK* is free and open-source software provided by GoodData Corporation "as-is" under [BSD License](LICENSE.txt). - ## Development Build the library with `mvn package`, see the From d753396656c9e1fa5aba438576d3bc67699404e5 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 27 Jan 2017 14:36:00 +0100 Subject: [PATCH 0482/1191] chg: rename martiner to gooddata --- CONTRIBUTING.md | 4 ++-- README.md | 16 ++++++++-------- pom.xml | 6 +++--- .../java/com/gooddata/gdc/DataStoreService.java | 6 +++--- src/main/javadoc/overview.html | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8fb045d98..97095c70e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ Below are few **rules, recommendations and best practices** we try to follow whe * Every closed non-rejected pull request and issue must be marked with exactly **one milestone version**. * Issue must be **properly labeled** (bug/enhancement/backward incompatible/...). * Add usage examples of new high level functionality to -[documentation](https://github.com/martiner/gooddata-java/wiki/Code-Examples). +[documentation](https://github.com/gooddata/gooddata-java/wiki/Code-Examples). ## Design @@ -52,7 +52,7 @@ is specific enough. * `remove*()` (i.e. `remove(Project project)`) instead od `delete*()` * Write **integration tests** for services using _[Jadler](https://github.com/jadler-mocking/jadler/wiki)_. * If it is possible write **acceptance tests** to be run with the real backend. -* Update [documentation](https://github.com/martiner/gooddata-java/wiki/Code-Examples) with usage examples. +* Update [documentation](https://github.com/gooddata/gooddata-java/wiki/Code-Examples) with usage examples. ## Best practices * **Test class naming**: diff --git a/README.md b/README.md index 267efa107..b00b7e0c8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# GoodData Java SDK [![Build Status](https://travis-ci.org/martiner/gooddata-java.png?branch=master)](https://travis-ci.org/martiner/gooddata-java) [![Javadocs](http://javadoc.io/badge/com.gooddata/gooddata-java.svg)](http://javadoc.io/doc/com.gooddata/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) +# GoodData Java SDK [![Build Status](https://travis-ci.org/gooddata/gooddata-java.png?branch=master)](https://travis-ci.org/gooddata/gooddata-java) [![Javadocs](http://javadoc.io/badge/com.gooddata/gooddata-java.svg)](http://javadoc.io/doc/com.gooddata/gooddata-java) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.gooddata/gooddata-java) The *GoodData Java SDK* encapsulates the REST API of the **GoodData Platform**. The first version was implemented during the [All Data Hackathon](http://hackathon.gooddata.com) April 10 - 11 2014. @@ -15,14 +15,14 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from 2.2.0 ``` -See [releases page](https://github.com/martiner/gooddata-java/releases) for information about versions and notable changes, -the [Upgrading Guide](https://github.com/martiner/gooddata-java/wiki/Upgrading-GoodData-Java-SDK) will navigate you +See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, +the [Upgrading Guide](https://github.com/gooddata/gooddata-java/wiki/Upgrading-GoodData-Java-SDK) will navigate you through changes between major versions. See [Javadocs](http://javadoc.io/doc/com.gooddata/gooddata-java) -or [Wiki](https://github.com/martiner/gooddata-java/wiki) for -[Code Examples](https://github.com/martiner/gooddata-java/wiki/Code-Examples) -and [Extensibility How-To](https://github.com/martiner/gooddata-java/wiki/Extending). +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). ### Dependencies @@ -36,9 +36,9 @@ The *GoodData Java SDK* uses: ## Development Build the library with `mvn package`, see the -[Testing](https://github.com/martiner/gooddata-java/wiki/Testing) page for different testing methods. +[Testing](https://github.com/gooddata/gooddata-java/wiki/Testing) page for different testing methods. ## Contribute -Found a bug? Please create an [issue](https://github.com/martiner/gooddata-java/issues). Missing functionality? +Found a bug? Please create an [issue](https://github.com/gooddata/gooddata-java/issues). Missing functionality? [Contribute your code](CONTRIBUTING.md). diff --git a/pom.xml b/pom.xml index c5b38016d..ba354ec7d 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ 2.2.1-SNAPSHOT ${project.artifactId} GoodData Java SDK - https://github.com/martiner/gooddata-java + https://github.com/gooddata/gooddata-java org.sonatype.oss @@ -22,8 +22,8 @@ - git@github.com:martiner/gooddata-java.git - scm:git:git@github.com:martiner/gooddata-java.git + git@github.com:gooddata/gooddata-java.git + scm:git:git@github.com:gooddata/gooddata-java.git scm:git:${basedir} diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index 54c4b1baa..bfd75ff57 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -106,7 +106,7 @@ private void upload(URI url, InputStream stream) { if (HttpStatus.INTERNAL_SERVER_ERROR.value() == e.getStatusCode()) { // this error may occur when user issues request to WebDAV before SST and TT were obtained // and WebDAV is deployed on a separate hostname - // see https://github.com/martiner/gooddata-java/wiki/Known-limitations + // see https://github.com/gooddata/gooddata-java/wiki/Known-limitations throw new DataStoreException(createUnAuthRequestWarningMessage(url), e); } else { throw new DataStoreException("Unable to upload to " + url + " got status " + e.getStatusCode(), e); @@ -114,7 +114,7 @@ private void upload(URI url, InputStream stream) { } catch (IOException e) { // this error may occur when user issues request to WebDAV before SST and TT were obtained // and WebDAV deployed on the same hostname - // see https://github.com/martiner/gooddata-java/wiki/Known-limitations + // see https://github.com/gooddata/gooddata-java/wiki/Known-limitations if (e.getCause() instanceof NonRepeatableRequestException) { throw new DataStoreException(createUnAuthRequestWarningMessage(url), e); } else { @@ -125,7 +125,7 @@ private void upload(URI url, InputStream stream) { private String createUnAuthRequestWarningMessage(final URI url) { return "Got 500 while uploading to " + url + "." - + "\nThis can be known limitation, see https://github.com/martiner/gooddata-java/wiki/Known-limitations"; + + "\nThis can be known limitation, see https://github.com/gooddata/gooddata-java/wiki/Known-limitations"; } /** diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html index ba7525d61..cd5b8b207 100644 --- a/src/main/javadoc/overview.html +++ b/src/main/javadoc/overview.html @@ -13,9 +13,9 @@

    - See Wiki for - Code Examples - and Extensibility How-To. + See Wiki for + Code Examples + and Extensibility How-To.

    \ No newline at end of file From 4602547b9060c9b3f7bf89929b411a04288fe4e8 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Jan 2017 10:34:45 +0100 Subject: [PATCH 0483/1191] [maven-release-plugin] prepare release gooddata-java-2.3.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba354ec7d..9ed3975f3 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.2.1-SNAPSHOT + 2.3.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From e2cf8168c20db9906a0a36e465e03f0e3e70dca0 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Jan 2017 10:34:45 +0100 Subject: [PATCH 0484/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9ed3975f3..cfb71affc 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.3.0 + 2.3.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From e3fb985c1ef3f6713bec2082e13d23a160dfbc2d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 30 Jan 2017 12:53:47 +0100 Subject: [PATCH 0485/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b00b7e0c8..365996701 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.2.0 + 2.3.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 9c355d9db1a61e31011f775e88dd0a2c72cb06b8 Mon Sep 17 00:00:00 2001 From: Petr Vales Date: Wed, 8 Feb 2017 12:59:43 +0100 Subject: [PATCH 0486/1191] use endpoint uri in UriPrefixer --- src/main/java/com/gooddata/GoodData.java | 4 +--- .../UriPrefixingClientHttpRequestFactory.java | 17 +++++++++-------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index b45aa20b0..7a575c319 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -220,9 +220,7 @@ static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient htt final UriPrefixingClientHttpRequestFactory factory = new UriPrefixingClientHttpRequestFactory( new HttpComponentsClientHttpRequestFactory(httpClient), - endpoint.getHostname(), - endpoint.getPort(), - endpoint.getProtocol() + endpoint ); final RestTemplate restTemplate = new RestTemplate(factory); restTemplate.setInterceptors(Arrays.asList( diff --git a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java index e3428cf04..a5f17d4e2 100644 --- a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java +++ b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java @@ -8,7 +8,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.client.ClientHttpRequest; import org.springframework.http.client.ClientHttpRequestFactory; -import org.springframework.web.util.UriComponentsBuilder; import java.io.IOException; import java.net.URI; @@ -33,8 +32,7 @@ class UriPrefixingClientHttpRequestFactory implements ClientHttpRequestFactory { * @param uriPrefix the URI for setting hostname and port of all HTTP requests */ UriPrefixingClientHttpRequestFactory(ClientHttpRequestFactory factory, URI uriPrefix) { - this.wrapped = notNull(factory, "factory"); - this.prefixer = new UriPrefixer(uriPrefix); + this(factory, new UriPrefixer(uriPrefix)); } /** @@ -42,12 +40,15 @@ class UriPrefixingClientHttpRequestFactory implements ClientHttpRequestFactory { * and use the given hostname, port, and protocol for all HTTP requests * * @param factory the factory to be wrapped - * @param hostname the hostname for all HTTP requests - * @param port the port for all HTTP requests - * @param protocol the protocol for all HTTP requests + * @param endpoint GoodData Platform's endpoint */ - UriPrefixingClientHttpRequestFactory(ClientHttpRequestFactory factory, String hostname, int port, String protocol) { - this(factory, UriComponentsBuilder.newInstance().scheme(protocol).host(hostname).port(port).build().toUri()); + UriPrefixingClientHttpRequestFactory(ClientHttpRequestFactory factory, GoodDataEndpoint endpoint) { + this(factory, new UriPrefixer(notNull(endpoint, "prefixer").toUri())); + } + + private UriPrefixingClientHttpRequestFactory(final ClientHttpRequestFactory factory, final UriPrefixer prefixer) { + this.wrapped = notNull(factory, "factory"); + this.prefixer = notNull(prefixer, "prefixer"); } @Override From 92e9b866e214f516455f5ffccdc48b27dde54d37 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 10 Feb 2017 15:29:37 +0100 Subject: [PATCH 0487/1191] [maven-release-plugin] prepare release gooddata-java-2.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cfb71affc..9f8423618 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.3.1-SNAPSHOT + 2.4.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 40187e3aab198a0375afb7108eeff99e6be26584 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 10 Feb 2017 15:29:37 +0100 Subject: [PATCH 0488/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9f8423618..3e7907c7e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.0 + 2.4.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From ccd070216725d0b178d834f0326fb45ab5053c12 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 10 Feb 2017 15:37:57 +0100 Subject: [PATCH 0489/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 365996701..6621f77e1 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.3.0 + 2.4.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From dcdc0ee7f6fdef14d1d7555de924fb07aadf508d Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Thu, 2 Mar 2017 21:50:31 +0100 Subject: [PATCH 0490/1191] fix: enable ResponseErrorHandler to read both known gdc error json structures Resolves #395. Custom deserializer for ErrorStructure and descendant GdcError created. Unfortunately it's not possible to deserialize exactly the ErrorStructure instance - the on purpose descendant is returned instead. The ErrorStructure descendants must use JsonDeserializer.None in order to work correctly. --- .../com/gooddata/GoodDataRestException.java | 6 +- .../java/com/gooddata/gdc/ErrorStructure.java | 4 +- .../gdc/ErrorStructureDeserializer.java | 68 ++++++++++++++ src/main/java/com/gooddata/gdc/GdcError.java | 3 + .../gooddata/util/ResponseErrorHandler.java | 10 +- .../util/ResponseErrorHandlerTest.java | 92 +++++++++++++++++++ 6 files changed, 174 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gooddata/gdc/ErrorStructureDeserializer.java create mode 100644 src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 8d5fffdcd..804e72e4f 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -1,11 +1,11 @@ /** - * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * 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 com.gooddata.gdc.GdcError; +import com.gooddata.gdc.ErrorStructure; /** * Signals client or server error during communication with GoodData REST API. @@ -66,7 +66,7 @@ public GoodDataRestException(int statusCode, String requestId, String message, S * @param statusText the HTTP status text of the response * @param error the GoodData REST API error structure */ - public GoodDataRestException(int statusCode, String requestId, String statusText, GdcError error) { + public GoodDataRestException(int statusCode, String requestId, String statusText, ErrorStructure error) { this(statusCode, error != null && error.getRequestId() != null ? error.getRequestId() : requestId, error != null && error.getMessage() != null ? error.getFormattedMessage() : statusText, diff --git a/src/main/java/com/gooddata/gdc/ErrorStructure.java b/src/main/java/com/gooddata/gdc/ErrorStructure.java index 1f10f2a77..7147fb1b5 100644 --- a/src/main/java/com/gooddata/gdc/ErrorStructure.java +++ b/src/main/java/com/gooddata/gdc/ErrorStructure.java @@ -1,5 +1,5 @@ /** - * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * 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. */ @@ -9,6 +9,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import static com.gooddata.util.Validate.notNull; import static java.util.Arrays.copyOf; @@ -18,6 +19,7 @@ * Deserialization only. */ @JsonIgnoreProperties(ignoreUnknown = true) +@JsonDeserialize(using = ErrorStructureDeserializer.class) public class ErrorStructure { protected final String message; protected final Object[] parameters; diff --git a/src/main/java/com/gooddata/gdc/ErrorStructureDeserializer.java b/src/main/java/com/gooddata/gdc/ErrorStructureDeserializer.java new file mode 100644 index 000000000..b5dd73d40 --- /dev/null +++ b/src/main/java/com/gooddata/gdc/ErrorStructureDeserializer.java @@ -0,0 +1,68 @@ +/** + * 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.gdc; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.TreeNode; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.util.TokenBuffer; + +import java.io.IOException; + +/** + * Common deserializer for {@link ErrorStructure} and {@link GdcError}. + */ +class ErrorStructureDeserializer extends JsonDeserializer { + + private static final String GDC_ERROR_TYPE_NAME = "error"; + + @Override + public ErrorStructure deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { + final TokenBuffer tokenBuffer = new TokenBuffer(jp); + tokenBuffer.copyCurrentStructure(jp); + + final TreeNode treeNode = tokenBuffer.asParser().readValueAsTree(); + + Class clazz; + if (treeNode.isObject()) { + if (((ObjectNode) treeNode).has(GDC_ERROR_TYPE_NAME)) { + clazz = GdcError.class; + } else { + clazz = DefaultDeserializerErrorStructure.class; + } + } else { + throw ctxt.mappingException("Unknown type of ErrorStructure"); + } + + final JsonParser nextParser = tokenBuffer.asParser(); + nextParser.nextToken(); // just created parser points before the first token + + return ctxt.readValue(nextParser, clazz); + } + + /** + * This class actually represents deserialized {@link ErrorStructure}. + * We need to override deserializer to break the cycle while deserialize. + */ + @JsonDeserialize(using = None.class) + private static class DefaultDeserializerErrorStructure extends ErrorStructure { + + protected DefaultDeserializerErrorStructure(@JsonProperty("errorClass") String errorClass, + @JsonProperty("component") String component, + @JsonProperty("parameters") Object[] parameters, + @JsonProperty("message") String message, + @JsonProperty("errorCode") String errorCode, + @JsonProperty("errorId") String errorId, + @JsonProperty("trace") String trace, + @JsonProperty("requestId") String requestId) { + super(errorClass, component, parameters, message, errorCode, errorId, trace, requestId); + } + } +} diff --git a/src/main/java/com/gooddata/gdc/GdcError.java b/src/main/java/com/gooddata/gdc/GdcError.java index d524ce845..2a7693392 100644 --- a/src/main/java/com/gooddata/gdc/GdcError.java +++ b/src/main/java/com/gooddata/gdc/GdcError.java @@ -11,6 +11,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeName; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; /** * GoodData REST API error structure. @@ -20,6 +22,7 @@ @JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) @JsonIgnoreProperties(ignoreUnknown = true) @JsonInclude(JsonInclude.Include.NON_NULL) +@JsonDeserialize(using = JsonDeserializer.None.class) public class GdcError extends ErrorStructure { @JsonCreator diff --git a/src/main/java/com/gooddata/util/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java index c9d0a3f72..1abeb2de2 100644 --- a/src/main/java/com/gooddata/util/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -1,12 +1,12 @@ /** - * Copyright (C) 2004-2016, GoodData(R) Corporation. All rights reserved. + * 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.util; import com.gooddata.GoodDataRestException; -import com.gooddata.gdc.GdcError; +import com.gooddata.gdc.ErrorStructure; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.client.DefaultResponseErrorHandler; @@ -24,16 +24,16 @@ */ public class ResponseErrorHandler extends DefaultResponseErrorHandler { - private final HttpMessageConverterExtractor gdcErrorExtractor; + private final HttpMessageConverterExtractor gdcErrorExtractor; public ResponseErrorHandler(List> messageConverters) { - gdcErrorExtractor = new HttpMessageConverterExtractor<>(GdcError.class, + gdcErrorExtractor = new HttpMessageConverterExtractor<>(ErrorStructure.class, noNullElements(messageConverters, "messageConverters")); } @Override public void handleError(ClientHttpResponse response) { - GdcError error = null; + ErrorStructure error = null; try { error = gdcErrorExtractor.extractData(response); } catch (RestClientException | IOException ignored) { diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java new file mode 100644 index 000000000..34d58644e --- /dev/null +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -0,0 +1,92 @@ +/** + * 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.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gooddata.GoodData; +import com.gooddata.GoodDataRestException; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.IOException; + +import static java.util.Collections.singletonList; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import static org.testng.Assert.assertEquals; + +public class ResponseErrorHandlerTest { + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private ResponseErrorHandler responseErrorHandler; + + @BeforeMethod + public void setUp() throws Exception { + responseErrorHandler = new ResponseErrorHandler(singletonList(new MappingJackson2HttpMessageConverter(OBJECT_MAPPER))); + } + + @Test + public void testHandleGdcError() throws Exception { + final ClientHttpResponse response = prepareResponse("/gdc/gdcError.json"); + + final GoodDataRestException exc = assertException(() -> responseErrorHandler.handleError(response)); + + assertThat("GoodDataRestException should have been thrown!", exc, is(notNullValue())); + assertEquals(exc.getStatusCode(), 500); + assertEquals(exc.getRequestId(), "REQ"); + assertEquals(exc.getComponent(), "COMPONENT"); + assertEquals(exc.getErrorClass(), "CLASS"); + assertEquals(exc.getErrorCode(), "CODE"); + assertEquals(exc.getText(), "MSG"); + } + + @Test + public void testHandleErrorStructure() throws Exception { + final ClientHttpResponse response = prepareResponse("/gdc/errorStructure.json"); + + final GoodDataRestException exc = assertException(() -> responseErrorHandler.handleError(response)); + + assertThat("GoodDataRestException should have been thrown!", exc, is(notNullValue())); + assertEquals(exc.getStatusCode(), 500); + assertEquals(exc.getRequestId(), "REQ"); + assertEquals(exc.getComponent(), "COMPONENT"); + assertEquals(exc.getErrorClass(), "CLASS"); + assertEquals(exc.getErrorCode(), "CODE"); + assertEquals(exc.getText(), "MSG PARAM1 PARAM2 3"); + } + + private ClientHttpResponse prepareResponse(String resourcePath) throws IOException { + final ClientHttpResponse response = mock(ClientHttpResponse.class); + when(response.getStatusCode()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR); + when(response.getRawStatusCode()).thenReturn(500); + final HttpHeaders headers = new HttpHeaders(); + headers.set(GoodData.GDC_REQUEST_ID_HEADER, "requestId"); + headers.setContentType(MediaType.APPLICATION_JSON); + when(response.getHeaders()).thenReturn(headers); + when(response.getBody()).thenReturn(getClass().getResourceAsStream(resourcePath)); + + return response; + } + + private static GoodDataRestException assertException(Runnable runnable) { + try { + runnable.run(); + return null; + } catch (GoodDataRestException e) { + return e; + } + } + +} \ No newline at end of file From fe95cf589f3189a02db4c4555135dca57620217b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20=C5=A0tumpf?= Date: Tue, 14 Mar 2017 13:00:26 +0100 Subject: [PATCH 0491/1191] eliminate double escaping in UriPage (fixes #428) --- src/main/java/com/gooddata/collections/UriPage.java | 8 +++++++- src/test/java/com/gooddata/collections/UriPageTest.java | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/collections/UriPage.java b/src/main/java/com/gooddata/collections/UriPage.java index 139b75bbd..7078caa19 100644 --- a/src/main/java/com/gooddata/collections/UriPage.java +++ b/src/main/java/com/gooddata/collections/UriPage.java @@ -7,7 +7,9 @@ import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; +import org.springframework.web.util.UriUtils; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.List; import java.util.Map.Entry; @@ -27,7 +29,11 @@ class UriPage implements Page { * @param pageUri page URI */ public UriPage(final String pageUri) { - this.pageUri = UriComponentsBuilder.fromUriString(notNull(pageUri, "pageUri")).build(); + try { + this.pageUri = UriComponentsBuilder.fromUriString(UriUtils.decode(notNull(pageUri, "pageUri"), "UTF-8")).build(); + } catch (final UnsupportedEncodingException e) { + throw new IllegalStateException(e); + } } /** diff --git a/src/test/java/com/gooddata/collections/UriPageTest.java b/src/test/java/com/gooddata/collections/UriPageTest.java index b0080510a..bb65557eb 100644 --- a/src/test/java/com/gooddata/collections/UriPageTest.java +++ b/src/test/java/com/gooddata/collections/UriPageTest.java @@ -63,4 +63,10 @@ public void testIdempotency() throws Exception { assertThat(components.getQueryParams(), hasEntry("offset", singletonList("god"))); assertThat(components.getQueryParams(), hasEntry("limit", singletonList("10"))); } + + @Test + public void testEncoding() throws Exception { + final UriPage uri = new UriPage("uri?test=foo%20bar"); + assertThat(uri.getPageUri(null).toString(), is("uri?test=foo%20bar")); + } } From 06feb5474d282e89a4b987f0c71e6af43c75e138 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 14 Mar 2017 13:32:47 +0100 Subject: [PATCH 0492/1191] update contributing guide --- CONTRIBUTING.md | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 97095c70e..df24c472b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,9 +3,16 @@ Below are few **rules, recommendations and best practices** we try to follow when developing the _GoodData Java SDK_. ## Paperwork -* Every pull request with non-trivial change must be **associated with an issue**. -* Every closed non-rejected pull request and issue must be marked with exactly **one milestone version**. -* Issue must be **properly labeled** (bug/enhancement/backward incompatible/...). +* The **commit message**: + * must be written in the **imperative mood** + * must clearly **explain rationale** behind this change (describe _why_ you are doing the change rather than _what_ you are changing) +* The **pull request**: + * must be **properly labeled** (trivial/bug/enhancement/backward incompatible/...) + * with non-trivial change must be **[associated with an issue](https://help.github.com/articles/closing-issues-via-commit-messages/)** + * must be marked with exactly one **milestone version** +* The **issue** + * must be **properly labeled** (bug/enhancement/backward incompatible/...). + * must be marked with exactly one **milestone version** * Add usage examples of new high level functionality to [documentation](https://github.com/gooddata/gooddata-java/wiki/Code-Examples). From f6d4043a2006e078cd203ff4a08da5da86466091 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Mar 2017 10:57:26 +0100 Subject: [PATCH 0493/1191] [maven-release-plugin] prepare release gooddata-java-2.4.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3e7907c7e..ba1d57705 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.1-SNAPSHOT + 2.4.1 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 5cef5f93295ae3d06c29849910c8603a64f6480d Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Mar 2017 10:57:27 +0100 Subject: [PATCH 0494/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ba1d57705..036deea6a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.1 + 2.4.2-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 8235d5408c5e64d668d24c7450cf6a2d94e06b0a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 16 Mar 2017 11:03:45 +0100 Subject: [PATCH 0495/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6621f77e1..743664849 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.4.0 + 2.4.1 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From ed211a07ef02a3bba99d96e958026878fd2d8fd2 Mon Sep 17 00:00:00 2001 From: Libor Rysavy Date: Thu, 23 Mar 2017 11:42:02 +0100 Subject: [PATCH 0496/1191] Remove extra string from Implementation-Title --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 036deea6a..082ae922f 100644 --- a/pom.xml +++ b/pom.xml @@ -71,7 +71,7 @@ ${project.description} ${project.version} GoodData - HttpComponents ${project.description} + ${project.description} ${project.version} GoodData com.gooddata From 7401bb38017ea44f5811382a15caa9e0bf7675b4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 3 Apr 2017 13:08:36 +0200 Subject: [PATCH 0497/1191] remove file input/output stream usage, close streams in try block https://www.cloudbees.com/blog/fileinputstream-fileoutputstream-considered-harmful --- .../gooddata/dataload/processes/ProcessService.java | 13 ++++++------- src/main/java/com/gooddata/util/ZipHelper.java | 11 ++++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 6cb3e2575..59bb3e8ce 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -33,12 +33,11 @@ import org.springframework.web.util.UriComponentsBuilder; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; import java.net.URI; +import java.nio.file.Files; import java.util.Collection; import static com.gooddata.util.Validate.notEmpty; @@ -524,7 +523,7 @@ private static URI getProcessesUri(Project project) { private DataloadProcess postProcess(DataloadProcess process, File processData, URI postUri) { File tempFile = createTempFile("process", ".zip"); - try (FileOutputStream output = new FileOutputStream(tempFile)) { + try (OutputStream output = Files.newOutputStream(tempFile.toPath())) { ZipHelper.zip(processData, output); } catch (IOException e) { throw new GoodDataException("Unable to zip process data", e); @@ -533,14 +532,14 @@ private DataloadProcess postProcess(DataloadProcess process, File processData, U Object processToSend; HttpMethod method = HttpMethod.POST; if (tempFile.length() > MAX_MULTIPART_SIZE) { - try { + try (final InputStream input = Files.newInputStream(tempFile.toPath())) { process.setPath(dataStoreService.getUri(tempFile.getName()).getPath()); - dataStoreService.upload(tempFile.getName(), new FileInputStream(tempFile)); + dataStoreService.upload(tempFile.getName(), input); processToSend = process; if (DataloadProcess.TEMPLATE.matches(postUri.toString())) { method = HttpMethod.PUT; } - } catch (FileNotFoundException e) { + } catch (IOException e) { throw new GoodDataException("Unable to access zipped process data at " + tempFile.getAbsolutePath(), e); } diff --git a/src/main/java/com/gooddata/util/ZipHelper.java b/src/main/java/com/gooddata/util/ZipHelper.java index 397bab6d2..86196a4e4 100644 --- a/src/main/java/com/gooddata/util/ZipHelper.java +++ b/src/main/java/com/gooddata/util/ZipHelper.java @@ -10,9 +10,10 @@ import org.springframework.util.StreamUtils; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; +import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.Files; import java.nio.file.Path; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; @@ -50,7 +51,7 @@ public static void zip(File file, OutputStream output, boolean includeRoot) thro notNull(output, "output"); if (isZipped(file)) { - try (FileInputStream fis = new FileInputStream(file)) { + try (InputStream fis = Files.newInputStream(file.toPath())) { StreamUtils.copy(fis, output); } } else { @@ -77,15 +78,15 @@ private static void zipDir(Path rootPath, File dir, ZipOutputStream zos) throws private static void zipFile(Path rootPath, File file, ZipOutputStream zos) throws IOException { ZipEntry ze = new ZipEntry(rootPath.relativize(file.toPath()).toString()); zos.putNextEntry(ze); - try (FileInputStream fis = new FileInputStream(file)) { + try (InputStream fis = Files.newInputStream(file.toPath())) { StreamUtils.copy(fis, zos); } zos.closeEntry(); } private static boolean isZipped(File file) { - try { - return new ZipInputStream(new FileInputStream(file)).getNextEntry() != null; + try (final InputStream stream = Files.newInputStream(file.toPath())) { + return new ZipInputStream(stream).getNextEntry() != null; } catch (IOException e) { return false; } From b3d31c2a536a53b3db63c310fbe699e088fa9f59 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 19 Apr 2017 16:45:49 +0200 Subject: [PATCH 0498/1191] change test - use hamcrest, simplify exception extraction --- .../util/ResponseErrorHandlerTest.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java index 34d58644e..ae0f9e24b 100644 --- a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -24,7 +24,6 @@ import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.testng.Assert.assertEquals; public class ResponseErrorHandlerTest { @@ -41,30 +40,30 @@ public void setUp() throws Exception { public void testHandleGdcError() throws Exception { final ClientHttpResponse response = prepareResponse("/gdc/gdcError.json"); - final GoodDataRestException exc = assertException(() -> responseErrorHandler.handleError(response)); + final GoodDataRestException exc = assertException(response); assertThat("GoodDataRestException should have been thrown!", exc, is(notNullValue())); - assertEquals(exc.getStatusCode(), 500); - assertEquals(exc.getRequestId(), "REQ"); - assertEquals(exc.getComponent(), "COMPONENT"); - assertEquals(exc.getErrorClass(), "CLASS"); - assertEquals(exc.getErrorCode(), "CODE"); - assertEquals(exc.getText(), "MSG"); + assertThat(exc.getStatusCode(), is(500)); + assertThat(exc.getRequestId(), is("REQ")); + assertThat(exc.getComponent(), is("COMPONENT")); + assertThat(exc.getErrorClass(), is("CLASS")); + assertThat(exc.getErrorCode(), is("CODE")); + assertThat(exc.getText(), is("MSG")); } @Test public void testHandleErrorStructure() throws Exception { final ClientHttpResponse response = prepareResponse("/gdc/errorStructure.json"); - final GoodDataRestException exc = assertException(() -> responseErrorHandler.handleError(response)); + final GoodDataRestException exc = assertException(response); assertThat("GoodDataRestException should have been thrown!", exc, is(notNullValue())); - assertEquals(exc.getStatusCode(), 500); - assertEquals(exc.getRequestId(), "REQ"); - assertEquals(exc.getComponent(), "COMPONENT"); - assertEquals(exc.getErrorClass(), "CLASS"); - assertEquals(exc.getErrorCode(), "CODE"); - assertEquals(exc.getText(), "MSG PARAM1 PARAM2 3"); + assertThat(exc.getStatusCode(), is(500)); + assertThat(exc.getRequestId(), is("REQ")); + assertThat(exc.getComponent(), is("COMPONENT")); + assertThat(exc.getErrorClass(), is("CLASS")); + assertThat(exc.getErrorCode(), is("CODE")); + assertThat(exc.getText(), is("MSG PARAM1 PARAM2 3")); } private ClientHttpResponse prepareResponse(String resourcePath) throws IOException { @@ -80,10 +79,10 @@ private ClientHttpResponse prepareResponse(String resourcePath) throws IOExcepti return response; } - private static GoodDataRestException assertException(Runnable runnable) { + private GoodDataRestException assertException(ClientHttpResponse response) { try { - runnable.run(); - return null; + responseErrorHandler.handleError(response); + throw new AssertionError("Expected GoodDataRestException"); } catch (GoodDataRestException e) { return e; } From abf072930f0b5988acf496968550070cb96ef5d6 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 19 Apr 2017 17:08:32 +0200 Subject: [PATCH 0499/1191] fix: handle invalid error response --- .../java/com/gooddata/GoodDataRestException.java | 4 +++- .../com/gooddata/util/ResponseErrorHandler.java | 3 ++- .../com/gooddata/GoodDataRestExceptionTest.java | 10 ++++++++++ .../gooddata/util/ResponseErrorHandlerTest.java | 16 ++++++++++++++++ src/test/resources/gdc/invalidError.json | 8 ++++++++ 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/gdc/invalidError.json diff --git a/src/main/java/com/gooddata/GoodDataRestException.java b/src/main/java/com/gooddata/GoodDataRestException.java index 804e72e4f..3d2ac2985 100644 --- a/src/main/java/com/gooddata/GoodDataRestException.java +++ b/src/main/java/com/gooddata/GoodDataRestException.java @@ -35,7 +35,9 @@ public class GoodDataRestException extends GoodDataException { */ public GoodDataRestException(int statusCode, String requestId, String message, String component, String errorClass, String errorCode) { - super(statusCode + (requestId != null ? ": [requestId=" + requestId + "] " : ": ") + message); + super(statusCode + + (requestId != null ? ": [requestId=" + requestId + "] " : ": ") + + (message != null ? message : "Unknown error")); this.statusCode = statusCode; this.requestId = requestId; this.component = component; diff --git a/src/main/java/com/gooddata/util/ResponseErrorHandler.java b/src/main/java/com/gooddata/util/ResponseErrorHandler.java index 1abeb2de2..a2245c48b 100644 --- a/src/main/java/com/gooddata/util/ResponseErrorHandler.java +++ b/src/main/java/com/gooddata/util/ResponseErrorHandler.java @@ -8,6 +8,7 @@ import com.gooddata.GoodDataRestException; import com.gooddata.gdc.ErrorStructure; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.HttpMessageConversionException; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.client.DefaultResponseErrorHandler; import org.springframework.web.client.HttpMessageConverterExtractor; @@ -36,7 +37,7 @@ public void handleError(ClientHttpResponse response) { ErrorStructure error = null; try { error = gdcErrorExtractor.extractData(response); - } catch (RestClientException | IOException ignored) { + } catch (RestClientException | IOException | HttpMessageConversionException ignored) { } final String requestId = response.getHeaders().getFirst(GDC_REQUEST_ID_HEADER); int statusCode; diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index 22c133197..c69afe096 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -12,6 +12,7 @@ import java.io.InputStream; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.*; public class GoodDataRestExceptionTest { @@ -57,6 +58,15 @@ public void shouldCreateInstanceWithNullGdcError() throws Exception { assertThat(e.getText(), is("message")); } + @Test + public void shouldCreateInstanceWithNullStatusAndGdcError() throws Exception { + final GoodDataRestException e = new GoodDataRestException(500, "a123", null, null); + assertThat(e.getMessage(), is("500: [requestId=a123] Unknown error")); + assertThat(e.getStatusCode(), is(500)); + assertThat(e.getRequestId(), is("a123")); + assertThat(e.getText(), is(nullValue())); + } + @Test public void shouldCreateInstanceWithGdcError() throws Exception { final InputStream inputStream = getClass().getResourceAsStream("/gdc/gdcError.json"); diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java index ae0f9e24b..3d4addcc1 100644 --- a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -20,6 +20,7 @@ import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.mock; @@ -66,6 +67,21 @@ public void testHandleErrorStructure() throws Exception { assertThat(exc.getText(), is("MSG PARAM1 PARAM2 3")); } + @Test + public void testHandleInvalidError() throws Exception { + final ClientHttpResponse response = prepareResponse("/gdc/invalidError.json"); + + final GoodDataRestException exc = assertException(response); + + assertThat("GoodDataRestException should have been thrown!", exc, is(notNullValue())); + assertThat(exc.getStatusCode(), is(500)); + assertThat(exc.getRequestId(), is("requestId")); + assertThat(exc.getComponent(), is(nullValue())); + assertThat(exc.getErrorClass(), is(nullValue())); + assertThat(exc.getErrorCode(), is(nullValue())); + assertThat(exc.getText(), is(nullValue())); + } + private ClientHttpResponse prepareResponse(String resourcePath) throws IOException { final ClientHttpResponse response = mock(ClientHttpResponse.class); when(response.getStatusCode()).thenReturn(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/test/resources/gdc/invalidError.json b/src/test/resources/gdc/invalidError.json new file mode 100644 index 000000000..e3ba3752c --- /dev/null +++ b/src/test/resources/gdc/invalidError.json @@ -0,0 +1,8 @@ +{ + "timestamp": 1492609090612, + "status": 500, + "error": "Internal Server Error", + "exception": "java.lang.NoSuchFieldError", + "message": "fail", + "path": "/foo" +} From d72fb15d19c551f58f8c99cee56584abf2736724 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Fri, 21 Apr 2017 08:16:31 +0200 Subject: [PATCH 0500/1191] fix: upgrading link --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 743664849..d0ad3201b 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The *GoodData Java SDK* is available in Maven Central Repository, to use it from ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, -the [Upgrading Guide](https://github.com/gooddata/gooddata-java/wiki/Upgrading-GoodData-Java-SDK) will navigate you +the [Upgrading Guide](https://github.com/gooddata/gooddata-java/wiki/Upgrading) will navigate you through changes between major versions. See [Javadocs](http://javadoc.io/doc/com.gooddata/gooddata-java) From 096c7e8bbf98c189e373a91879f64289ebcbd0f3 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Apr 2017 13:59:34 +0200 Subject: [PATCH 0501/1191] fix: double uri encoding close: #436 --- src/main/java/com/gooddata/UriPrefixer.java | 16 +++++++++-- .../java/com/gooddata/UriPrefixerTest.java | 28 +++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 9b8a82148..9ae63f7ff 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -8,6 +8,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; +import java.util.List; import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; @@ -55,12 +56,21 @@ public URI getUriPrefix() { */ public URI mergeUris(URI uri) { notNull(uri, "uri"); - final String path = trimLeadingCharacter(uri.getRawPath(), '/'); + return UriComponentsBuilder.fromUri(uriPrefix) - .pathSegment(path) + .pathSegment(getPathSegments(uri)) .query(uri.getRawQuery()) .fragment(uri.getRawFragment()) - .build().toUri(); + .build(true) // we have an URI as the input, so it is already encoded + .toUri(); + } + + private static String[] getPathSegments(final URI uri) { + final List pathSegments = UriComponentsBuilder + .fromPath(uri.getRawPath()) + .build(true) + .getPathSegments(); + return pathSegments.toArray(new String[pathSegments.size()]); } /** diff --git a/src/test/java/com/gooddata/UriPrefixerTest.java b/src/test/java/com/gooddata/UriPrefixerTest.java index 719b4e646..93b995238 100644 --- a/src/test/java/com/gooddata/UriPrefixerTest.java +++ b/src/test/java/com/gooddata/UriPrefixerTest.java @@ -5,6 +5,7 @@ */ package com.gooddata; +import org.springframework.web.util.UriComponentsBuilder; import org.testng.annotations.Test; import java.net.URI; @@ -21,10 +22,37 @@ public void testMergeUrisWithSlash() throws Exception { assertThat(result.toString(), is("http://localhost:1/uploads/test")); } + @Test + public void testMergeUrisWithSlashes() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads/"); + final URI result = prefixer.mergeUris("/test"); + assertThat(result.toString(), is("http://localhost:1/uploads/test")); + } + @Test public void testMergeUrisWithoutSlash() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads/"); + final URI result = prefixer.mergeUris("test"); + assertThat(result.toString(), is("http://localhost:1/uploads/test")); + } + + @Test + public void testMergeUrisWithoutSlashes() throws Exception { final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads"); final URI result = prefixer.mergeUris("test"); assertThat(result.toString(), is("http://localhost:1/uploads/test")); } + + @Test + public void shouldNotDoubleEncodeQueryParam() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads"); + + final URI uri = UriComponentsBuilder.fromPath("/foo") + .queryParam("bar", "\n") // some crazy value which needs encoding + .build() + .toUri(); + + final URI result = prefixer.mergeUris(uri); + assertThat(result.toString(), is("http://localhost:1/uploads/foo?bar=%0A")); + } } \ No newline at end of file From 31cae73fdee79918c6e11391302301c5d8c38752 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Apr 2017 14:23:58 +0200 Subject: [PATCH 0502/1191] [maven-release-plugin] prepare release gooddata-java-2.4.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 082ae922f..2054c927d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.2-SNAPSHOT + 2.4.2 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 89b40061eb362229d1823231cdfb96ede5fb037a Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Apr 2017 14:23:58 +0200 Subject: [PATCH 0503/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2054c927d..8b3e89a90 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.2 + 2.4.3-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 63f4ade03e4a70690e8f2b1eaf2775283cc4a607 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 26 Apr 2017 14:33:03 +0200 Subject: [PATCH 0504/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d0ad3201b..cd895dcb8 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.4.1 + 2.4.2 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 284151918a7cf6528388a1155e6389150d872dd0 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 27 Apr 2017 15:25:47 +0200 Subject: [PATCH 0505/1191] fix: don't let uriprefixer to strip trailing slash close: #438 --- src/main/java/com/gooddata/UriPrefixer.java | 20 +++++++++++++------ .../UriPrefixingClientHttpRequestFactory.java | 3 ++- .../java/com/gooddata/UriPrefixerTest.java | 14 +++++++++++++ 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gooddata/UriPrefixer.java b/src/main/java/com/gooddata/UriPrefixer.java index 9ae63f7ff..618b3bfc7 100644 --- a/src/main/java/com/gooddata/UriPrefixer.java +++ b/src/main/java/com/gooddata/UriPrefixer.java @@ -5,6 +5,7 @@ */ package com.gooddata; +import org.apache.commons.lang3.StringUtils; import org.springframework.web.util.UriComponentsBuilder; import java.net.URI; @@ -12,7 +13,6 @@ import static com.gooddata.util.Validate.notEmpty; import static com.gooddata.util.Validate.notNull; -import static org.springframework.util.StringUtils.trimLeadingCharacter; /** * Used internally by GoodData SDK to hold and set URI prefix (hostname and port) of all requests. @@ -57,17 +57,25 @@ public URI getUriPrefix() { public URI mergeUris(URI uri) { notNull(uri, "uri"); - return UriComponentsBuilder.fromUri(uriPrefix) - .pathSegment(getPathSegments(uri)) + final String path = uri.getRawPath(); + final String[] pathSegments = getPathSegments(path); + + final UriComponentsBuilder builder = UriComponentsBuilder.fromUri(uriPrefix) + .pathSegment(pathSegments) .query(uri.getRawQuery()) - .fragment(uri.getRawFragment()) + .fragment(uri.getRawFragment()); + if (StringUtils.endsWith(path, "/")) { + builder.path("/"); + } + + return builder .build(true) // we have an URI as the input, so it is already encoded .toUri(); } - private static String[] getPathSegments(final URI uri) { + private static String[] getPathSegments(final String path) { final List pathSegments = UriComponentsBuilder - .fromPath(uri.getRawPath()) + .fromPath(path) .build(true) .getPathSegments(); return pathSegments.toArray(new String[pathSegments.size()]); diff --git a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java index a5f17d4e2..fd7cb7015 100644 --- a/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java +++ b/src/main/java/com/gooddata/UriPrefixingClientHttpRequestFactory.java @@ -53,7 +53,8 @@ private UriPrefixingClientHttpRequestFactory(final ClientHttpRequestFactory fact @Override public ClientHttpRequest createRequest(URI uri, HttpMethod httpMethod) throws IOException { - return wrapped.createRequest(prefixer.mergeUris(uri), httpMethod); + final URI merged = prefixer.mergeUris(uri); + return wrapped.createRequest(merged, httpMethod); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/UriPrefixerTest.java b/src/test/java/com/gooddata/UriPrefixerTest.java index 93b995238..65c564ee1 100644 --- a/src/test/java/com/gooddata/UriPrefixerTest.java +++ b/src/test/java/com/gooddata/UriPrefixerTest.java @@ -29,6 +29,13 @@ public void testMergeUrisWithSlashes() throws Exception { assertThat(result.toString(), is("http://localhost:1/uploads/test")); } + @Test + public void testMergeUrisWithAllSlashes() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads/"); + final URI result = prefixer.mergeUris("/test/"); + assertThat(result.toString(), is("http://localhost:1/uploads/test/")); + } + @Test public void testMergeUrisWithoutSlash() throws Exception { final UriPrefixer prefixer = new UriPrefixer("http://localhost:1/uploads/"); @@ -55,4 +62,11 @@ public void shouldNotDoubleEncodeQueryParam() throws Exception { final URI result = prefixer.mergeUris(uri); assertThat(result.toString(), is("http://localhost:1/uploads/foo?bar=%0A")); } + + @Test + public void shouldName() throws Exception { + final UriPrefixer prefixer = new UriPrefixer("https://localhost:1"); + final URI result = prefixer.mergeUris("http://localhost:1/uploads/test/"); + assertThat(result.toString(), is("https://localhost:1/uploads/test/")); + } } \ No newline at end of file From f70ddb2219e80cd5f61f72575a05a228972aef98 Mon Sep 17 00:00:00 2001 From: Martin Date: Fri, 28 Apr 2017 15:12:18 +0200 Subject: [PATCH 0506/1191] include ADS license to the Warehouse object --- .../com/gooddata/warehouse/Warehouse.java | 30 +++++++++++++------ .../com/gooddata/warehouse/WarehouseTest.java | 26 ++++++++++++++++ .../warehouse/warehouse-withLicense.json | 21 +++++++++++++ 3 files changed, 68 insertions(+), 9 deletions(-) create mode 100644 src/test/resources/warehouse/warehouse-withLicense.json diff --git a/src/main/java/com/gooddata/warehouse/Warehouse.java b/src/main/java/com/gooddata/warehouse/Warehouse.java index 443b46b3c..261582d27 100644 --- a/src/main/java/com/gooddata/warehouse/Warehouse.java +++ b/src/main/java/com/gooddata/warehouse/Warehouse.java @@ -56,6 +56,7 @@ public class Warehouse { private String environment; private Map links; private String connectionUrl; + private String license; public Warehouse(String title, String authToken) { this(title, authToken, null); @@ -67,15 +68,9 @@ public Warehouse(String title, String authToken, String description) { this.description = description; } - @JsonCreator - public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, - @JsonProperty("description") String description, - @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, - @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, - @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, - @JsonProperty("status") String status, @JsonProperty("environment") String environment, - @JsonProperty("connectionUrl") String connectionUrl, - @JsonProperty("links") Map links) { + public Warehouse(String title, String authToken, String description, DateTime created, DateTime updated, + String createdBy, String updatedBy, String status, String environment, String connectionUrl, + Map links) { this(title, authToken, description); this.created = created; this.updated = updated; @@ -87,6 +82,21 @@ public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizati this.links = links; } + @JsonCreator + public Warehouse(@JsonProperty("title") String title, @JsonProperty("authorizationToken") String authToken, + @JsonProperty("description") String description, + @JsonProperty("created") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, + @JsonProperty("updated") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime updated, + @JsonProperty("createdBy") String createdBy, @JsonProperty("updatedBy") String updatedBy, + @JsonProperty("status") String status, @JsonProperty("environment") String environment, + @JsonProperty("connectionUrl") String connectionUrl, + @JsonProperty("links") Map links, + @JsonProperty("license") String license) { + this(title, authToken, description, created, updated, createdBy, updatedBy, status, environment, connectionUrl, + links); + this.license = license; + } + public String getTitle() { return title; } @@ -144,6 +154,8 @@ public void setEnvironment(final String environment) { this.environment = environment; } + public String getLicense() { return license; } + @JsonIgnore public void setEnvironment(final Environment environment) { notNull(environment, "environment"); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index 62007685e..f16042035 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -33,6 +33,7 @@ public class WarehouseTest { public static final String UPDATED_BY = "/gdc/account/profile/updatedBy"; public static final String STATUS = "ENABLED"; public static final String CONNECTION_URL = "CONNECTION_URL"; + public static final String PREMIUM_LICENSE = "PREMIUM"; public static final Map LINKS = new LinkedHashMap() {{ put("self", "/gdc/datawarehouse/instances/instanceId"); put("parent", "/gdc/datawarehouse/instances"); @@ -59,6 +60,12 @@ public void testSerializationWithNullToken() throws Exception { assertThat(warehouse, serializesToJson("/warehouse/warehouse-null-token.json")); } + @Test + public void testSerializationWithLicense() throws Exception { + final Warehouse warehouse = new Warehouse(TITLE, TOKEN, DESCRIPTION, CREATED, UPDATED, CREATED_BY, UPDATED_BY, STATUS, ENVIRONMENT, CONNECTION_URL, LINKS, PREMIUM_LICENSE); + assertThat(warehouse, serializesToJson("/warehouse/warehouse-withLicense.json")); + } + @Test public void testDeserialization() throws Exception { final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse.json"); @@ -77,6 +84,25 @@ public void testDeserialization() throws Exception { assertThat(warehouse.getConnectionUrl(), is(CONNECTION_URL)); } + @Test + public void testDeserializationWithLicense() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse-withLicense.json"); + final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + + assertThat(warehouse.getTitle(), is(TITLE)); + assertThat(warehouse.getDescription(), is(DESCRIPTION)); + assertThat(warehouse.getAuthorizationToken(), is(TOKEN)); + assertThat(warehouse.getEnvironment(), is(ENVIRONMENT)); + assertThat(warehouse.getCreatedBy(), is(CREATED_BY)); + assertThat(warehouse.getUpdatedBy(), is(UPDATED_BY)); + assertThat(warehouse.getCreated(), is(CREATED)); + assertThat(warehouse.getUpdated(), is(UPDATED)); + assertThat(warehouse.getStatus(), is(STATUS)); + assertThat(warehouse.getLinks(), is(LINKS)); + assertThat(warehouse.getConnectionUrl(), is(CONNECTION_URL)); + assertThat(warehouse.getLicense(), is(PREMIUM_LICENSE)); + } + @Test public void testDeserializationWithNullToken() throws Exception { final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse-null-token.json"); diff --git a/src/test/resources/warehouse/warehouse-withLicense.json b/src/test/resources/warehouse/warehouse-withLicense.json new file mode 100644 index 000000000..1e2fe9746 --- /dev/null +++ b/src/test/resources/warehouse/warehouse-withLicense.json @@ -0,0 +1,21 @@ +{ + "instance" : { + "title" : "Test", + "description" : "Storage", + "status" : "ENABLED", + "authorizationToken" : "{Token}", + "created" : "2014-05-05T08:27:33.000Z", + "updated" : "2014-05-05T08:27:34.000Z", + "createdBy" : "/gdc/account/profile/createdBy", + "updatedBy" : "/gdc/account/profile/updatedBy", + "environment" : "TESTING", + "connectionUrl" : "CONNECTION_URL", + "license": "PREMIUM", + "links" : { + "self" : "/gdc/datawarehouse/instances/instanceId", + "parent" : "/gdc/datawarehouse/instances", + "users" : "/gdc/datawarehouse/instances/instanceId/users", + "jdbc" : "/gdc/datawarehouse/instances/instanceId/jdbc" + } + } +} From 2bc251d7f4a406eeeb4b374c25378d4bd339b680 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 2 May 2017 14:57:40 +0200 Subject: [PATCH 0507/1191] [maven-release-plugin] prepare release gooddata-java-2.5.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 8b3e89a90..6a19b9b8b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.4.3-SNAPSHOT + 2.5.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From c81238f10bf8d672d1d8e7e36d6a5ad12c287473 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 2 May 2017 14:57:40 +0200 Subject: [PATCH 0508/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a19b9b8b..667ebad1e 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.5.0 + 2.5.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From fa6919f84902f308fa373b13a59917ec7f30cb85 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 2 May 2017 16:07:49 +0200 Subject: [PATCH 0509/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cd895dcb8..f1dc8c023 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.4.2 + 2.5.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 62f267695b40610797ac8016846bf92954118f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Benkovsk=C3=BD?= Date: Wed, 10 May 2017 00:59:22 +0200 Subject: [PATCH 0510/1191] Add feature to execute schedule manually --- .../dataload/processes/ProcessService.java | 34 +++++++ .../gooddata/dataload/processes/Schedule.java | 6 ++ .../dataload/processes/ScheduleExecution.java | 95 +++++++++++++++++++ .../processes/ScheduleExecutionException.java | 23 +++++ .../dataload/processes/ProcessServiceAT.java | 9 ++ .../dataload/processes/ProcessServiceIT.java | 34 +++++++ .../processes/ProcessServiceTest.java | 35 +++++++ .../processes/ScheduleExecutionTest.java | 46 +++++++++ .../processes/emptyScheduleExecution.json | 4 + .../dataload/processes/scheduleExecution.json | 11 +++ 10 files changed, 297 insertions(+) create mode 100644 src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java create mode 100644 src/main/java/com/gooddata/dataload/processes/ScheduleExecutionException.java create mode 100644 src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java create mode 100644 src/test/resources/dataload/processes/emptyScheduleExecution.json create mode 100644 src/test/resources/dataload/processes/scheduleExecution.json diff --git a/src/main/java/com/gooddata/dataload/processes/ProcessService.java b/src/main/java/com/gooddata/dataload/processes/ProcessService.java index 59bb3e8ce..39e450e8b 100644 --- a/src/main/java/com/gooddata/dataload/processes/ProcessService.java +++ b/src/main/java/com/gooddata/dataload/processes/ProcessService.java @@ -470,6 +470,40 @@ public void removeSchedule(Schedule schedule) { } } + /** + * Executes given schedule + * + * @param schedule to execute + * @return schedule execution + */ + public FutureResult executeSchedule(final Schedule schedule) { + notNull(schedule, "schedule"); + ScheduleExecution scheduleExecution; + try { + scheduleExecution = restTemplate.postForObject(schedule.getExecutionsUri(), new ScheduleExecution(), ScheduleExecution.class); + } catch (GoodDataException | RestClientException e) { + throw new ScheduleExecutionException("Cannot execute schedule", e); + } + + return new PollResult<>(this, new AbstractPollHandler(scheduleExecution.getUri(), ScheduleExecution.class, ScheduleExecution.class) { + @Override + public boolean isFinished(ClientHttpResponse response) throws IOException { + final ScheduleExecution pollResult = extractData(response, ScheduleExecution.class); + return pollResult.isFinished(); + } + + @Override + public void handlePollResult(final ScheduleExecution pollResult) { + setResult(pollResult); + } + + @Override + public void handlePollException(final GoodDataRestException e) { + throw new ScheduleExecutionException("Cannot execute schedule", e); + } + }); + } + private PageableList listSchedules(URI uri) { try { final Schedules schedules = restTemplate.getForObject(uri, Schedules.class); diff --git a/src/main/java/com/gooddata/dataload/processes/Schedule.java b/src/main/java/com/gooddata/dataload/processes/Schedule.java index 4fe94cb93..bbd7586ff 100644 --- a/src/main/java/com/gooddata/dataload/processes/Schedule.java +++ b/src/main/java/com/gooddata/dataload/processes/Schedule.java @@ -41,6 +41,7 @@ public class Schedule { public static final UriTemplate TEMPLATE = new UriTemplate(URI); private static final String SELF_LINK = "self"; + private static final String EXECUTIONS_LINK = "executions"; private static final String MSETL_TYPE = "MSETL"; private static final String PROCESS_ID = "PROCESS_ID"; @@ -254,6 +255,11 @@ public String getId() { return TEMPLATE.match(getUri()).get("scheduleId"); } + @JsonIgnore + public String getExecutionsUri() { + return notNullState(links, "links").get(EXECUTIONS_LINK); + } + @Override public String toString() { return GoodDataToStringBuilder.defaultToString(this); diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java b/src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java new file mode 100644 index 000000000..255989ea5 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleExecution.java @@ -0,0 +1,95 @@ +/** + * 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.dataload.processes; + +import static com.gooddata.util.Validate.notNullState; + +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.databind.annotation.JsonDeserialize; +import com.gooddata.util.ISODateTimeDeserializer; +import org.joda.time.DateTime; +import org.springframework.web.util.UriTemplate; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Schedule execution + */ +@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME) +@JsonTypeName("execution") +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class ScheduleExecution { + + public static final String URI = "/gdc/projects/{projectId}/schedules/{scheduleId}/executions/{executionId}"; + public static final UriTemplate TEMPLATE = new UriTemplate(URI); + private static final Set FINISHED_STATUSES = new HashSet<>(Arrays.asList("OK", "ERROR", "CANCELED", "TIMEOUT")); + + private DateTime created; + private String status; + private String trigger; + private String processLastDeployedBy; + + private Map links; + + ScheduleExecution() {} + + @JsonCreator + private ScheduleExecution(@JsonProperty("createdTime") @JsonDeserialize(using = ISODateTimeDeserializer.class) DateTime created, + @JsonProperty("status") String executionStatus, + @JsonProperty("trigger") String trigger, + @JsonProperty("processLastDeployedBy") String processLastDeployedBy, + @JsonProperty("links") Map links) { + this.created = created; + this.status = executionStatus; + this.trigger = trigger; + this.processLastDeployedBy = processLastDeployedBy; + this.links = links; + } + + public String getStatus() { + return status; + } + + public Map getLinks() { + return links; + } + + public DateTime getCreated() { + return created; + } + + public String getTrigger() { + return trigger; + } + + public String getProcessLastDeployedBy() { + return processLastDeployedBy; + } + + @JsonIgnore + public String getUri() { + return notNullState(links, "links").get("self"); + } + + /** + * + * @return whether schedule execution is finished + */ + @JsonIgnore + public boolean isFinished() { + return FINISHED_STATUSES.contains(getStatus()); + } +} diff --git a/src/main/java/com/gooddata/dataload/processes/ScheduleExecutionException.java b/src/main/java/com/gooddata/dataload/processes/ScheduleExecutionException.java new file mode 100644 index 000000000..0a4dcc476 --- /dev/null +++ b/src/main/java/com/gooddata/dataload/processes/ScheduleExecutionException.java @@ -0,0 +1,23 @@ +/** + * 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.dataload.processes; + +import com.gooddata.GoodDataException; + +/** + * Represents error during schedule execution + */ +public class ScheduleExecutionException extends GoodDataException { + + public ScheduleExecutionException(String message) { + super(message); + } + + public ScheduleExecutionException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java index 07af74d45..cbbd8d5e1 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceAT.java @@ -6,6 +6,7 @@ package com.gooddata.dataload.processes; import com.gooddata.AbstractGoodDataAT; +import com.gooddata.FutureResult; import com.gooddata.collections.PageableList; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; @@ -68,6 +69,14 @@ public void createSchedule() { assertThat(schedule.getRescheduleInMinutes(), is(15)); } + @Test(groups = "process", dependsOnMethods = "createSchedule") + public void executeSchedule() { + final FutureResult future = gd.getProcessService().executeSchedule(schedule); + final ScheduleExecution scheduleExecution = future.get(); + + assertThat(scheduleExecution.getStatus(), is("OK")); + } + @Test(groups = "process", dependsOnMethods = "createSchedule") public void createTriggeredSchedule() { triggeredSchedule = gd.getProcessService().createSchedule(project, new Schedule(process, "sdktest.grf", schedule)); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 948ad6b4b..68b09fc4b 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -44,6 +44,7 @@ public class ProcessServiceIT extends AbstractGoodDataIT { private static final String SCHEDULE_PATH = Schedule.TEMPLATE.expand(PROJECT_ID, SCHEDULE_ID).toString(); private static final String EXECUTABLE = "test.groovy"; private static final String PROCESS_DEPLOYMENT_POLLING_URI = "/gdc/projects/PROJECT_ID/dataload/processesDeploy/uri"; + private static final String EXECUTION_ID = "EXECUTION_ID"; private Project project; @@ -369,4 +370,37 @@ public void shouldUpdateProcessFromAppstore() { assertThat(updatedProcess.getType(), is(equalTo(ProcessType.RUBY.toString()))); assertThat(updatedProcess.getExecutables(), contains("hello.rb") ); } + + @Test + public void shouldExecuteSchedule() { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(schedule.getExecutionsUri()) + .respond() + .withBody(readFromResource("/dataload/processes/scheduleExecution.json")) + .withStatus(200); + + onRequest() + .havingMethodEqualTo("GET") + .havingPathEqualTo(ScheduleExecution.TEMPLATE.expand(PROJECT_ID, SCHEDULE_ID, EXECUTION_ID).toString()) + .respond() + .withBody(readFromResource("/dataload/processes/scheduleExecution.json")) + .withStatus(200); + + FutureResult futureResult = gd.getProcessService().executeSchedule(schedule); + ScheduleExecution scheduleExecution = futureResult.get(); + + assertThat(scheduleExecution.getStatus(), is("OK")); + } + + @Test(expectedExceptions = ScheduleExecutionException.class) + public void shouldNotExecuteSchedule() { + onRequest() + .havingMethodEqualTo("POST") + .havingPathEqualTo(schedule.getExecutionsUri()) + .respond() + .withStatus(409); + + gd.getProcessService().executeSchedule(schedule); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java index 39092b899..418ed6469 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.dataload.processes; +import com.gooddata.FutureResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; import com.gooddata.account.Account; @@ -43,9 +44,11 @@ import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; import static org.mockito.Matchers.notNull; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; +import static org.springframework.http.HttpMethod.GET; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertTrue; @@ -54,6 +57,8 @@ public class ProcessServiceTest { private static final String PROCESS_ID = "PROCESS_ID"; private static final String PROJECT_ID = "PROJECT_ID"; private static final String ACCOUNT_ID = "ACCOUNT_ID"; + private static final String SCHEDULE_EXECUTIONS_URI = "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions"; + private static final String SCHEDULE_EXECUTION_URI = "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/EXECUTION_ID"; private static final String PROCESS_URI = "/gdc/projects/PROJECT_ID/dataload/processes/PROCESS_ID"; private static final String USER_PROCESS_URI = "/gdc/account/profile/ACCOUNT_ID/dataload/processes"; @@ -224,4 +229,34 @@ public void testListUserProcessesWithOneProcesses() throws Exception { assertThat(result, hasSize(1)); assertThat(result, contains(process)); } + + @Test(expectedExceptions = ScheduleExecutionException.class) + public void testExecuteScheduleException() throws Exception { + when(restTemplate.postForObject(eq(SCHEDULE_EXECUTIONS_URI), any(ScheduleExecution.class), eq(ScheduleExecution.class))) + .thenThrow(new RestClientException("")); + + final Schedule schedule = mock(Schedule.class); + + when(schedule.getExecutionsUri()).thenReturn(SCHEDULE_EXECUTIONS_URI); + + processService.executeSchedule(schedule); + } + + @Test(expectedExceptions = ScheduleExecutionException.class) + public void testExecuteScheduleExceptionDuringPolling() throws Exception { + final ScheduleExecution execution = mock(ScheduleExecution.class); + when(execution.getUri()).thenReturn(SCHEDULE_EXECUTION_URI); + + final Schedule schedule = mock(Schedule.class); + when(schedule.getExecutionsUri()).thenReturn(SCHEDULE_EXECUTIONS_URI); + + when(restTemplate.postForObject(eq(SCHEDULE_EXECUTIONS_URI), any(ScheduleExecution.class), eq(ScheduleExecution.class))) + .thenReturn(execution); + + when(restTemplate.execute(eq(SCHEDULE_EXECUTION_URI), eq(GET), any(), any())) + .thenThrow(mock(GoodDataRestException.class)); + + FutureResult futureResult = processService.executeSchedule(schedule); + futureResult.get(); + } } diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java new file mode 100644 index 000000000..0f935a7c9 --- /dev/null +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java @@ -0,0 +1,46 @@ +/** + * 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.dataload.processes; + + +import static com.gooddata.JsonMatchers.serializesToJson; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.Is.is; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import java.io.InputStream; +import java.util.HashMap; + +public class ScheduleExecutionTest { + + @Test + public void testEmptyScheduleExecutionSerialization() throws Exception { + final ScheduleExecution scheduleExecution = new ScheduleExecution(); + + assertThat(scheduleExecution, serializesToJson("/dataload/processes/emptyScheduleExecution.json")); + } + + @Test + public void testDeserialization() throws Exception { + final InputStream stream = getClass().getResourceAsStream("/dataload/processes/scheduleExecution.json"); + final ScheduleExecution scheduleExecution = new ObjectMapper().readValue(stream, ScheduleExecution.class); + + assertThat(scheduleExecution, notNullValue()); + assertThat(scheduleExecution.getLinks(), is(equalTo(new HashMap() {{ + put("self", "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/EXECUTION_ID"); + }}))); + assertThat(scheduleExecution.getStatus(), is("OK")); + assertThat(scheduleExecution.getTrigger(), is("MANUAL")); + assertThat(scheduleExecution.getProcessLastDeployedBy(), is("bear@gooddata.com")); + assertThat(scheduleExecution.getCreated(), is(new DateTime(2017, 5, 9, 21, 54, 50, 924, DateTimeZone.UTC))); + } +} diff --git a/src/test/resources/dataload/processes/emptyScheduleExecution.json b/src/test/resources/dataload/processes/emptyScheduleExecution.json new file mode 100644 index 000000000..dcbad84f1 --- /dev/null +++ b/src/test/resources/dataload/processes/emptyScheduleExecution.json @@ -0,0 +1,4 @@ +{ + "execution" : { + } +} diff --git a/src/test/resources/dataload/processes/scheduleExecution.json b/src/test/resources/dataload/processes/scheduleExecution.json new file mode 100644 index 000000000..89fd13e2e --- /dev/null +++ b/src/test/resources/dataload/processes/scheduleExecution.json @@ -0,0 +1,11 @@ +{ + "execution" : { + "createdTime" : "2017-05-09T21:54:50.924Z", + "status" : "OK", + "trigger" : "MANUAL", + "processLastDeployedBy" : "bear@gooddata.com", + "links" : { + "self" : "/gdc/projects/PROJECT_ID/schedules/SCHEDULE_ID/executions/EXECUTION_ID" + } + } +} From ed6e5b66d8360953cb3817dcd4523353545b7ccd Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Mon, 15 May 2017 15:37:40 +0200 Subject: [PATCH 0511/1191] chg: split duties of reviewer and committer --- CONTRIBUTING.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index df24c472b..c61a4f09f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,19 +3,21 @@ Below are few **rules, recommendations and best practices** we try to follow when developing the _GoodData Java SDK_. ## Paperwork + +### Committer * The **commit message**: * must be written in the **imperative mood** * must clearly **explain rationale** behind this change (describe _why_ you are doing the change rather than _what_ you are changing) * The **pull request**: - * must be **properly labeled** (trivial/bug/enhancement/backward incompatible/...) * with non-trivial change must be **[associated with an issue](https://help.github.com/articles/closing-issues-via-commit-messages/)** - * must be marked with exactly one **milestone version** -* The **issue** - * must be **properly labeled** (bug/enhancement/backward incompatible/...). - * must be marked with exactly one **milestone version** * Add usage examples of new high level functionality to [documentation](https://github.com/gooddata/gooddata-java/wiki/Code-Examples). +### Reviewer +Ensure pull request and issues are + * **properly labeled** (trivial/bug/enhancement/backward incompatible/...) + * marked with exactly one **milestone version** + ## Design ### Structure From 71aae8d9213ceb036bc064f23cc09f2de27a9d20 Mon Sep 17 00:00:00 2001 From: Matej Plch Date: Fri, 12 May 2017 17:06:17 +0200 Subject: [PATCH 0512/1191] FEATURE: Enable to customize user-agent --- src/main/java/com/gooddata/GoodData.java | 3 ++- .../java/com/gooddata/GoodDataSettings.java | 19 +++++++++++++++++++ .../com/gooddata/GoodDataSettingsTest.java | 11 +++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 7a575c319..7d872bbbe 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -22,6 +22,7 @@ import com.gooddata.model.ModelService; import com.gooddata.project.ProjectService; import com.gooddata.report.ReportService; +import org.apache.commons.lang3.StringUtils; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.config.SocketConfig; @@ -246,7 +247,7 @@ private HttpClientBuilder createHttpClientBuilder(final GoodDataSettings setting requestConfig.setSocketTimeout(settings.getSocketTimeout()); return HttpClientBuilder.create() - .setUserAgent(getUserAgent()) + .setUserAgent(StringUtils.isNotBlank(settings.getUserAgent()) ? String.format("%s %s", settings.getUserAgent(), getUserAgent()) : getUserAgent()) .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig.build()); } diff --git a/src/main/java/com/gooddata/GoodDataSettings.java b/src/main/java/com/gooddata/GoodDataSettings.java index 46ccd30ff..f35a09145 100644 --- a/src/main/java/com/gooddata/GoodDataSettings.java +++ b/src/main/java/com/gooddata/GoodDataSettings.java @@ -5,6 +5,8 @@ */ package com.gooddata; +import org.apache.commons.lang.StringUtils; + import java.util.concurrent.TimeUnit; import static org.springframework.util.Assert.isTrue; @@ -22,6 +24,7 @@ public class GoodDataSettings { private int connectionTimeout = secondsToMillis(10); private int connectionRequestTimeout = secondsToMillis(10); private int socketTimeout = secondsToMillis(60); + private String userAgent; /** @@ -155,6 +158,22 @@ public int getSocketTimeout() { return socketTimeout; } + /** + * User agent + * @return user agent string + */ + public String getUserAgent() { + return userAgent; + } + + /** + * Set custom user agent as prefix for default user agent + * @param userAgent user agent string + */ + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + } + @Override public boolean equals(final Object o) { if (this == o) return true; diff --git a/src/test/java/com/gooddata/GoodDataSettingsTest.java b/src/test/java/com/gooddata/GoodDataSettingsTest.java index 42bffade7..d4d6a7c45 100644 --- a/src/test/java/com/gooddata/GoodDataSettingsTest.java +++ b/src/test/java/com/gooddata/GoodDataSettingsTest.java @@ -8,6 +8,9 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertTrue; @@ -26,6 +29,7 @@ public void testHasDefaults() throws Exception { assertTrue(settings.getConnectionTimeout() >= 0); assertTrue(settings.getConnectionRequestTimeout() >= 0); assertTrue(settings.getSocketTimeout() >= 0); + assertThat(settings.getUserAgent(), is(nullValue())); } @Test @@ -58,4 +62,11 @@ public void setNegativeSocketTimeoutFails() throws Exception { public void setZeroMaxConnectionsFails() throws Exception { settings.setMaxConnections(0); } + + @Test + public void customUserAgentShouldBePrefixOfDefault() { + GoodDataSettings goodDataSettings = new GoodDataSettings(); + goodDataSettings.setUserAgent("customAgent/X.Y"); + assertThat(goodDataSettings.getUserAgent(), is("customAgent/X.Y")); + } } \ No newline at end of file From a4c70d90dbf10c7d469a3151aedc868fefe8d75c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 16 May 2017 11:23:44 +0200 Subject: [PATCH 0513/1191] [maven-release-plugin] prepare release gooddata-java-2.6.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 667ebad1e..a5d020cf0 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.5.1-SNAPSHOT + 2.6.0 ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 5c8da9d636d32cd17f783bbf30ac519fc09b1fd4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 16 May 2017 11:23:44 +0200 Subject: [PATCH 0514/1191] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a5d020cf0..a95081d36 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gooddata gooddata-java - 2.6.0 + 2.6.1-SNAPSHOT ${project.artifactId} GoodData Java SDK https://github.com/gooddata/gooddata-java From 8cd98172e820624403297ff1a57a939910f5afb1 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 16 May 2017 11:30:36 +0200 Subject: [PATCH 0515/1191] bump version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f1dc8c023..218d669cc 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.5.0 + 2.6.0 ``` See [releases page](https://github.com/gooddata/gooddata-java/releases) for information about versions and notable changes, From 926b0eedb28929bf468c5759ad0c9923b76b9eb4 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Wed, 17 May 2017 09:36:18 +0200 Subject: [PATCH 0516/1191] handle a new type of exception WebDAV throws with R136 --- src/main/java/com/gooddata/gdc/DataStoreService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/gooddata/gdc/DataStoreService.java b/src/main/java/com/gooddata/gdc/DataStoreService.java index bfd75ff57..eb6b7bbe9 100644 --- a/src/main/java/com/gooddata/gdc/DataStoreService.java +++ b/src/main/java/com/gooddata/gdc/DataStoreService.java @@ -14,6 +14,7 @@ import org.apache.http.HttpHost; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; +import org.apache.http.NoHttpResponseException; import org.apache.http.ProtocolVersion; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; @@ -111,6 +112,11 @@ private void upload(URI url, InputStream stream) { } else { throw new DataStoreException("Unable to upload to " + url + " got status " + e.getStatusCode(), e); } + } catch (NoHttpResponseException e) { + // this error may occur when user issues request to WebDAV before SST and TT were obtained + // and WebDAV is deployed on a separate hostname since R136 + // see https://github.com/gooddata/gooddata-java/wiki/Known-limitations + throw new DataStoreException(createUnAuthRequestWarningMessage(url), e); } catch (IOException e) { // this error may occur when user issues request to WebDAV before SST and TT were obtained // and WebDAV deployed on the same hostname From 28101f6f6e94a627b75291bd983a05ffa4c7795f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 23 May 2017 10:36:55 +0200 Subject: [PATCH 0517/1191] fix: skip test as the fix on server side is scheduled for R136 --- src/test/java/com/gooddata/gdc/DatastoreServiceAT.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java index 274fbf506..c1e3e6b64 100644 --- a/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java +++ b/src/test/java/com/gooddata/gdc/DatastoreServiceAT.java @@ -92,8 +92,8 @@ public void datastoreConnectionClosedAfterSingleConnection() throws Exception { assertThat(connManager.getTotalStats().getLeased(), is(equalTo(0))); } - @Test(groups = "datastore", expectedExceptions = DataStoreException.class, - expectedExceptionsMessageRegExp = "(?s).* 500 .*https://github.com/.*/Known-limitations") + @Test(groups = "datastore", expectedExceptions = DataStoreException.class, enabled = false, + expectedExceptionsMessageRegExp = "(?s).* 500 .*https://github.com/.Known-limitations") public void shouldThrowExceptionWithMessageOnUnAuthRequest() throws Exception { final GoodData datastoreGd = new GoodData(getProperty("host"), getProperty("login"), getProperty("pass")); DataStoreService dataStoreService = datastoreGd.getDataStoreService(); From 722be536809ef2139c2591dccc24ad912faa3f07 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 23 May 2017 11:29:13 +0200 Subject: [PATCH 0518/1191] add windows CI build close #235 --- .appveyor.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .appveyor.yml diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 000000000..7468fa0c5 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,17 @@ +version: "{branch} {build}" + +branches: + only: + - master + +cache: + - C:\Users\appveyor\.m2 + +install: + - SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0 + +build_script: + - mvn clean test-compile + +test_script: + - mvn verify From 88e38ceb3c1704e6af6c3a6bbdcc3dafde87891c Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Tue, 23 May 2017 22:04:09 +0200 Subject: [PATCH 0519/1191] use ResourceUtils in tests --- .../java/com/gooddata/AbstractGoodDataIT.java | 2 - .../gooddata/GoodDataRestExceptionTest.java | 9 ++-- .../gooddata/account/AccountServiceIT.java | 5 +- .../com/gooddata/account/AccountTest.java | 5 +- .../com/gooddata/collections/PagingTest.java | 10 ++-- .../connector/ConnectorServiceIT.java | 8 ++-- .../IntegrationProcessStatusTest.java | 5 +- .../gooddata/connector/IntegrationTest.java | 5 +- .../gooddata/connector/ProcessStatusTest.java | 5 +- .../connector/Zendesk4SettingsTest.java | 5 +- .../dataload/OutputStageServiceIT.java | 20 ++++---- .../dataload/OutputStageServiceTest.java | 29 +++++------- .../gooddata/dataload/OutputStageTest.java | 25 ++++------ .../processes/DataloadProcessTest.java | 11 ++--- .../processes/DataloadProcessesTest.java | 8 ++-- .../processes/ProcessExecutionDetailTest.java | 8 ++-- .../processes/ProcessExecutionTaskTest.java | 11 ++--- .../processes/ProcessExecutionTest.java | 14 +++--- .../dataload/processes/ProcessServiceIT.java | 13 +++-- .../processes/ScheduleExecutionTest.java | 18 ++++--- .../dataload/processes/ScheduleTest.java | 8 ++-- .../dataload/processes/SchedulesTest.java | 10 ++-- .../gooddata/dataset/DatasetLinksTest.java | 6 +-- .../gooddata/dataset/DatasetManifestTest.java | 9 ++-- .../gooddata/dataset/DatasetServiceIT.java | 28 ++++++----- .../com/gooddata/dataset/DatasetTest.java | 7 +-- .../com/gooddata/dataset/DatasetsTest.java | 6 +-- .../com/gooddata/dataset/MaqlDmlTest.java | 3 +- .../com/gooddata/dataset/PullTaskTest.java | 7 +-- .../com/gooddata/dataset/TaskStateTest.java | 9 ++-- .../dataset/UploadStatisticsTest.java | 7 ++- .../java/com/gooddata/dataset/UploadTest.java | 18 +++---- .../com/gooddata/dataset/UploadsInfoTest.java | 17 +++---- .../com/gooddata/dataset/UploadsTest.java | 16 +++---- .../featureflag/FeatureFlagServiceIT.java | 10 ++-- .../java/com/gooddata/gdc/AboutLinksTest.java | 6 +-- .../java/com/gooddata/gdc/AsyncTaskTest.java | 14 ++---- .../com/gooddata/gdc/ErrorStructureTest.java | 7 +-- .../java/com/gooddata/gdc/GdcErrorTest.java | 7 +-- src/test/java/com/gooddata/gdc/GdcTest.java | 7 +-- .../com/gooddata/gdc/LinkEntriesTest.java | 12 ++--- .../java/com/gooddata/gdc/RootLinksTest.java | 7 +-- .../java/com/gooddata/gdc/TaskStatusTest.java | 13 +++-- .../com/gooddata/gdc/UriResponseTest.java | 7 +-- .../gooddata/md/AttributeDisplayFormTest.java | 10 ++-- .../com/gooddata/md/AttributeElementTest.java | 14 ++---- .../gooddata/md/AttributeElementsTest.java | 16 +++---- .../com/gooddata/md/AttributeSortTest.java | 18 +++---- .../java/com/gooddata/md/AttributeTest.java | 14 ++---- src/test/java/com/gooddata/md/ColumnTest.java | 14 ++---- .../gooddata/md/DataLoadingColumnTest.java | 14 ++---- .../java/com/gooddata/md/DatasetTest.java | 14 +++--- .../java/com/gooddata/md/DimensionTest.java | 16 +++---- .../java/com/gooddata/md/DisplayFormTest.java | 7 +-- src/test/java/com/gooddata/md/EntryTest.java | 4 +- .../java/com/gooddata/md/ExpressionTest.java | 7 ++- src/test/java/com/gooddata/md/FactTest.java | 4 +- src/test/java/com/gooddata/md/KeyTest.java | 7 ++- src/test/java/com/gooddata/md/MetaTest.java | 4 +- .../com/gooddata/md/MetadataServiceIT.java | 15 +++--- src/test/java/com/gooddata/md/MetricTest.java | 22 ++++----- .../com/gooddata/md/NestedAttributeTest.java | 19 ++++---- src/test/java/com/gooddata/md/ObjTest.java | 6 +-- .../com/gooddata/md/ProjectDashboardTest.java | 11 ++--- src/test/java/com/gooddata/md/QueryTest.java | 6 +-- .../com/gooddata/md/ScheduledMailTest.java | 10 ++-- .../com/gooddata/md/TableDataLoadTest.java | 14 ++---- src/test/java/com/gooddata/md/TableTest.java | 14 ++---- .../md/maintenance/ExportImportServiceIT.java | 3 +- .../md/maintenance/PartialMdArtifactTest.java | 15 +++--- .../md/report/AttributeInGridTest.java | 11 ++--- .../report/GridElementDeserializerTest.java | 5 +- .../GridReportDefinitionContentTest.java | 7 ++- .../java/com/gooddata/md/report/GridTest.java | 13 +++-- .../gooddata/md/report/MetricElementTest.java | 7 +-- .../OneNumberReportDefinitionContentTest.java | 8 ++-- .../report/ReportDefinitionContentTest.java | 6 +-- .../md/report/ReportDefinitionTest.java | 9 ++-- .../com/gooddata/md/report/ReportTest.java | 8 ++-- .../com/gooddata/model/DiffRequestTest.java | 6 +-- .../com/gooddata/model/MaqlDdlLinksTest.java | 7 +-- .../java/com/gooddata/model/MaqlDdlTest.java | 4 +- .../com/gooddata/model/ModelDiffTest.java | 6 +-- .../com/gooddata/model/ModelServiceIT.java | 14 +++--- .../notification/NotificationServiceIT.java | 3 +- .../gooddata/project/ProjectServiceIT.java | 47 +++++++++---------- .../gooddata/project/ProjectTemplateTest.java | 8 ++-- .../project/ProjectTemplatesTest.java | 5 +- .../com/gooddata/project/ProjectTest.java | 17 +++---- .../ProjectValidationResultItemTest.java | 5 +- .../ProjectValidationResultParamTest.java | 3 +- .../project/ProjectValidationResultTest.java | 8 ++-- .../project/ProjectValidationResultsTest.java | 5 +- .../project/ProjectValidationTypeTest.java | 6 +-- .../project/ProjectValidationsTest.java | 5 +- .../java/com/gooddata/project/RoleTest.java | 6 +-- .../java/com/gooddata/project/RolesTest.java | 10 ++-- .../java/com/gooddata/project/UserTest.java | 10 ++-- .../java/com/gooddata/project/UsersTest.java | 7 +-- .../com/gooddata/report/ReportServiceIT.java | 12 +++-- .../util/BooleanDeserializerTest.java | 27 +++++------ .../util/BooleanIntegerSerializerTest.java | 12 ++--- .../util/BooleanStringSerializerTest.java | 12 ++--- .../gooddata/util/GDDateDeserializerTest.java | 9 ++-- .../gooddata/util/GDDateSerializerTest.java | 8 ++-- .../util/GDDateTimeDeserializerTest.java | 10 ++-- .../util/GDDateTimeSerializerTest.java | 8 ++-- .../util/ISODateTimeDeserializerTest.java | 10 ++-- .../util/ISODateTimeSerializerTest.java | 8 ++-- .../util/ResponseErrorHandlerTest.java | 4 +- .../gooddata/util/TagsDeserializerTest.java | 14 +++--- .../com/gooddata/util/TagsSerializerTest.java | 10 ++-- .../warehouse/WarehouseSchemaTest.java | 19 ++++---- .../warehouse/WarehouseServiceIT.java | 16 ++++--- .../gooddata/warehouse/WarehouseTaskTest.java | 16 ++----- .../com/gooddata/warehouse/WarehouseTest.java | 10 ++-- .../gooddata/warehouse/WarehouseUserTest.java | 8 ++-- 117 files changed, 509 insertions(+), 715 deletions(-) diff --git a/src/test/java/com/gooddata/AbstractGoodDataIT.java b/src/test/java/com/gooddata/AbstractGoodDataIT.java index 86e04563d..ed958d9a9 100644 --- a/src/test/java/com/gooddata/AbstractGoodDataIT.java +++ b/src/test/java/com/gooddata/AbstractGoodDataIT.java @@ -6,7 +6,6 @@ package com.gooddata; import com.gooddata.authentication.LoginPasswordAuthentication; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; @@ -16,7 +15,6 @@ public abstract class AbstractGoodDataIT { - protected static final ObjectMapper MAPPER = new ObjectMapper(); protected GoodData gd; @BeforeMethod diff --git a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java index c69afe096..c2f9fef3c 100644 --- a/src/test/java/com/gooddata/GoodDataRestExceptionTest.java +++ b/src/test/java/com/gooddata/GoodDataRestExceptionTest.java @@ -6,14 +6,12 @@ package com.gooddata; import com.gooddata.gdc.GdcError; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.nullValue; -import static org.hamcrest.MatcherAssert.*; +import static org.hamcrest.MatcherAssert.assertThat; public class GoodDataRestExceptionTest { @Test @@ -69,8 +67,7 @@ public void shouldCreateInstanceWithNullStatusAndGdcError() throws Exception { @Test public void shouldCreateInstanceWithGdcError() throws Exception { - final InputStream inputStream = getClass().getResourceAsStream("/gdc/gdcError.json"); - final GdcError err = new ObjectMapper().readValue(inputStream, GdcError.class); + final GdcError err = readObjectFromResource("/gdc/gdcError.json", GdcError.class); final GoodDataRestException e = new GoodDataRestException(500, "a123", "message", err); assertThat(e.getMessage(), is("500: [requestId=REQ] MSG")); diff --git a/src/test/java/com/gooddata/account/AccountServiceIT.java b/src/test/java/com/gooddata/account/AccountServiceIT.java index af2912354..4caaee149 100644 --- a/src/test/java/com/gooddata/account/AccountServiceIT.java +++ b/src/test/java/com/gooddata/account/AccountServiceIT.java @@ -13,6 +13,7 @@ import java.io.IOException; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; @@ -33,8 +34,8 @@ public class AccountServiceIT extends AbstractGoodDataIT { @BeforeClass public void init() throws IOException { - account = MAPPER.readValue(readFromResource(ACCOUNT), Account.class); - createAccount = MAPPER.readValue(readFromResource(CREATE_ACCOUNT), Account.class); + account = readObjectFromResource(ACCOUNT, Account.class); + createAccount = readObjectFromResource(CREATE_ACCOUNT, Account.class); } @Test diff --git a/src/test/java/com/gooddata/account/AccountTest.java b/src/test/java/com/gooddata/account/AccountTest.java index d428990bb..a6439efd7 100644 --- a/src/test/java/com/gooddata/account/AccountTest.java +++ b/src/test/java/com/gooddata/account/AccountTest.java @@ -5,10 +5,10 @@ */ package com.gooddata.account; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -23,8 +23,7 @@ public class AccountTest { @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { - final Account account = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/account/account.json"), Account.class); + final Account account = readObjectFromResource("/account/account.json", Account.class); assertThat(account, is(notNullValue())); assertThat(account.getFirstName(), is(FIRST_NAME)); diff --git a/src/test/java/com/gooddata/collections/PagingTest.java b/src/test/java/com/gooddata/collections/PagingTest.java index 67bf1f0fd..888debed8 100644 --- a/src/test/java/com/gooddata/collections/PagingTest.java +++ b/src/test/java/com/gooddata/collections/PagingTest.java @@ -11,6 +11,7 @@ import java.io.InputStream; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -20,8 +21,7 @@ public class PagingTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/collections/paging.json"); - final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + final Paging paging = readObjectFromResource("/collections/paging.json", Paging.class); assertThat(paging.getOffset(), is("0")); assertThat(paging.getNext(), notNullValue()); @@ -30,8 +30,7 @@ public void testDeserialization() throws Exception { @Test public void testDeserializationNullNext() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/collections/paging_no_next.json"); - final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + final Paging paging = readObjectFromResource("/collections/paging_no_next.json", Paging.class); assertThat(paging.getOffset(), is("0")); assertThat(paging.getNext(), nullValue()); @@ -39,8 +38,7 @@ public void testDeserializationNullNext() throws Exception { @Test public void testDeserializationWithNextOnly() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/collections/paging_only_next.json"); - final Paging paging = new ObjectMapper().readValue(stream, Paging.class); + final Paging paging = readObjectFromResource("/collections/paging_only_next.json", Paging.class); assertThat(paging.getOffset(), is(nullValue())); assertThat(paging.getNext(), notNullValue()); diff --git a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java index 117f75e33..1356ee806 100644 --- a/src/test/java/com/gooddata/connector/ConnectorServiceIT.java +++ b/src/test/java/com/gooddata/connector/ConnectorServiceIT.java @@ -28,7 +28,7 @@ public class ConnectorServiceIT extends AbstractGoodDataIT { @BeforeMethod public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); connectors = gd.getConnectorService(); } @@ -109,7 +109,7 @@ public void shouldExecuteProcess() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() @@ -128,7 +128,7 @@ public void shouldFailExecuteProcessPolling() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() @@ -143,7 +143,7 @@ public void shouldFailExecuteProcess() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes") .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS"))); onRequest() .havingPathEqualTo("/gdc/projects/PROJECT_ID/connectors/zendesk4/integration/processes/PROCESS") .respond() diff --git a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java index 95efece28..812c965b7 100644 --- a/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationProcessStatusTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.connector; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -16,6 +15,7 @@ import static com.gooddata.connector.Status.Code.SYNCHRONIZED; import static com.gooddata.connector.Status.Code.UPLOADING; import static com.gooddata.connector.Status.Code.USER_ERROR; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; @@ -27,8 +27,7 @@ public class IntegrationProcessStatusTest { @Test public void testShouldDeserialize() throws Exception { - final IntegrationProcessStatus process = new ObjectMapper() - .readValue(getClass().getResource("/connector/process-status-embedded.json"), IntegrationProcessStatus.class); + final IntegrationProcessStatus process = readObjectFromResource("/connector/process-status-embedded.json", IntegrationProcessStatus.class); assertThat(process, is(notNullValue())); assertThat(process.getStarted(), is(new DateTime(2014, 5, 30, 7, 50, 15, DateTimeZone.UTC))); diff --git a/src/test/java/com/gooddata/connector/IntegrationTest.java b/src/test/java/com/gooddata/connector/IntegrationTest.java index 0fee2cfb9..198b06db4 100644 --- a/src/test/java/com/gooddata/connector/IntegrationTest.java +++ b/src/test/java/com/gooddata/connector/IntegrationTest.java @@ -5,10 +5,10 @@ */ package com.gooddata.connector; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -19,8 +19,7 @@ public class IntegrationTest { @Test public void shouldDeserialize() throws Exception { - final Integration integration = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/connector/integration.json"), Integration.class); + final Integration integration = readObjectFromResource("/connector/integration.json", Integration.class); assertThat(integration, is(notNullValue())); assertThat(integration.isActive(), is(true)); diff --git a/src/test/java/com/gooddata/connector/ProcessStatusTest.java b/src/test/java/com/gooddata/connector/ProcessStatusTest.java index 861d5495e..f68ed8e83 100644 --- a/src/test/java/com/gooddata/connector/ProcessStatusTest.java +++ b/src/test/java/com/gooddata/connector/ProcessStatusTest.java @@ -5,10 +5,10 @@ */ package com.gooddata.connector; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.connector.Status.Code.ERROR; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -17,8 +17,7 @@ public class ProcessStatusTest { @Test public void shouldDeserialize() throws Exception { - final ProcessStatus process = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/connector/process-status-error.json"), ProcessStatus.class); + final ProcessStatus process = readObjectFromResource("/connector/process-status-error.json", ProcessStatus.class); assertThat(process, is(notNullValue())); assertThat(process.getFinished(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java index 83cf5aef3..2ba04dbbd 100644 --- a/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java +++ b/src/test/java/com/gooddata/connector/Zendesk4SettingsTest.java @@ -5,12 +5,12 @@ */ package com.gooddata.connector; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; import static com.gooddata.connector.ConnectorType.ZENDESK4; import static com.gooddata.connector.Zendesk4Settings.Zendesk4Type.plus; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -26,8 +26,7 @@ public void shouldSerialize() throws Exception { @Test public void shouldDeserialize() throws Exception { - final Zendesk4Settings settings = new ObjectMapper() - .readValue(getClass().getResource("/connector/settings-zendesk4.json"), Zendesk4Settings.class); + final Zendesk4Settings settings = readObjectFromResource("/connector/settings-zendesk4.json", Zendesk4Settings.class); assertThat(settings, is(notNullValue())); assertThat(settings.getApiUrl(), is("https://foo.com")); diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java index a6e593d31..52d63cc56 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceIT.java @@ -5,7 +5,13 @@ */ package com.gooddata.dataload; +import com.gooddata.AbstractGoodDataIT; +import com.gooddata.project.Project; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + 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.javacrumbs.jsonunit.JsonMatchers.jsonEquals; @@ -16,15 +22,6 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gooddata.AbstractGoodDataIT; - -import com.gooddata.project.Project; -import org.testng.annotations.BeforeClass; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class OutputStageServiceIT extends AbstractGoodDataIT { private static final String OUTPUT_STAGE_ALL_FIELDS = "/dataload/outputStageAllFields.json"; @@ -41,7 +38,7 @@ public class OutputStageServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - outputStage = MAPPER.readValue(readFromResource(OUTPUT_STAGE_ALL_FIELDS), OutputStage.class); + outputStage = readObjectFromResource(OUTPUT_STAGE_ALL_FIELDS, OutputStage.class); project = mock(Project.class); when(project.getId()).thenReturn(PROJECT_ID); } @@ -78,8 +75,7 @@ public void shouldGetOutputStage() throws Exception { @Test public void shouldUpdateOutputStage() throws Exception { - final InputStream stream = getClass().getResourceAsStream(OUTPUT_STAGE); - final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + final OutputStage outputStage = readObjectFromResource(OUTPUT_STAGE, OutputStage.class); onRequest() .havingMethodEqualTo("PUT") diff --git a/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java index 64961660c..c5de8c24a 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java +++ b/src/test/java/com/gooddata/dataload/OutputStageServiceTest.java @@ -5,19 +5,6 @@ */ package com.gooddata.dataload; -import static com.gooddata.util.ResourceUtils.readFromResource; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.core.Is.is; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.mockito.Matchers.any; -import static org.hamcrest.MatcherAssert.assertThat; - -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.project.Project; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -28,9 +15,19 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; -public class OutputStageServiceTest { +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; - private final ObjectMapper MAPPER = new ObjectMapper(); +public class OutputStageServiceTest { private static final String OUTPUT_STAGE = "/dataload/outputStage.json"; @@ -45,7 +42,7 @@ public class OutputStageServiceTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); outputStageService = new OutputStageService(restTemplate); - outputStage = MAPPER.readValue(readFromResource(OUTPUT_STAGE), OutputStage.class); + outputStage = readObjectFromResource(OUTPUT_STAGE, OutputStage.class); } @Test(expectedExceptions = IllegalArgumentException.class) diff --git a/src/test/java/com/gooddata/dataload/OutputStageTest.java b/src/test/java/com/gooddata/dataload/OutputStageTest.java index 6d9cf1cd8..bcdf938ad 100644 --- a/src/test/java/com/gooddata/dataload/OutputStageTest.java +++ b/src/test/java/com/gooddata/dataload/OutputStageTest.java @@ -5,20 +5,19 @@ */ package com.gooddata.dataload; +import org.testng.annotations.Test; + +import java.util.LinkedHashMap; +import java.util.Map; + import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; -import java.util.LinkedHashMap; -import java.util.Map; - public class OutputStageTest { private static final String SCHEMA_URI = "/gdc/datawarehouse/instances/instanceId/schemas/default"; @@ -36,8 +35,7 @@ public class OutputStageTest { @Test public void testDeserializationAllFields() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/outputStageAllFields.json"); - final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + final OutputStage outputStage = readObjectFromResource("/dataload/outputStageAllFields.json", OutputStage.class); assertThat(outputStage.getSchemaUri(), is(equalTo(SCHEMA_URI))); assertThat(outputStage.getClientId(), is(equalTo(CLIENT_ID))); @@ -53,8 +51,7 @@ public void testDeserializationAllFields() throws Exception { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); - final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + final OutputStage outputStage = readObjectFromResource("/dataload/outputStage.json", OutputStage.class); assertThat(outputStage.getSchemaUri(), is(nullValue())); assertThat(outputStage.getClientId(), is(nullValue())); @@ -69,8 +66,7 @@ public void testDeserialization() throws Exception { @Test public void testSerializationAfterDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); - final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + final OutputStage outputStage = readObjectFromResource("/dataload/outputStage.json", OutputStage.class); outputStage.setSchemaUri(SCHEMA_URI); outputStage.setClientId(CLIENT_ID); @@ -80,8 +76,7 @@ public void testSerializationAfterDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/outputStage.json"); - final OutputStage outputStage = new ObjectMapper().readValue(stream, OutputStage.class); + final OutputStage outputStage = readObjectFromResource("/dataload/outputStage.json", OutputStage.class); assertThat(outputStage.toString(), matchesPattern(OutputStage.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java index cac3617dc..b633379e5 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessTest.java @@ -5,24 +5,23 @@ */ package com.gooddata.dataload.processes; +import org.testng.annotations.Test; + import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - public class DataloadProcessTest { @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { - final DataloadProcess process = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); + final DataloadProcess process = readObjectFromResource("/dataload/processes/process.json", DataloadProcess.class); assertThat(process, is(notNullValue())); assertThat(process.getName(), is("testProcess")); diff --git a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java index 0aabe61c4..3fd5dccad 100644 --- a/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/DataloadProcessesTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.dataload.processes; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,8 +18,7 @@ public class DataloadProcessesTest { @Test public void testDeserialization() throws Exception { - final DataloadProcesses processes = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), DataloadProcesses.class); + final DataloadProcesses processes = readObjectFromResource("/dataload/processes/processes.json", DataloadProcesses.class); assertThat(processes, is(notNullValue())); assertThat(processes.getItems(), hasSize(1)); @@ -27,8 +26,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final DataloadProcesses processes = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/processes.json"), DataloadProcesses.class); + final DataloadProcesses processes = readObjectFromResource("/dataload/processes/processes.json", DataloadProcesses.class); assertThat(processes.toString(), matchesPattern(DataloadProcesses.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java index 467ff2782..9d0635567 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionDetailTest.java @@ -5,11 +5,11 @@ */ package com.gooddata.dataload.processes; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.core.Is.is; @@ -17,11 +17,9 @@ public class ProcessExecutionDetailTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeserialization() throws Exception { - final ProcessExecutionDetail executionDetail = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/executionDetail.json"), + final ProcessExecutionDetail executionDetail = readObjectFromResource("/dataload/processes/executionDetail.json", ProcessExecutionDetail.class); assertThat(executionDetail, notNullValue()); assertThat(executionDetail.getStatus(), is("ERROR")); @@ -40,7 +38,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final ProcessExecutionDetail executionDetail = MAPPER.readValue(getClass().getResourceAsStream("/dataload/processes/executionDetail.json"), + final ProcessExecutionDetail executionDetail = readObjectFromResource("/dataload/processes/executionDetail.json", ProcessExecutionDetail.class); assertThat(executionDetail.toString(), matchesPattern(ProcessExecutionDetail.class.getSimpleName() + "\\[.*\\]")); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java index 9f4a38576..24221f8e9 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTaskTest.java @@ -5,19 +5,18 @@ */ package com.gooddata.dataload.processes; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.MatcherAssert.*; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + public class ProcessExecutionTaskTest { @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { - final ProcessExecutionTask task = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/executionTask.json"), ProcessExecutionTask.class); + final ProcessExecutionTask task = readObjectFromResource("/dataload/processes/executionTask.json", ProcessExecutionTask.class); assertThat(task.getPollLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); assertThat(task.getPollUri(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId")); assertThat(task.getDetailLink(), is("/gdc/projects/PROJECT_ID/dataload/processes/processId/executions/executionId/detail")); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java index c26bc28fd..091df03a5 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessExecutionTest.java @@ -5,16 +5,16 @@ */ package com.gooddata.dataload.processes; -import static com.gooddata.JsonMatchers.serializesToJson; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.text.MatchesPattern.matchesPattern; + public class ProcessExecutionTest { @Test @@ -26,7 +26,7 @@ public void testSerialization() throws Exception { hidden.put("HIDDEN_PARAM1", "SENSITIVE_VALUE1"); hidden.put("HIDDEN_PARAM2", "SENSITIVE_VALUE2"); - final DataloadProcess process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); + final DataloadProcess process = readObjectFromResource("/dataload/processes/process.json", DataloadProcess.class); final ProcessExecution execution = new ProcessExecution(process, "test.groovy", params, hidden); assertThat(execution, serializesToJson("/dataload/processes/execution.json")); @@ -34,7 +34,7 @@ public void testSerialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final DataloadProcess process = new ObjectMapper().readValue(getClass().getResourceAsStream("/dataload/processes/process.json"), DataloadProcess.class); + final DataloadProcess process = readObjectFromResource("/dataload/processes/process.json", DataloadProcess.class); final ProcessExecution execution = new ProcessExecution(process, "test.groovy"); assertThat(execution.toString(), matchesPattern(ProcessExecution.class.getSimpleName() + "\\[.*\\]")); diff --git a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java index 68b09fc4b..97be55ff6 100644 --- a/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java +++ b/src/test/java/com/gooddata/dataload/processes/ProcessServiceIT.java @@ -9,7 +9,6 @@ import com.gooddata.FutureResult; import com.gooddata.collections.PageableList; import com.gooddata.project.Project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -18,6 +17,7 @@ import java.util.Collection; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static net.javacrumbs.jsonunit.JsonAssert.assertJsonEquals; import static org.hamcrest.MatcherAssert.assertThat; @@ -30,7 +30,6 @@ public class ProcessServiceIT extends AbstractGoodDataIT { - private static final ObjectMapper MAPPER = new ObjectMapper(); private static final String PROCESSES_PATH = DataloadProcesses.TEMPLATE.expand("PROJECT_ID").toString(); private static final String PROCESS_ID = "processId"; private static final String PROCESS_PATH = DataloadProcess.TEMPLATE.expand("PROJECT_ID", PROCESS_ID).toString(); @@ -56,9 +55,9 @@ public class ProcessServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); - process = MAPPER.readValue(readFromResource("/dataload/processes/process.json"), DataloadProcess.class); - schedule = MAPPER.readValue(readFromResource("/dataload/processes/schedule.json"), Schedule.class); + project = readObjectFromResource("/project/project.json", Project.class); + process = readObjectFromResource("/dataload/processes/process.json", DataloadProcess.class); + schedule = readObjectFromResource("/dataload/processes/schedule.json", Schedule.class); file = File.createTempFile("test", ".groovy"); } @@ -169,7 +168,7 @@ public void shouldGetExecutionLog() throws Exception { .withStatus(200); final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - final ProcessExecutionDetail executionDetail = MAPPER.readValue(readFromResource("/dataload/processes/executionDetail.json"), ProcessExecutionDetail.class); + final ProcessExecutionDetail executionDetail = readObjectFromResource("/dataload/processes/executionDetail.json", ProcessExecutionDetail.class); gd.getProcessService().getExecutionLog(executionDetail, outputStream); assertThat(outputStream.toString(), is(log)); } @@ -200,7 +199,7 @@ public void shouldExecuteProcess() throws Exception { final FutureResult result = gd.getProcessService().executeProcess(new ProcessExecution(process, "test.groovy")); final ProcessExecutionDetail executionDetail = result.get(); - assertJsonEquals(MAPPER.readValue(readFromResource("/dataload/processes/executionDetail-success.json"), ProcessExecutionDetail.class), executionDetail); + assertJsonEquals(readObjectFromResource("/dataload/processes/executionDetail-success.json", ProcessExecutionDetail.class), executionDetail); } @Test(expectedExceptions = ProcessExecutionException.class) diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java index 0f935a7c9..7b449cddb 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleExecutionTest.java @@ -6,20 +6,19 @@ package com.gooddata.dataload.processes; -import static com.gooddata.JsonMatchers.serializesToJson; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.core.Is.is; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.HashMap; +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.core.Is.is; + public class ScheduleExecutionTest { @Test @@ -31,8 +30,7 @@ public void testEmptyScheduleExecutionSerialization() throws Exception { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/processes/scheduleExecution.json"); - final ScheduleExecution scheduleExecution = new ObjectMapper().readValue(stream, ScheduleExecution.class); + final ScheduleExecution scheduleExecution = readObjectFromResource("/dataload/processes/scheduleExecution.json", ScheduleExecution.class); assertThat(scheduleExecution, notNullValue()); assertThat(scheduleExecution.getLinks(), is(equalTo(new HashMap() {{ diff --git a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java index 00e885592..46825a957 100644 --- a/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java +++ b/src/test/java/com/gooddata/dataload/processes/ScheduleTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.dataload.processes; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.joda.time.Duration; @@ -19,6 +18,7 @@ import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; @@ -53,8 +53,7 @@ public void setUp() throws Exception { @Test public void testDeserialization() throws Exception { - final Schedule schedule = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/schedule.json"), Schedule.class); + final Schedule schedule = readObjectFromResource("/dataload/processes/schedule.json", Schedule.class); assertThat(schedule, is(notNullValue())); assertThat(schedule.getId(), is("SCHEDULE_ID")); @@ -74,8 +73,7 @@ public void testDeserialization() throws Exception { @Test public void testTriggeredScheduleDeserialization() throws Exception { - final Schedule schedule = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/dataload/processes/schedule-triggered.json"), Schedule.class); + final Schedule schedule = readObjectFromResource("/dataload/processes/schedule-triggered.json", Schedule.class); assertThat(schedule, is(notNullValue())); assertThat(schedule.getId(), is("SCHEDULE_ID")); diff --git a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java index 376973542..cc11af24a 100644 --- a/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java +++ b/src/test/java/com/gooddata/dataload/processes/SchedulesTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.dataload.processes; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; @@ -20,8 +18,7 @@ public class SchedulesTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules.json"); - final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); + final Schedules schedules = readObjectFromResource("/dataload/processes/schedules.json", Schedules.class); assertThat(schedules, notNullValue()); assertThat(schedules, hasSize(1)); @@ -32,8 +29,7 @@ public void testDeserialization() throws Exception { @Test public void testDeserializationPaging() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataload/processes/schedules_page1.json"); - final Schedules schedules = new ObjectMapper().readValue(stream, Schedules.class); + final Schedules schedules = readObjectFromResource("/dataload/processes/schedules_page1.json", Schedules.class); assertThat(schedules, notNullValue()); assertThat(schedules, hasSize(1)); diff --git a/src/test/java/com/gooddata/dataset/DatasetLinksTest.java b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java index a7124ee1b..67d543796 100644 --- a/src/test/java/com/gooddata/dataset/DatasetLinksTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetLinksTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.gdc.AboutLinks; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -21,8 +20,7 @@ public class DatasetLinksTest { @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); - final DatasetLinks datasetLinks = new ObjectMapper().readValue(stream, DatasetLinks.class); + final DatasetLinks datasetLinks = readObjectFromResource("/dataset/datasetLinks.json", DatasetLinks.class); assertThat(datasetLinks, is(notNullValue())); assertThat(datasetLinks.getCategory(), is("singleloadinterface")); assertThat(datasetLinks.getInstance(), is("MD::LDM::SingleLoadInterface")); diff --git a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java index c95012832..05e93240b 100644 --- a/src/test/java/com/gooddata/dataset/DatasetManifestTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetManifestTest.java @@ -5,26 +5,23 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; public class DatasetManifestTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/datasetManifest.json"); - final DatasetManifest manifest = new ObjectMapper().readValue(stream, DatasetManifest.class); + final DatasetManifest manifest = readObjectFromResource("/dataset/datasetManifest.json", DatasetManifest.class); assertThat(manifest.getDataSet(), is("dataset.person")); assertThat(manifest.getFile(), is("dataset.person.csv")); diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java index cf5f5edb5..471cb9434 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceIT.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceIT.java @@ -19,7 +19,9 @@ import java.io.InputStream; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; @@ -35,7 +37,7 @@ public class DatasetServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUpClass() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); } @BeforeMethod @@ -74,7 +76,7 @@ public void shouldLoadDataset() throws Exception { .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = readObjectFromResource("/dataset/datasetManifest.json", DatasetManifest.class); gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); } @@ -89,7 +91,7 @@ public void shouldLoadDatasets() throws Exception { .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusOk.json")); - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = readObjectFromResource("/dataset/datasetManifest.json", DatasetManifest.class); final InputStream source = new ByteArrayInputStream(new byte[]{}); manifest.setSource(source); @@ -104,7 +106,7 @@ public void shouldFailPolling() throws Exception { .respond() .withStatus(400); - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = readObjectFromResource("/dataset/datasetManifest.json", DatasetManifest.class); gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); } @@ -115,7 +117,7 @@ public void shouldFailLoading() throws Exception { .respond() .withStatus(200) .withBody(readFromResource("/dataset/pullTaskStatusError.json")); - final DatasetManifest manifest = MAPPER.readValue(readFromResource("/dataset/datasetManifest.json"), DatasetManifest.class); + final DatasetManifest manifest = readObjectFromResource("/dataset/datasetManifest.json", DatasetManifest.class); try { gd.getDatasetService().loadDataset(project, manifest, new ByteArrayInputStream(new byte[]{})).get(); fail("Exception should be thrown"); @@ -181,10 +183,10 @@ public void shouldOptimizeSliHash() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))); gd.getDatasetService().optimizeSliHash(project).get(); } @@ -202,10 +204,10 @@ public void shouldFailOptimizeSliHash() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new TaskStatus("ERROR", STATUS_URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("ERROR", STATUS_URI))); gd.getDatasetService().optimizeSliHash(project).get(); } @@ -223,10 +225,10 @@ public void shouldUpdateProjectData() throws IOException { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(200) // REST API returns HTTP 200 when task is in RUNNING state :( - .withBody(MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new TaskState("OK", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskState("OK", STATUS_URI))) ; gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); @@ -263,10 +265,10 @@ public void shouldFailUpdateProjectData() throws IOException { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskState("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new TaskState("ERROR", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskState("ERROR", STATUS_URI))) ; gd.getDatasetService().updateProjectData(project, DML_MAQL).get(); diff --git a/src/test/java/com/gooddata/dataset/DatasetTest.java b/src/test/java/com/gooddata/dataset/DatasetTest.java index 53e132a2e..e5279cdff 100644 --- a/src/test/java/com/gooddata/dataset/DatasetTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,8 +17,7 @@ public class DatasetTest { @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/dataset.json"); - final Dataset dataset = new ObjectMapper().readValue(stream, Dataset.class); + final Dataset dataset = readObjectFromResource("/dataset/dataset.json", Dataset.class); assertThat(dataset, is(notNullValue())); assertThat(dataset.getIdentifier(), is("dataset.person")); diff --git a/src/test/java/com/gooddata/dataset/DatasetsTest.java b/src/test/java/com/gooddata/dataset/DatasetsTest.java index 1e5a916f4..1e88dc817 100644 --- a/src/test/java/com/gooddata/dataset/DatasetsTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetsTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.gdc.AboutLinks.Link; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -22,8 +21,7 @@ public class DatasetsTest { @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); - final Datasets datasets = new ObjectMapper().readValue(stream, Datasets.class); + final Datasets datasets = readObjectFromResource("/dataset/datasetLinks.json", Datasets.class); assertThat(datasets, is(notNullValue())); assertThat(datasets.getCategory(), is("singleloadinterface")); assertThat(datasets.getInstance(), is("MD::LDM::SingleLoadInterface")); diff --git a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java index b9a2c1f10..52eb18b07 100644 --- a/src/test/java/com/gooddata/dataset/MaqlDmlTest.java +++ b/src/test/java/com/gooddata/dataset/MaqlDmlTest.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,7 +18,7 @@ public class MaqlDmlTest { @Test public void testSerialization() throws Exception { final String json = IOUtils.toString(getClass().getResourceAsStream("/dataset/maqlDml.json"), "UTF-8"); - assertThat(new ObjectMapper().writeValueAsString(new MaqlDml("maqlddl")), + assertThat(OBJECT_MAPPER.writeValueAsString(new MaqlDml("maqlddl")), is(json)); } } diff --git a/src/test/java/com/gooddata/dataset/PullTaskTest.java b/src/test/java/com/gooddata/dataset/PullTaskTest.java index 7412daf9a..b952f1cc3 100644 --- a/src/test/java/com/gooddata/dataset/PullTaskTest.java +++ b/src/test/java/com/gooddata/dataset/PullTaskTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,8 +15,7 @@ public class PullTaskTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/pullTask.json"); - final PullTask task = new ObjectMapper().readValue(stream, PullTask.class); + final PullTask task = readObjectFromResource("/dataset/pullTask.json", PullTask.class); assertThat(task.getPollUri(), is("/gdc/md/PROJECT/tasks/task/ID/status")); } diff --git a/src/test/java/com/gooddata/dataset/TaskStateTest.java b/src/test/java/com/gooddata/dataset/TaskStateTest.java index 1927c9344..ada3b06ea 100644 --- a/src/test/java/com/gooddata/dataset/TaskStateTest.java +++ b/src/test/java/com/gooddata/dataset/TaskStateTest.java @@ -5,12 +5,11 @@ */ package com.gooddata.dataset; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.IOException; -import java.io.InputStream; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; @@ -19,16 +18,14 @@ public class TaskStateTest { @Test public void testDeserialize() throws IOException { - final InputStream stream = getClass().getResourceAsStream("/dataset/taskStateOK.json"); - TaskState taskState = new ObjectMapper().readValue(stream, TaskState.class); + TaskState taskState = readObjectFromResource("/dataset/taskStateOK.json", TaskState.class); assertThat(taskState.getStatus(), is("OK")); assertThat(taskState.getMessage(), is("ok message")); } @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/taskStateOK.json"); - TaskState taskState = new ObjectMapper().readValue(stream, TaskState.class); + TaskState taskState = readObjectFromResource("/dataset/taskStateOK.json", TaskState.class); assertThat(taskState.toString(), matchesPattern(TaskState.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java index f3a2fedfa..9249af785 100644 --- a/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadStatisticsTest.java @@ -5,6 +5,7 @@ */ package com.gooddata.dataset; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -19,8 +20,7 @@ public class UploadStatisticsTest { @Test public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-uploads-info.json"); - final UploadStatistics uploadStatistics = new ObjectMapper().readValue(input, UploadStatistics.class); + final UploadStatistics uploadStatistics = readObjectFromResource("/dataset/uploads/data-uploads-info.json", UploadStatistics.class); assertThat(uploadStatistics, notNullValue()); @@ -32,8 +32,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-uploads-info.json"); - final UploadStatistics uploadStatistics = new ObjectMapper().readValue(input, UploadStatistics.class); + final UploadStatistics uploadStatistics = readObjectFromResource("/dataset/uploads/data-uploads-info.json", UploadStatistics.class); assertThat(uploadStatistics.toString(), matchesPattern(UploadStatistics.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataset/UploadTest.java b/src/test/java/com/gooddata/dataset/UploadTest.java index 1273b803a..4c2aa7b0a 100644 --- a/src/test/java/com/gooddata/dataset/UploadTest.java +++ b/src/test/java/com/gooddata/dataset/UploadTest.java @@ -5,25 +5,22 @@ */ package com.gooddata.dataset; +import org.joda.time.DateTime; +import org.joda.time.DateTimeZone; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.joda.time.DateTime; -import org.joda.time.DateTimeZone; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class UploadTest { @Test public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/upload.json"); - final Upload upload = new ObjectMapper().readValue(input, Upload.class); + final Upload upload = readObjectFromResource("/dataset/uploads/upload.json", Upload.class); assertThat(upload, notNullValue()); assertThat(upload.getMessage(), is("some upload message")); @@ -38,8 +35,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/upload.json"); - final Upload upload = new ObjectMapper().readValue(input, Upload.class); + final Upload upload = readObjectFromResource("/dataset/uploads/upload.json", Upload.class); assertThat(upload.toString(), matchesPattern(Upload.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java index ca7c2fead..a84c9d0e8 100644 --- a/src/test/java/com/gooddata/dataset/UploadsInfoTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsInfoTest.java @@ -5,23 +5,21 @@ */ package com.gooddata.dataset; +import org.testng.annotations.Test; + +import java.util.Collections; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; -import java.util.Collections; - public class UploadsInfoTest { @Test public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); - final UploadsInfo uploadsInfo = new ObjectMapper().readValue(input, UploadsInfo.class); + final UploadsInfo uploadsInfo = readObjectFromResource("/dataset/uploads/data-sets.json", UploadsInfo.class); assertThat(uploadsInfo, notNullValue()); @@ -40,8 +38,7 @@ public void getDatasetUploadInfoFails() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/data-sets.json"); - final UploadsInfo uploadsInfo = new ObjectMapper().readValue(input, UploadsInfo.class); + final UploadsInfo uploadsInfo = readObjectFromResource("/dataset/uploads/data-sets.json", UploadsInfo.class); assertThat(uploadsInfo.toString(), matchesPattern(UploadsInfo.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/dataset/UploadsTest.java b/src/test/java/com/gooddata/dataset/UploadsTest.java index 0b1044b8f..e2ad69db5 100644 --- a/src/test/java/com/gooddata/dataset/UploadsTest.java +++ b/src/test/java/com/gooddata/dataset/UploadsTest.java @@ -5,24 +5,21 @@ */ package com.gooddata.dataset; +import org.hamcrest.Matchers; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.hamcrest.Matchers; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class UploadsTest { @Test public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/uploads.json"); - final Uploads uploads = new ObjectMapper().readValue(input, Uploads.class); + final Uploads uploads = readObjectFromResource("/dataset/uploads/uploads.json", Uploads.class); assertThat(uploads, notNullValue()); assertThat(uploads.items(), not(Matchers.empty())); @@ -31,8 +28,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream input = getClass().getResourceAsStream("/dataset/uploads/uploads.json"); - final Uploads uploads = new ObjectMapper().readValue(input, Uploads.class); + final Uploads uploads = readObjectFromResource("/dataset/uploads/uploads.json", Uploads.class); assertThat(uploads.toString(), matchesPattern(Uploads.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java index 4574f943b..a1486f7cf 100644 --- a/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java +++ b/src/test/java/com/gooddata/featureflag/FeatureFlagServiceIT.java @@ -12,7 +12,7 @@ import static com.gooddata.featureflag.ProjectFeatureFlag.PROJECT_FEATURE_FLAG_TEMPLATE; import static com.gooddata.featureflag.ProjectFeatureFlags.PROJECT_FEATURE_FLAGS_TEMPLATE; -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 org.hamcrest.MatcherAssert.assertThat; @@ -35,7 +35,7 @@ public class FeatureFlagServiceIT extends AbstractGoodDataIT { @BeforeMethod public void setUp() throws Exception { service = gd.getFeatureFlagService(); - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); } @Test @@ -126,8 +126,7 @@ public void updateProjectFeatureFlagShouldUpdateAndReturnUpdatedProjectFeatureFl .withBody(readStringFromResource("/featureflag/projectFeatureFlag.json")) .withStatus(200); - final ProjectFeatureFlag flag = MAPPER - .readValue(readFromResource("/featureflag/projectFeatureFlag.json"), ProjectFeatureFlag.class); + final ProjectFeatureFlag flag = readObjectFromResource("/featureflag/projectFeatureFlag.json", ProjectFeatureFlag.class); final ProjectFeatureFlag featureFlag = service.updateProjectFeatureFlag(flag); assertThat(featureFlag, is(notNullValue())); @@ -143,8 +142,7 @@ public void deleteProjectFeatureFlagShouldRemoveIt() throws Exception { .respond() .withStatus(200); - final ProjectFeatureFlag flag = MAPPER - .readValue(readFromResource("/featureflag/projectFeatureFlag.json"), ProjectFeatureFlag.class); + final ProjectFeatureFlag flag = readObjectFromResource("/featureflag/projectFeatureFlag.json", ProjectFeatureFlag.class); service.deleteProjectFeatureFlag(flag); } diff --git a/src/test/java/com/gooddata/gdc/AboutLinksTest.java b/src/test/java/com/gooddata/gdc/AboutLinksTest.java index efe9a0955..fa28f0415 100644 --- a/src/test/java/com/gooddata/gdc/AboutLinksTest.java +++ b/src/test/java/com/gooddata/gdc/AboutLinksTest.java @@ -5,12 +5,11 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -20,8 +19,7 @@ public class AboutLinksTest { @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/dataset/datasetLinks.json"); - final AboutLinks aboutLinks = new ObjectMapper().readValue(stream, AboutLinks.class); + final AboutLinks aboutLinks = readObjectFromResource("/dataset/datasetLinks.json", AboutLinks.class); assertThat(aboutLinks, is(notNullValue())); assertThat(aboutLinks.getCategory(), is("singleloadinterface")); assertThat(aboutLinks.getInstance(), is("MD::LDM::SingleLoadInterface")); diff --git a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java index 2e6275357..ae6fcd46f 100644 --- a/src/test/java/com/gooddata/gdc/AsyncTaskTest.java +++ b/src/test/java/com/gooddata/gdc/AsyncTaskTest.java @@ -5,30 +5,26 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class AsyncTaskTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/gdc/asyncTask.json"); - final AsyncTask asyncTask = MAPPER.readValue(is, AsyncTask.class); + final AsyncTask asyncTask = readObjectFromResource("/gdc/asyncTask.json", AsyncTask.class); assertThat(asyncTask.getUri(), is("POLL-URI")); } @Test public void testSerialization() throws Exception { - final String json = MAPPER.writeValueAsString(new AsyncTask("foo")); - final AsyncTask asyncTask = MAPPER.readValue(json, AsyncTask.class); + final String json = OBJECT_MAPPER.writeValueAsString(new AsyncTask("foo")); + final AsyncTask asyncTask = OBJECT_MAPPER.readValue(json, AsyncTask.class); assertThat(asyncTask.getUri(), is("foo")); } diff --git a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java index 857b6c607..825ac8df0 100644 --- a/src/test/java/com/gooddata/gdc/ErrorStructureTest.java +++ b/src/test/java/com/gooddata/gdc/ErrorStructureTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,8 +16,7 @@ public class ErrorStructureTest { @Test public void testDeserialization() throws Exception { - final InputStream inputStream = getClass().getResourceAsStream("/gdc/errorStructure.json"); - final ErrorStructure errStructure = new ObjectMapper().readValue(inputStream, ErrorStructure.class); + final ErrorStructure errStructure = readObjectFromResource("/gdc/errorStructure.json", ErrorStructure.class); assertThat(errStructure, is(notNullValue())); assertThat(errStructure.getErrorClass(), is("CLASS")); diff --git a/src/test/java/com/gooddata/gdc/GdcErrorTest.java b/src/test/java/com/gooddata/gdc/GdcErrorTest.java index fed25c0e4..4da0420ca 100644 --- a/src/test/java/com/gooddata/gdc/GdcErrorTest.java +++ b/src/test/java/com/gooddata/gdc/GdcErrorTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,8 +16,7 @@ public class GdcErrorTest { @Test public void testDeserialization() throws Exception { - final InputStream inputStream = getClass().getResourceAsStream("/gdc/gdcError.json"); - final GdcError err = new ObjectMapper().readValue(inputStream, GdcError.class); + final GdcError err = readObjectFromResource("/gdc/gdcError.json", GdcError.class); assertThat(err, is(notNullValue())); assertThat(err.getErrorClass(), is("CLASS")); diff --git a/src/test/java/com/gooddata/gdc/GdcTest.java b/src/test/java/com/gooddata/gdc/GdcTest.java index 27283571e..70cc59f35 100644 --- a/src/test/java/com/gooddata/gdc/GdcTest.java +++ b/src/test/java/com/gooddata/gdc/GdcTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,8 +17,7 @@ public class GdcTest { @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); - final Gdc gdc = new ObjectMapper().readValue(stream, Gdc.class); + final Gdc gdc = readObjectFromResource("/gdc/gdc.json", Gdc.class); assertThat(gdc, is(notNullValue())); assertThat(gdc.getHomeLink(), is("/gdc/")); diff --git a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java index b7724377c..8218e8b7b 100644 --- a/src/test/java/com/gooddata/gdc/LinkEntriesTest.java +++ b/src/test/java/com/gooddata/gdc/LinkEntriesTest.java @@ -5,15 +5,13 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; public class LinkEntriesTest { @@ -21,8 +19,7 @@ public class LinkEntriesTest { @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/gdc/linkEntries.json"); - final LinkEntries linkEntries = new ObjectMapper().readValue(stream, LinkEntries.class); + final LinkEntries linkEntries = readObjectFromResource("/gdc/linkEntries.json", LinkEntries.class); assertThat(linkEntries, is(notNullValue())); assertThat(linkEntries.getEntries(), hasSize(1)); @@ -34,8 +31,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/gdc/linkEntries.json"); - final LinkEntries linkEntries = new ObjectMapper().readValue(stream, LinkEntries.class); + final LinkEntries linkEntries = readObjectFromResource("/gdc/linkEntries.json", LinkEntries.class); assertThat(linkEntries.toString(), matchesPattern(LinkEntries.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/gdc/RootLinksTest.java b/src/test/java/com/gooddata/gdc/RootLinksTest.java index 0e26fb683..2f145dd4f 100644 --- a/src/test/java/com/gooddata/gdc/RootLinksTest.java +++ b/src/test/java/com/gooddata/gdc/RootLinksTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,8 +17,7 @@ public class RootLinksTest { @SuppressWarnings("deprecation") @Test public void deserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/gdc/gdc.json"); - final RootLinks rootLinks = new ObjectMapper().readValue(stream, RootLinks.class); + final RootLinks rootLinks = readObjectFromResource("/gdc/gdc.json", RootLinks.class); assertThat(rootLinks, is(notNullValue())); assertThat(rootLinks.getHomeLink(), is("/gdc/")); diff --git a/src/test/java/com/gooddata/gdc/TaskStatusTest.java b/src/test/java/com/gooddata/gdc/TaskStatusTest.java index e2d1da35e..9c093a771 100644 --- a/src/test/java/com/gooddata/gdc/TaskStatusTest.java +++ b/src/test/java/com/gooddata/gdc/TaskStatusTest.java @@ -5,26 +5,25 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.Matchers.*; import static org.hamcrest.MatcherAssert.*; public class TaskStatusTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeser() throws Exception { - final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/gdc/task-status.json"), TaskStatus.class); + final TaskStatus status = readObjectFromResource("/gdc/task-status.json", TaskStatus.class); assertThat(status.getStatus(), is("OK")); assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); } @Test public void testDeserMessages() throws Exception { - final TaskStatus status = MAPPER.readValue(getClass().getResourceAsStream("/model/maql-ddl-task-status-fail.json"), TaskStatus.class); + final TaskStatus status = readObjectFromResource("/model/maql-ddl-task-status-fail.json", TaskStatus.class); assertThat(status.getStatus(), is("ERROR")); assertThat(status.getPollUri(), is("/gdc/md/PROJECT_ID/tasks/TASK_ID/status")); assertThat(status.getMessages(), hasSize(1)); @@ -34,8 +33,8 @@ public void testDeserMessages() throws Exception { @Test public void testSerialize() throws Exception { - final String json = MAPPER.writeValueAsString(new TaskStatus("OK", "foo")); - final TaskStatus status = MAPPER.readValue(json, TaskStatus.class); + final String json = OBJECT_MAPPER.writeValueAsString(new TaskStatus("OK", "foo")); + final TaskStatus status = OBJECT_MAPPER.readValue(json, TaskStatus.class); assertThat(status.getStatus(), is("OK")); assertThat(status.getPollUri(), is("foo")); } diff --git a/src/test/java/com/gooddata/gdc/UriResponseTest.java b/src/test/java/com/gooddata/gdc/UriResponseTest.java index 4743ead86..1ef618f1a 100644 --- a/src/test/java/com/gooddata/gdc/UriResponseTest.java +++ b/src/test/java/com/gooddata/gdc/UriResponseTest.java @@ -5,12 +5,10 @@ */ package com.gooddata.gdc; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,8 +17,7 @@ public class UriResponseTest { @Test public void testDeserialization() throws Exception { - final InputStream inputStream = getClass().getResourceAsStream("/gdc/uriResponse.json"); - final UriResponse uriResponse = new ObjectMapper().readValue(inputStream, UriResponse.class); + final UriResponse uriResponse = readObjectFromResource("/gdc/uriResponse.json", UriResponse.class); assertThat(uriResponse, is(notNullValue())); assertThat(uriResponse.getUri(), is("URI")); diff --git a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java index 4324f7b40..72d17f9ba 100644 --- a/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java +++ b/src/test/java/com/gooddata/md/AttributeDisplayFormTest.java @@ -5,12 +5,10 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -29,8 +27,7 @@ public class AttributeDisplayFormTest { @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attributeDisplayForm.json"); - final AttributeDisplayForm attrDF = new ObjectMapper().readValue(stream, AttributeDisplayForm.class); + final AttributeDisplayForm attrDF = readObjectFromResource("/md/attributeDisplayForm.json", AttributeDisplayForm.class); assertThat(attrDF, is(notNullValue())); assertThat(attrDF.getFormOf(), is(FORM_OF)); @@ -52,8 +49,7 @@ public void testSerialization() throws Exception { @Test public void shouldSerializeSameAsDeserializationInput() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attributeDisplayForm.json"); - final AttributeDisplayForm attrDF = new ObjectMapper().readValue(stream, AttributeDisplayForm.class); + final AttributeDisplayForm attrDF = readObjectFromResource("/md/attributeDisplayForm.json", AttributeDisplayForm.class); assertThat(attrDF, serializesToJson("/md/attributeDisplayForm-inputOrig.json")); } diff --git a/src/test/java/com/gooddata/md/AttributeElementTest.java b/src/test/java/com/gooddata/md/AttributeElementTest.java index 4fa6b4b6b..81940e353 100644 --- a/src/test/java/com/gooddata/md/AttributeElementTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementTest.java @@ -5,16 +5,14 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class AttributeElementTest { private static final String URI = "/gdc/md/PROJECT_ID/obj/1333/elements?id=6959"; @@ -22,8 +20,7 @@ public class AttributeElementTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attributeElement.json"); - final AttributeElement element = new ObjectMapper().readValue(stream, AttributeElement.class); + final AttributeElement element = readObjectFromResource("/md/attributeElement.json", AttributeElement.class); assertThat(element, is(notNullValue())); assertThat(element.getUri(), is(URI)); @@ -32,8 +29,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attributeElement.json"); - final AttributeElement element = new ObjectMapper().readValue(stream, AttributeElement.class); + final AttributeElement element = readObjectFromResource("/md/attributeElement.json", AttributeElement.class); assertThat(element.toString(), matchesPattern(AttributeElement.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/AttributeElementsTest.java b/src/test/java/com/gooddata/md/AttributeElementsTest.java index 3da82955d..7fbdea22a 100644 --- a/src/test/java/com/gooddata/md/AttributeElementsTest.java +++ b/src/test/java/com/gooddata/md/AttributeElementsTest.java @@ -5,24 +5,22 @@ */ package com.gooddata.md; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.List; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; + public class AttributeElementsTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attributeElements.json"); - final AttributeElements elements = new ObjectMapper().readValue(stream, AttributeElements.class); + final AttributeElements elements = readObjectFromResource("/md/attributeElements.json", AttributeElements.class); assertThat(elements, is(notNullValue())); final List elementsList = elements.getElements(); diff --git a/src/test/java/com/gooddata/md/AttributeSortTest.java b/src/test/java/com/gooddata/md/AttributeSortTest.java index a52c86126..fe6c8c498 100644 --- a/src/test/java/com/gooddata/md/AttributeSortTest.java +++ b/src/test/java/com/gooddata/md/AttributeSortTest.java @@ -5,17 +5,17 @@ */ package com.gooddata.md; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.JsonMatchers; import org.testng.annotations.Test; -public class AttributeSortTest { +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.notNullValue; +import static org.hamcrest.text.MatchesPattern.matchesPattern; - private static final ObjectMapper MAPPER = new ObjectMapper(); +public class AttributeSortTest { @Test public void testSerializePlain() throws Exception { @@ -25,7 +25,7 @@ public void testSerializePlain() throws Exception { @Test public void testDeserializePlain() throws Exception { - final AttributeSort attributeSort = MAPPER.readValue("\"pk\"", AttributeSort.class); + final AttributeSort attributeSort = OBJECT_MAPPER.readValue("\"pk\"", AttributeSort.class); assertThat(attributeSort, is(notNullValue())); assertThat(attributeSort.getValue(), is("pk")); } @@ -38,7 +38,7 @@ public void testSerializeLink() throws Exception { @Test public void testDeserializeLink() throws Exception { - final AttributeSort attributeSort = MAPPER.readValue(getClass().getResourceAsStream("/md/attributeSort.json"), AttributeSort.class); + final AttributeSort attributeSort = readObjectFromResource("/md/attributeSort.json", AttributeSort.class); assertThat(attributeSort, is(notNullValue())); assertThat(attributeSort.getValue(), is("/gdc/md/PROJECT_ID/obj/1806")); } diff --git a/src/test/java/com/gooddata/md/AttributeTest.java b/src/test/java/com/gooddata/md/AttributeTest.java index 9689fed34..db29d3ca1 100644 --- a/src/test/java/com/gooddata/md/AttributeTest.java +++ b/src/test/java/com/gooddata/md/AttributeTest.java @@ -5,18 +5,17 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collection; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; public class AttributeTest { @@ -25,8 +24,7 @@ public class AttributeTest { @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attribute.json"); - final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + final Attribute attribute = readObjectFromResource("/md/attribute.json", Attribute.class); assertThat(attribute, is(notNullValue())); final Collection displayForms = attribute.getDisplayForms(); @@ -86,15 +84,13 @@ public void testSerialization() throws Exception { @Test public void shouldSerializeSameAsDeserializationInput() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attribute.json"); - final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + final Attribute attribute = readObjectFromResource("/md/attribute.json", Attribute.class); assertThat(attribute, serializesToJson("/md/attribute-inputOrig.json")); } @Test public void shouldDeserializeAttributeWithSort() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/attribute-sortDf.json"); - final Attribute attribute = new ObjectMapper().readValue(stream, Attribute.class); + final Attribute attribute = readObjectFromResource("/md/attribute-sortDf.json", Attribute.class); assertThat(attribute.getSort(), is("/gdc/md/PROJECT_ID/obj/1806")); assertThat(attribute.isSortedByLinkedDf(), is(true)); diff --git a/src/test/java/com/gooddata/md/ColumnTest.java b/src/test/java/com/gooddata/md/ColumnTest.java index 5d0b9872d..4e7156598 100644 --- a/src/test/java/com/gooddata/md/ColumnTest.java +++ b/src/test/java/com/gooddata/md/ColumnTest.java @@ -5,22 +5,19 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class ColumnTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/column.json"); - final Column column = new ObjectMapper().readValue(stream, Column.class); + final Column column = readObjectFromResource("/md/column.json", Column.class); assertThat(column, is(notNullValue())); assertThat(column.getTableUri(), is("/gdc/md/PROJECT_ID/obj/9538")); @@ -35,8 +32,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/column.json"); - final Column column = new ObjectMapper().readValue(stream, Column.class); + final Column column = readObjectFromResource("/md/column.json", Column.class); assertThat(column.toString(), matchesPattern(Column.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java index 933ec30e0..baa744821 100644 --- a/src/test/java/com/gooddata/md/DataLoadingColumnTest.java +++ b/src/test/java/com/gooddata/md/DataLoadingColumnTest.java @@ -5,23 +5,20 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; 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; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class DataLoadingColumnTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/dataLoadingColumn.json"); - final DataLoadingColumn column = new ObjectMapper().readValue(stream, DataLoadingColumn.class); + final DataLoadingColumn column = readObjectFromResource("/md/dataLoadingColumn.json", DataLoadingColumn.class); assertThat(column, is(notNullValue())); assertThat(column.getColumnUri(), is("/gdc/md/PROJECT_ID/obj/COLUMN_ID")); @@ -43,8 +40,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/dataLoadingColumn.json"); - final DataLoadingColumn column = new ObjectMapper().readValue(stream, DataLoadingColumn.class); + final DataLoadingColumn column = readObjectFromResource("/md/dataLoadingColumn.json", DataLoadingColumn.class); assertThat(column.toString(), matchesPattern(DataLoadingColumn.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/DatasetTest.java b/src/test/java/com/gooddata/md/DatasetTest.java index b85e52743..b41f0e8ad 100644 --- a/src/test/java/com/gooddata/md/DatasetTest.java +++ b/src/test/java/com/gooddata/md/DatasetTest.java @@ -5,7 +5,12 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import java.util.List; + import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; @@ -13,19 +18,12 @@ import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; -import java.util.List; - public class DatasetTest { @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/dataset.json"); - final Dataset dataset = new ObjectMapper().readValue(stream, Dataset.class); + final Dataset dataset = readObjectFromResource("/md/dataset.json", Dataset.class); assertThat(dataset, is(notNullValue())); diff --git a/src/test/java/com/gooddata/md/DimensionTest.java b/src/test/java/com/gooddata/md/DimensionTest.java index 769afbb5a..c3f3cb207 100644 --- a/src/test/java/com/gooddata/md/DimensionTest.java +++ b/src/test/java/com/gooddata/md/DimensionTest.java @@ -5,25 +5,23 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import java.util.Collection; + import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; -import java.util.Collection; - public class DimensionTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/dimension.json"); - final Dimension dimension = new ObjectMapper().readValue(stream, Dimension.class); + final Dimension dimension = readObjectFromResource("/md/dimension.json", Dimension.class); assertThat(dimension, is(notNullValue())); final Collection attributes = dimension.getAttributes(); diff --git a/src/test/java/com/gooddata/md/DisplayFormTest.java b/src/test/java/com/gooddata/md/DisplayFormTest.java index bf8979d32..e4b5d77d4 100644 --- a/src/test/java/com/gooddata/md/DisplayFormTest.java +++ b/src/test/java/com/gooddata/md/DisplayFormTest.java @@ -5,12 +5,10 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; @@ -27,8 +25,7 @@ public class DisplayFormTest { @SuppressWarnings("deprecation") @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/displayForm.json"); - final DisplayForm displayForm = new ObjectMapper().readValue(stream, DisplayForm.class); + final DisplayForm displayForm = readObjectFromResource("/md/displayForm.json", DisplayForm.class); assertThat(displayForm, is(notNullValue())); assertThat(displayForm.getFormOf(), is(FORM_OF)); diff --git a/src/test/java/com/gooddata/md/EntryTest.java b/src/test/java/com/gooddata/md/EntryTest.java index 1174d274c..894ba0e2a 100644 --- a/src/test/java/com/gooddata/md/EntryTest.java +++ b/src/test/java/com/gooddata/md/EntryTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -13,6 +12,7 @@ import java.util.Set; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Collections.singleton; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -38,7 +38,7 @@ public class EntryTest { @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { - final Entry entry = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/entry.json"), Entry.class); + final Entry entry = readObjectFromResource("/md/entry.json", Entry.class); assertThat(entry, is(notNullValue())); assertThat(entry.getLink(), is(URI)); assertThat(entry.getUri(), is(URI)); diff --git a/src/test/java/com/gooddata/md/ExpressionTest.java b/src/test/java/com/gooddata/md/ExpressionTest.java index 786b2e047..28a080c24 100644 --- a/src/test/java/com/gooddata/md/ExpressionTest.java +++ b/src/test/java/com/gooddata/md/ExpressionTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,11 +18,10 @@ public class ExpressionTest { public static final String DATA = "/gdc/md/PROJECT_ID/obj/EXPR_ID"; public static final String TYPE = "expr"; public static final String JSON = "{\"data\":\"/gdc/md/PROJECT_ID/obj/EXPR_ID\",\"type\":\"expr\"}"; - public static final ObjectMapper MAPPER = new ObjectMapper(); @Test public void testDeserialize() throws Exception { - final Expression expression = MAPPER.readValue(JSON, Expression.class); + final Expression expression = OBJECT_MAPPER.readValue(JSON, Expression.class); assertThat(expression, is(notNullValue())); assertThat(expression.getData(), is(DATA)); assertThat(expression.getType(), is(TYPE)); @@ -31,7 +30,7 @@ public void testDeserialize() throws Exception { @Test public void testSerialize() throws Exception { final Expression expression = new Expression(DATA, TYPE); - assertThat(MAPPER.writeValueAsString(expression), is(JSON)); + assertThat(OBJECT_MAPPER.writeValueAsString(expression), is(JSON)); } @Test diff --git a/src/test/java/com/gooddata/md/FactTest.java b/src/test/java/com/gooddata/md/FactTest.java index 4decd7e40..ce4b2b8c1 100644 --- a/src/test/java/com/gooddata/md/FactTest.java +++ b/src/test/java/com/gooddata/md/FactTest.java @@ -5,10 +5,10 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,7 +19,7 @@ public class FactTest { @Test public void testDeserialization() throws Exception { - final Fact fact = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/fact.json"), Fact.class); + final Fact fact = readObjectFromResource("/md/fact.json", Fact.class); assertThat(fact, is(notNullValue())); assertThat(fact.getExpressions(), is(notNullValue())); assertThat(fact.getExpressions(), hasSize(1)); diff --git a/src/test/java/com/gooddata/md/KeyTest.java b/src/test/java/com/gooddata/md/KeyTest.java index 24be70932..fc79bc57d 100644 --- a/src/test/java/com/gooddata/md/KeyTest.java +++ b/src/test/java/com/gooddata/md/KeyTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -15,14 +15,13 @@ public class KeyTest { - public static final ObjectMapper MAPPER = new ObjectMapper(); public static final String DATA = "/gdc/md/PROJECT_ID/obj/PK_ID"; public static final String TYPE = "col"; public static final String JSON = "{\"data\":\"/gdc/md/PROJECT_ID/obj/PK_ID\",\"type\":\"col\"}"; @Test public void testDeserialize() throws Exception { - final Key key = MAPPER.readValue(JSON, Key.class); + final Key key = OBJECT_MAPPER.readValue(JSON, Key.class); assertThat(key, is(notNullValue())); assertThat(key.getData(), is(DATA)); assertThat(key.getType(), is(TYPE)); @@ -31,7 +30,7 @@ public void testDeserialize() throws Exception { @Test public void testSerialize() throws Exception { final Key key = new Key(DATA, TYPE); - final String json = MAPPER.writeValueAsString(key); + final String json = OBJECT_MAPPER.writeValueAsString(key); assertThat(json, is(JSON)); } diff --git a/src/test/java/com/gooddata/md/MetaTest.java b/src/test/java/com/gooddata/md/MetaTest.java index c91271be6..c13310491 100644 --- a/src/test/java/com/gooddata/md/MetaTest.java +++ b/src/test/java/com/gooddata/md/MetaTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; @@ -14,6 +13,7 @@ import java.util.Set; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -40,7 +40,7 @@ public class MetaTest { @Test public void testDeserialization() throws Exception { - final Meta meta = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/meta.json"), Meta.class); + final Meta meta = readObjectFromResource("/md/meta.json", Meta.class); assertThat(meta, is(notNullValue())); assertThat(meta.getAuthor(), is(AUTHOR)); assertThat(meta.getContributor(), is(CONTRIBUTOR)); diff --git a/src/test/java/com/gooddata/md/MetadataServiceIT.java b/src/test/java/com/gooddata/md/MetadataServiceIT.java index e6a0e552b..8b3919714 100644 --- a/src/test/java/com/gooddata/md/MetadataServiceIT.java +++ b/src/test/java/com/gooddata/md/MetadataServiceIT.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.util.*; +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; @@ -47,9 +48,9 @@ public class MetadataServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); - metricInput = MAPPER.readValue(readFromResource("/md/metric-input.json"), Metric.class); - scheduledMailInput = MAPPER.readValue(readFromResource("/md/scheduledMail.json"), ScheduledMail.class); + project = readObjectFromResource("/project/project.json", Project.class); + metricInput = readObjectFromResource("/md/metric-input.json", Metric.class); + scheduledMailInput = readObjectFromResource("/md/scheduledMail.json", ScheduledMail.class); } @Test @@ -64,7 +65,7 @@ public void testUsedBy() throws Exception { .havingPathEqualTo(USEDBY_URI) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(useMany)); + .withBody(OBJECT_MAPPER.writeValueAsString(useMany)); final Collection result = gd.getMetadataService().usedBy(project, OBJ_URI, false, ReportDefinition.class); @@ -86,7 +87,7 @@ public void testUsedByBatch() throws Exception { .havingPathEqualTo(USEDBY_URI) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(useMany)); + .withBody(OBJECT_MAPPER.writeValueAsString(useMany)); final Collection result = gd.getMetadataService().usedBy(project, new HashSet<>(asList(OBJ_URI, OBJ_URI2)), false, ReportDefinition.class); @@ -156,11 +157,11 @@ public void shouldCreateObj() throws Exception { public void shouldUpdateObj() throws Exception { onRequest() .havingMethodEqualTo("PUT") - .havingBodyEqualTo(MAPPER.writeValueAsString(metricInput)) + .havingBodyEqualTo(OBJECT_MAPPER.writeValueAsString(metricInput)) .havingPathEqualTo(SPECIFIC_OBJ_URI) .respond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(SPECIFIC_OBJ_URI))); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(SPECIFIC_OBJ_URI) diff --git a/src/test/java/com/gooddata/md/MetricTest.java b/src/test/java/com/gooddata/md/MetricTest.java index 7e16e70b5..99435d63e 100644 --- a/src/test/java/com/gooddata/md/MetricTest.java +++ b/src/test/java/com/gooddata/md/MetricTest.java @@ -5,7 +5,10 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.javacrumbs.jsonunit.JsonMatchers.jsonNodeAbsent; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -14,16 +17,11 @@ import static org.hamcrest.Matchers.contains; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import org.testng.annotations.Test; - -import com.fasterxml.jackson.databind.ObjectMapper; - public class MetricTest { @Test public void testDeserialization() throws Exception { - final Metric metric = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + final Metric metric = readObjectFromResource("/md/metric-out.json", Metric.class); assertThat(metric, is(notNullValue())); assertThat(metric.getExpression(), is("SELECT AVG([/gdc/md/PROJECT_ID/obj/EXPR_ID])")); assertThat(metric.getFormat(), is("#,##0")); @@ -41,8 +39,7 @@ public void testDeserialization() throws Exception { @Test public void shouldDeserializeFolder() throws Exception { - final Metric metric = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/metric-folder.json"), Metric.class); + final Metric metric = readObjectFromResource("/md/metric-folder.json", Metric.class); assertThat(metric.getFolders(), contains("/gdc/md/ge06jy0jr6h1hzaxei6d53evw276p3xc/obj/51430")); } @@ -54,8 +51,7 @@ public void testSerialization() throws Exception { @Test public void fullJsonShouldStayTheSameAfterDeserializationAndSerializationBack() throws Exception { - final Metric metric = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + final Metric metric = readObjectFromResource("/md/metric-out.json", Metric.class); assertThat(metric, jsonNodeAbsent("metric.content.tree.content[0].content[0].content[0].content")); assertThat(metric, serializesToJson("/md/metric-out.json")); @@ -63,15 +59,13 @@ public void fullJsonShouldStayTheSameAfterDeserializationAndSerializationBack() @Test public void shouldIgnoreLinksProperty() throws Exception { - final Metric metric = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/metric-links.json"), Metric.class); + final Metric metric = readObjectFromResource("/md/metric-links.json", Metric.class); assertThat(metric, serializesToJson("/md/metric-out.json")); } @Test public void testToStringFormat() throws Exception { - final Metric metric = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/metric-out.json"), Metric.class); + final Metric metric = readObjectFromResource("/md/metric-out.json", Metric.class); assertThat(metric.toString(), matchesPattern(Metric.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/NestedAttributeTest.java b/src/test/java/com/gooddata/md/NestedAttributeTest.java index 302a70c9b..2424ee40e 100644 --- a/src/test/java/com/gooddata/md/NestedAttributeTest.java +++ b/src/test/java/com/gooddata/md/NestedAttributeTest.java @@ -5,24 +5,25 @@ */ package com.gooddata.md; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.Matchers; import org.testng.annotations.Test; import java.util.Collection; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.isEmptyString; +import static org.hamcrest.text.MatchesPattern.matchesPattern; + public class NestedAttributeTest { @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { - final NestedAttribute attribute = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/dimensionAttribute.json"), NestedAttribute.class); + final NestedAttribute attribute = readObjectFromResource("/md/dimensionAttribute.json", NestedAttribute.class); assertThat(attribute, is(notNullValue())); final Collection displayForms = attribute.getDisplayForms(); @@ -60,7 +61,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final NestedAttribute attribute = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/dimensionAttribute.json"), NestedAttribute.class); + final NestedAttribute attribute = readObjectFromResource("/md/dimensionAttribute.json", NestedAttribute.class); assertThat(attribute.toString(), matchesPattern(NestedAttribute.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/ObjTest.java b/src/test/java/com/gooddata/md/ObjTest.java index 7cbccf448..175d7c51c 100644 --- a/src/test/java/com/gooddata/md/ObjTest.java +++ b/src/test/java/com/gooddata/md/ObjTest.java @@ -6,16 +6,15 @@ package com.gooddata.md; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.LinkedHashSet; import java.util.Set; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -39,8 +38,7 @@ public class ObjTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/objCommon.json"); - final AbstractObj obj = new ObjectMapper().readValue(stream, ConcreteObj.class); + final AbstractObj obj = readObjectFromResource("/md/objCommon.json", ConcreteObj.class); assertThat(obj, is(notNullValue())); assertThat(obj.getAuthor(), is(AUTHOR)); diff --git a/src/test/java/com/gooddata/md/ProjectDashboardTest.java b/src/test/java/com/gooddata/md/ProjectDashboardTest.java index 166d15558..8bc4e5e42 100644 --- a/src/test/java/com/gooddata/md/ProjectDashboardTest.java +++ b/src/test/java/com/gooddata/md/ProjectDashboardTest.java @@ -5,21 +5,20 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; - -import org.testng.annotations.Test; - public class ProjectDashboardTest { @Test public void testDeserialization() throws Exception { - final ProjectDashboard dashboard = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/projectDashboard.json"), ProjectDashboard.class); + final ProjectDashboard dashboard = readObjectFromResource("/md/projectDashboard.json", ProjectDashboard.class); assertThat(dashboard.getUri(), is("/gdc/md/PROJECT_ID/obj/12345")); @@ -35,7 +34,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final ProjectDashboard dashboard = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/projectDashboard.json"), ProjectDashboard.class); + final ProjectDashboard dashboard = readObjectFromResource("/md/projectDashboard.json", ProjectDashboard.class); assertThat(dashboard.toString(), matchesPattern(ProjectDashboard.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/QueryTest.java b/src/test/java/com/gooddata/md/QueryTest.java index b4963d67f..87d8dc565 100644 --- a/src/test/java/com/gooddata/md/QueryTest.java +++ b/src/test/java/com/gooddata/md/QueryTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.md; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,7 +17,7 @@ public class QueryTest { @Test public void testDeserialization() throws Exception { - final Query query = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/query.json"), Query.class); + final Query query = readObjectFromResource("/md/query.json", Query.class); assertThat(query, is(notNullValue())); assertThat(query.getCategory(), is("MD::Query::Object")); assertThat(query.getTitle(), is("List of allTypes")); @@ -26,7 +26,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final Query query = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/query.json"), Query.class); + final Query query = readObjectFromResource("/md/query.json", Query.class); assertThat(query.toString(), matchesPattern(Query.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/ScheduledMailTest.java b/src/test/java/com/gooddata/md/ScheduledMailTest.java index 5d845e0d5..991933c34 100644 --- a/src/test/java/com/gooddata/md/ScheduledMailTest.java +++ b/src/test/java/com/gooddata/md/ScheduledMailTest.java @@ -7,14 +7,16 @@ import com.gooddata.JsonMatchers; import com.gooddata.report.ReportExportFormat; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.LocalDate; import org.testng.annotations.Test; import java.util.Arrays; import java.util.Collections; -import static org.hamcrest.CoreMatchers.*; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.hasItems; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.text.MatchesPattern.matchesPattern; @@ -40,7 +42,7 @@ public class ScheduledMailTest { @Test public void testDeserialization() throws Exception { - final ScheduledMail scheduledMail = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/scheduledMail.json"), ScheduledMail.class); + final ScheduledMail scheduledMail = readObjectFromResource("/md/scheduledMail.json", ScheduledMail.class); assertThat(scheduledMail, is(notNullValue())); assertThat(scheduledMail.getToAddresses(), hasItems("email@example.com")); assertThat(scheduledMail.getBccAddresses(), hasItems("secret-email@example.com")); @@ -67,7 +69,7 @@ public void testSerialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final ScheduledMail scheduledMail = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/scheduledMail.json"), ScheduledMail.class); + final ScheduledMail scheduledMail = readObjectFromResource("/md/scheduledMail.json", ScheduledMail.class); assertThat(scheduledMail.toString(), matchesPattern(ScheduledMail.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/TableDataLoadTest.java b/src/test/java/com/gooddata/md/TableDataLoadTest.java index b00bf22d8..d38deb28c 100644 --- a/src/test/java/com/gooddata/md/TableDataLoadTest.java +++ b/src/test/java/com/gooddata/md/TableDataLoadTest.java @@ -5,22 +5,19 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class TableDataLoadTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/tableDataLoad.json"); - final TableDataLoad load = new ObjectMapper().readValue(stream, TableDataLoad.class); + final TableDataLoad load = readObjectFromResource("/md/tableDataLoad.json", TableDataLoad.class); assertThat(load, is(notNullValue())); assertThat(load.getDataSourceLocation(), is("d_zendesktickets_vehicleview_aaavxfdfgqamowg")); @@ -31,8 +28,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/tableDataLoad.json"); - final TableDataLoad load = new ObjectMapper().readValue(stream, TableDataLoad.class); + final TableDataLoad load = readObjectFromResource("/md/tableDataLoad.json", TableDataLoad.class); assertThat(load.toString(), matchesPattern(TableDataLoad.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/TableTest.java b/src/test/java/com/gooddata/md/TableTest.java index 783cbbf65..2f683f86a 100644 --- a/src/test/java/com/gooddata/md/TableTest.java +++ b/src/test/java/com/gooddata/md/TableTest.java @@ -5,23 +5,20 @@ */ package com.gooddata.md; +import org.testng.annotations.Test; + +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.hasItems; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.text.MatchesPattern.matchesPattern; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.testng.annotations.Test; - -import java.io.InputStream; - public class TableTest { @Test public void shouldDeserialize() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/table.json"); - final Table table = new ObjectMapper().readValue(stream, Table.class); + final Table table = readObjectFromResource("/md/table.json", Table.class); assertThat(table, is(notNullValue())); assertThat(table.getDBName(), is("d_zendesktickets_vehicleview")); @@ -33,8 +30,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/md/table.json"); - final Table table = new ObjectMapper().readValue(stream, Table.class); + final Table table = readObjectFromResource("/md/table.json", Table.class); assertThat(table.toString(), matchesPattern(Table.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java index 03bd15331..a526ca825 100644 --- a/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java +++ b/src/test/java/com/gooddata/md/maintenance/ExportImportServiceIT.java @@ -6,6 +6,7 @@ package com.gooddata.md.maintenance; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -23,7 +24,7 @@ public class ExportImportServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); } @Test diff --git a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java index 0da3e56be..30731bde5 100644 --- a/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java +++ b/src/test/java/com/gooddata/md/maintenance/PartialMdArtifactTest.java @@ -5,23 +5,20 @@ */ package com.gooddata.md.maintenance; -import static com.gooddata.JsonMatchers.serializesToJson; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.gdc.UriResponse; import org.testng.annotations.Test; -import java.io.InputStream; +import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; public class PartialMdArtifactTest { @Test public void shouldDeserialize() throws Exception { - final InputStream input = getClass().getResourceAsStream("/md/maintenance/partialMDArtifact.json"); - final PartialMdArtifact partialMdArtifact = new ObjectMapper().readValue(input, PartialMdArtifact.class); + final PartialMdArtifact partialMdArtifact = readObjectFromResource("/md/maintenance/partialMDArtifact.json", PartialMdArtifact.class); assertThat(partialMdArtifact.getStatusUri(), is("/gdc/md/projectId/tasks/taskId/status")); assertThat(partialMdArtifact.getToken(), is("TOKEN123")); diff --git a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java index c4a581ec9..910d24676 100644 --- a/src/test/java/com/gooddata/md/report/AttributeInGridTest.java +++ b/src/test/java/com/gooddata/md/report/AttributeInGridTest.java @@ -5,21 +5,20 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.md.Attribute; import com.gooddata.md.DisplayForm; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Iterator; import java.util.List; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -32,8 +31,7 @@ public class AttributeInGridTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/attributeInGrid.json"); - final AttributeInGrid attr = new ObjectMapper().readValue(is, AttributeInGrid.class); + final AttributeInGrid attr = readObjectFromResource("/md/report/attributeInGrid.json", AttributeInGrid.class); assertThat(attr, is(notNullValue())); assertThat(attr.getUri(), is(URI)); @@ -85,8 +83,7 @@ public void testCreateFromDisplayForm() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/attributeInGrid.json"); - final AttributeInGrid attr = new ObjectMapper().readValue(is, AttributeInGrid.class); + final AttributeInGrid attr = readObjectFromResource("/md/report/attributeInGrid.json", AttributeInGrid.class); assertThat(attr.toString(), matchesPattern(AttributeInGrid.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java index bd0b27ddd..2d3a88e06 100644 --- a/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java +++ b/src/test/java/com/gooddata/md/report/GridElementDeserializerTest.java @@ -5,12 +5,12 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import org.testng.annotations.Test; import java.util.ArrayList; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -21,8 +21,7 @@ public class GridElementDeserializerTest { @Test public void testDeserializer() throws Exception { - final GridElements elems = new ObjectMapper().readValue( - getClass().getResourceAsStream("/md/report/gridElements.json"), GridElements.class); + final GridElements elems = readObjectFromResource("/md/report/gridElements.json", GridElements.class); assertThat(elems, is(notNullValue())); assertThat(elems, hasSize(2)); diff --git a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java index cfea902dc..8c42c85e0 100644 --- a/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/GridReportDefinitionContentTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -20,8 +19,8 @@ public class GridReportDefinitionContentTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/gridReportDefinitionContent.json"); - final GridReportDefinitionContent def = (GridReportDefinitionContent) new ObjectMapper().readValue(is, ReportDefinitionContent.class); + final GridReportDefinitionContent def = (GridReportDefinitionContent) + readObjectFromResource("/md/report/gridReportDefinitionContent.json", ReportDefinitionContent.class); assertThat(def, is(notNullValue())); assertThat(def.getFormat(), is("grid")); assertThat(def.getGrid(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/md/report/GridTest.java b/src/test/java/com/gooddata/md/report/GridTest.java index 525c84b9e..b7ce8cd8a 100644 --- a/src/test/java/com/gooddata/md/report/GridTest.java +++ b/src/test/java/com/gooddata/md/report/GridTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.hamcrest.CoreMatchers; import org.testng.annotations.Test; @@ -16,19 +15,20 @@ import static com.gooddata.JsonMatchers.serializesToJson; import static com.gooddata.md.report.MetricGroup.METRIC_GROUP; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; public class GridTest { @Test public void testDeserialization() throws Exception { - final Grid grid = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/report/grid.json"), Grid.class); + final Grid grid = readObjectFromResource("/md/report/grid.json", Grid.class); assertThat(grid, is(notNullValue())); assertThat(grid.getColumns(), is(notNullValue())); @@ -63,15 +63,14 @@ public void testSerialization() throws Exception { asList(new AttributeInGrid("/gdc/md/PROJECT_ID/obj/ATTR_ID", "attr")), asList(new MetricElement("/gdc/md/PROJECT_ID/obj/METR_ID", "metr")), sort, asList(colWidths)); - new ObjectMapper().writeValueAsString(grid); + OBJECT_MAPPER.writeValueAsString(grid); assertThat(grid, serializesToJson("/md/report/grid-input.json")); } @Test public void testToStringFormat() throws Exception { - final Grid grid = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/md/report/grid.json"), Grid.class); + final Grid grid = readObjectFromResource("/md/report/grid.json", Grid.class); assertThat(grid.toString(), matchesPattern(Grid.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/report/MetricElementTest.java b/src/test/java/com/gooddata/md/report/MetricElementTest.java index 6b337f556..ce34e837f 100644 --- a/src/test/java/com/gooddata/md/report/MetricElementTest.java +++ b/src/test/java/com/gooddata/md/report/MetricElementTest.java @@ -5,13 +5,11 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.md.Metric; import org.testng.annotations.Test; -import java.io.InputStream; - import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -28,8 +26,7 @@ public class MetricElementTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/metricElement.json"); - final MetricElement element = new ObjectMapper().readValue(is, MetricElement.class); + final MetricElement element = readObjectFromResource("/md/report/metricElement.json", MetricElement.class); assertThat(element, is(notNullValue())); assertThat(element.getUri(), is(URI)); assertThat(element.getAlias(), is(ALIAS)); diff --git a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java index 8d212477f..f3ecb401b 100644 --- a/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/OneNumberReportDefinitionContentTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -20,9 +19,8 @@ public class OneNumberReportDefinitionContentTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinitionContent.json"); - final OneNumberReportDefinitionContent def = (OneNumberReportDefinitionContent) new ObjectMapper() - .readValue(is, ReportDefinitionContent.class); + final OneNumberReportDefinitionContent def = (OneNumberReportDefinitionContent) + readObjectFromResource("/md/report/oneNumberReportDefinitionContent.json", ReportDefinitionContent.class); assertThat(def, is(notNullValue())); assertThat(def.getFormat(), is("oneNumber")); assertThat(def.getGrid(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java index a33690ac4..b3fe0e08f 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionContentTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -21,8 +20,7 @@ public class ReportDefinitionContentTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/gridReportDefinitionContent.json"); - final ReportDefinitionContent def = new ObjectMapper().readValue(is, ReportDefinitionContent.class); + final ReportDefinitionContent def = readObjectFromResource("/md/report/gridReportDefinitionContent.json", ReportDefinitionContent.class); assertThat(def, is(notNullValue())); assertThat(def.getFormat(), is("grid")); assertThat(def.getGrid(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java index b9e61cb89..7ed37b1b2 100644 --- a/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java +++ b/src/test/java/com/gooddata/md/report/ReportDefinitionTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collections; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -24,8 +23,7 @@ public class ReportDefinitionTest { @Test public void testDeserialization() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinition.json"); - final ReportDefinition def = new ObjectMapper().readValue(is, ReportDefinition.class); + final ReportDefinition def = readObjectFromResource("/md/report/oneNumberReportDefinition.json", ReportDefinition.class); assertThat(def, is(notNullValue())); assertThat(def.getFormat(), is(FORMAT)); assertThat(def.getGrid(), is(notNullValue())); @@ -44,8 +42,7 @@ public void testSerialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream is = getClass().getResourceAsStream("/md/report/oneNumberReportDefinition.json"); - final ReportDefinition def = new ObjectMapper().readValue(is, ReportDefinition.class); + final ReportDefinition def = readObjectFromResource("/md/report/oneNumberReportDefinition.json", ReportDefinition.class); assertThat(def.toString(), matchesPattern(ReportDefinition.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/md/report/ReportTest.java b/src/test/java/com/gooddata/md/report/ReportTest.java index 847d09b29..2383c4aa5 100644 --- a/src/test/java/com/gooddata/md/report/ReportTest.java +++ b/src/test/java/com/gooddata/md/report/ReportTest.java @@ -5,14 +5,14 @@ */ package com.gooddata.md.report; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; -import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -24,7 +24,7 @@ public class ReportTest { @Test public void testDeserialization() throws Exception { - final Report report = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/report/report.json"), Report.class); + final Report report = readObjectFromResource("/md/report/report.json", Report.class); assertThat(report, is(notNullValue())); assertThat(report.getDefinitions(), is(notNullValue())); assertThat(report.getDefinitions(), hasSize(1)); @@ -46,7 +46,7 @@ public void testSerialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final Report report = new ObjectMapper().readValue(getClass().getResourceAsStream("/md/report/report.json"), Report.class); + final Report report = readObjectFromResource("/md/report/report.json", Report.class); assertThat(report.toString(), matchesPattern(Report.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/model/DiffRequestTest.java b/src/test/java/com/gooddata/model/DiffRequestTest.java index 6d15c45c0..e532761db 100644 --- a/src/test/java/com/gooddata/model/DiffRequestTest.java +++ b/src/test/java/com/gooddata/model/DiffRequestTest.java @@ -5,19 +5,17 @@ */ package com.gooddata.model; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class DiffRequestTest { - private static final ObjectMapper mapper = new ObjectMapper(); - @Test public void testSerialization() throws Exception { - String valueAsString = mapper.writeValueAsString(new DiffRequest("{\"projectModel\":\"xxx\"}")); + String valueAsString = OBJECT_MAPPER.writeValueAsString(new DiffRequest("{\"projectModel\":\"xxx\"}")); assertThat(valueAsString, is("{\"diffRequest\":{\"targetModel\":{\"projectModel\":\"xxx\"}}}")); } } diff --git a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java index d9687eaa1..2b7533c1e 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlLinksTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.model; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,8 +17,7 @@ public class MaqlDdlLinksTest { @SuppressWarnings("deprecation") @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/model/maqlDdlLinks.json"); - final MaqlDdlLinks maqlDdlLinks = new ObjectMapper().readValue(stream, MaqlDdlLinks.class); + final MaqlDdlLinks maqlDdlLinks = readObjectFromResource("/model/maqlDdlLinks.json", MaqlDdlLinks.class); assertThat(maqlDdlLinks, is(notNullValue())); assertThat(maqlDdlLinks.getStatusLink(), is("/gdc/md/PROJECT_ID/tasks/123/status")); diff --git a/src/test/java/com/gooddata/model/MaqlDdlTest.java b/src/test/java/com/gooddata/model/MaqlDdlTest.java index 59c368991..d70267204 100644 --- a/src/test/java/com/gooddata/model/MaqlDdlTest.java +++ b/src/test/java/com/gooddata/model/MaqlDdlTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.model; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -15,7 +15,7 @@ public class MaqlDdlTest { @Test public void testSerialization() throws Exception { - assertThat(new ObjectMapper().writeValueAsString(new MaqlDdl("maqlddl")), + assertThat(OBJECT_MAPPER.writeValueAsString(new MaqlDdl("maqlddl")), is("{\"manage\":{\"maql\":\"maqlddl\"}}")); } diff --git a/src/test/java/com/gooddata/model/ModelDiffTest.java b/src/test/java/com/gooddata/model/ModelDiffTest.java index 2a1758b56..8ec6f81c5 100644 --- a/src/test/java/com/gooddata/model/ModelDiffTest.java +++ b/src/test/java/com/gooddata/model/ModelDiffTest.java @@ -5,13 +5,12 @@ */ package com.gooddata.model; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.Collections; import static com.gooddata.model.ModelDiff.UpdateScript; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; @@ -76,8 +75,7 @@ public void testGetUpdateMaqlsNoMaqlInUpdateScript() throws Exception { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/model/modelDiff.json"); - final ModelDiff diff = new ObjectMapper().readValue(stream, ModelDiff.class); + final ModelDiff diff = readObjectFromResource("/model/modelDiff.json", ModelDiff.class); assertThat(diff, is(notNullValue())); assertThat(diff.getUpdateScripts(), hasSize(2)); diff --git a/src/test/java/com/gooddata/model/ModelServiceIT.java b/src/test/java/com/gooddata/model/ModelServiceIT.java index bfce9a281..a661daa26 100644 --- a/src/test/java/com/gooddata/model/ModelServiceIT.java +++ b/src/test/java/com/gooddata/model/ModelServiceIT.java @@ -13,7 +13,9 @@ import org.testng.annotations.Test; import static com.gooddata.model.ModelDiff.UpdateScript; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; @@ -30,7 +32,7 @@ public class ModelServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); } @Test @@ -40,13 +42,13 @@ public void shouldCreateDiff() throws Exception { .havingPathEqualTo(DIFF_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(DIFF_POLL_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))) .thenRespond() .withStatus(200) .withBody(readFromResource("/model/modelDiff.json")) @@ -65,7 +67,7 @@ public void shouldFailCreateDiff() throws Exception { .havingPathEqualTo(DIFF_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(DIFF_POLL_URI))); onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(DIFF_POLL_URI) @@ -89,10 +91,10 @@ public void shouldUpdateModel() throws Exception { .havingPathEqualTo(STATUS_URI) .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("RUNNING", STATUS_URI))) .thenRespond() .withStatus(200) - .withBody(MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("OK", STATUS_URI))) ; final ModelDiff diff = new ModelDiff(new UpdateScript(true, false, diff --git a/src/test/java/com/gooddata/notification/NotificationServiceIT.java b/src/test/java/com/gooddata/notification/NotificationServiceIT.java index b79a4ab4a..c80c6d58c 100644 --- a/src/test/java/com/gooddata/notification/NotificationServiceIT.java +++ b/src/test/java/com/gooddata/notification/NotificationServiceIT.java @@ -6,6 +6,7 @@ package com.gooddata.notification; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static java.util.Collections.singletonMap; import static net.jadler.Jadler.onRequest; @@ -23,7 +24,7 @@ public class NotificationServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - project = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); + project = readObjectFromResource("/project/project.json", Project.class); } @Test diff --git a/src/test/java/com/gooddata/project/ProjectServiceIT.java b/src/test/java/com/gooddata/project/ProjectServiceIT.java index e67ad1f50..e09400f81 100644 --- a/src/test/java/com/gooddata/project/ProjectServiceIT.java +++ b/src/test/java/com/gooddata/project/ProjectServiceIT.java @@ -11,12 +11,17 @@ import com.gooddata.gdc.AsyncTask; import com.gooddata.gdc.TaskStatus; import com.gooddata.gdc.UriResponse; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import java.util.Collection; +import java.util.List; +import java.util.Set; + import static com.gooddata.JsonMatchers.isJsonString; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; @@ -24,14 +29,8 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; -import java.util.Collection; -import java.util.List; -import java.util.Set; - public class ProjectServiceIT extends AbstractGoodDataIT { - private static final ObjectMapper MAPPER = new ObjectMapper(); - private static final String PROJECT_ID = "PROJECT_ID"; private static final String PROJECT_URI = "/gdc/projects/" + PROJECT_ID; @@ -41,9 +40,9 @@ public class ProjectServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - loading = MAPPER.readValue(readFromResource("/project/project-loading.json"), Project.class); - enabled = MAPPER.readValue(readFromResource("/project/project.json"), Project.class); - deleted = MAPPER.readValue(readFromResource("/project/project-deleted.json"), Project.class); + loading = readObjectFromResource("/project/project-loading.json", Project.class); + enabled = readObjectFromResource("/project/project.json", Project.class); + deleted = readObjectFromResource("/project/project-deleted.json", Project.class); } @Test @@ -52,17 +51,17 @@ public void shouldCreateProject() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(Projects.URI) .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) .withStatus(202) ; onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(PROJECT_URI) .respond() - .withBody(MAPPER.writeValueAsString(loading)) + .withBody(OBJECT_MAPPER.writeValueAsString(loading)) .withStatus(202) .thenRespond() - .withBody(MAPPER.writeValueAsString(enabled)) + .withBody(OBJECT_MAPPER.writeValueAsString(enabled)) .withStatus(200) ; @@ -88,7 +87,7 @@ public void shouldFailWhenPollFails() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(Projects.URI) .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) .withStatus(202) ; onRequest() @@ -108,14 +107,14 @@ public void shouldFailWhenCantCreateProject() throws Exception { .havingMethodEqualTo("POST") .havingPathEqualTo(Projects.URI) .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(PROJECT_URI))) .withStatus(202) ; onRequest() .havingMethodEqualTo("GET") .havingPathEqualTo(PROJECT_URI) .respond() - .withBody(MAPPER.writeValueAsString(deleted)) + .withBody(OBJECT_MAPPER.writeValueAsString(deleted)) .withStatus(200) ; @@ -175,23 +174,23 @@ public void shouldValidateProject() throws Exception { .havingMethodEqualTo("POST") .havingBody(isJsonString("/project/project-validate.json")) .respond() - .withBody(MAPPER.writeValueAsString(new AsyncTask(task1Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(task1Uri))) .withStatus(201); onRequest() .havingPathEqualTo(task1Uri) .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse(task2Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(task2Uri))) .withHeader("Location", task2Uri) .withStatus(303); onRequest() .havingPathEqualTo(task2Uri) .respond() - .withBody(MAPPER.writeValueAsString(new AsyncTask(task2Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(task2Uri))) .withStatus(202) .thenRespond() - .withBody(MAPPER.writeValueAsString(new UriResponse(resultUri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(resultUri))) .withHeader("Location", resultUri) .withStatus(303); @@ -223,21 +222,21 @@ public void shouldValidateProject2() throws Exception { .havingMethodEqualTo("POST") .havingBody(isJsonString("/project/project-validate.json")) .respond() - .withBody(MAPPER.writeValueAsString(new AsyncTask(task1Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new AsyncTask(task1Uri))) .withStatus(201); onRequest() .havingPathEqualTo(task1Uri) .respond() - .withBody(MAPPER.writeValueAsString(new UriResponse(task2Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(task2Uri))) .withHeader("Location", task1Uri) .withStatus(303) .thenRespond() - .withBody(MAPPER.writeValueAsString(new TaskStatus("RUNNING", task2Uri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new TaskStatus("RUNNING", task2Uri))) .withHeader("Location", task1Uri) .withStatus(202) .thenRespond() - .withBody(MAPPER.writeValueAsString(new UriResponse(resultUri))) + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse(resultUri))) .withHeader("Location", resultUri) .withStatus(303) ; diff --git a/src/test/java/com/gooddata/project/ProjectTemplateTest.java b/src/test/java/com/gooddata/project/ProjectTemplateTest.java index a770eec07..39495e1d4 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplateTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplateTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,8 +17,7 @@ public class ProjectTemplateTest { @Test public void shouldDeserialize() throws Exception { - final ProjectTemplate template = new ObjectMapper() - .readValue(getClass().getResource("/project/project-template.json"), ProjectTemplate.class); + final ProjectTemplate template = readObjectFromResource("/project/project-template.json", ProjectTemplate.class); assertThat(template, is(notNullValue())); assertThat(template.getUrl(), is("/projectTemplates/ZendeskAnalytics/11")); @@ -28,8 +27,7 @@ public void shouldDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final ProjectTemplate template = new ObjectMapper() - .readValue(getClass().getResource("/project/project-template.json"), ProjectTemplate.class); + final ProjectTemplate template = readObjectFromResource("/project/project-template.json", ProjectTemplate.class); assertThat(template.toString(), matchesPattern(ProjectTemplate.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java index abd90ea41..9a8a34acc 100644 --- a/src/test/java/com/gooddata/project/ProjectTemplatesTest.java +++ b/src/test/java/com/gooddata/project/ProjectTemplatesTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -17,8 +17,7 @@ public class ProjectTemplatesTest { @Test public void shouldDeserialize() throws Exception { - final ProjectTemplates templates = new ObjectMapper() - .readValue(getClass().getResource("/project/project-templates.json"), ProjectTemplates.class); + final ProjectTemplates templates = readObjectFromResource("/project/project-templates.json", ProjectTemplates.class); assertThat(templates, is(notNullValue())); assertThat(templates.getTemplatesInfo(), is(notNullValue())); diff --git a/src/test/java/com/gooddata/project/ProjectTest.java b/src/test/java/com/gooddata/project/ProjectTest.java index 7b57e6c8b..fc488c44a 100644 --- a/src/test/java/com/gooddata/project/ProjectTest.java +++ b/src/test/java/com/gooddata/project/ProjectTest.java @@ -5,12 +5,15 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; -import static org.hamcrest.CoreMatchers.*; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringStartsWith.startsWith; @@ -21,8 +24,7 @@ public class ProjectTest { @SuppressWarnings("deprecation") @Test public void testDeserialize() throws Exception { - final Project project = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project.json"), Project.class); + final Project project = readObjectFromResource("/project/project.json", Project.class); assertThat(project, is(notNullValue())); assertThat(project.getAuthorizationToken(), is("AUTH_TOKEN")); @@ -79,7 +81,7 @@ public void testSerialize() throws Exception { final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); project.setProjectTemplate("/projectTemplates/TEMPLATE"); project.setEnvironment(ProjectEnvironment.TESTING); - final String serializedProject = new ObjectMapper().writeValueAsString(project); + final String serializedProject = OBJECT_MAPPER.writeValueAsString(project); assertThat(serializedProject, startsWith("{\"project\"")); @@ -107,8 +109,7 @@ public void testSerialize() throws Exception { @Test public void testDeserializeVerticaProject() throws Exception { - final Project project = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-vertica.json"), Project.class); + final Project project = readObjectFromResource("/project/project-vertica.json", Project.class); assertThat(project, is(notNullValue())); assertThat(project.getDriver(), is("vertica")); @@ -121,7 +122,7 @@ public void testSerializeVerticaProject() throws Exception { final Project project = new Project("TITLE", "SUMMARY", "TOKEN"); project.setDriver(ProjectDriver.VERTICA); project.setProjectTemplate("/projectTemplates/TEMPLATE"); - final String serializedProject = new ObjectMapper().writeValueAsString(project); + final String serializedProject = OBJECT_MAPPER.writeValueAsString(project); assertThat(serializedProject, startsWith("{\"project\"")); assertThat(serializedProject, containsString("\"driver\":\"vertica\"")); diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java index 301c00d7c..13451c5e0 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultItemTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -16,8 +16,7 @@ public class ProjectValidationResultItemTest { @Test public void testDeserialize() throws Exception { - final ProjectValidationResultItem item = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-validationResultItem.json"), ProjectValidationResultItem.class); + final ProjectValidationResultItem item = readObjectFromResource("/project/project-validationResultItem.json", ProjectValidationResultItem.class); assertThat(item.getValidation(), is(ProjectValidationType.PDM_TRANSITIVITY)); assertThat(item.getLogs(), hasSize(3)); diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java index 0a2480896..a64ae2f2f 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultParamTest.java @@ -11,6 +11,7 @@ import java.util.List; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.shazam.shazamcrest.matcher.Matchers.sameBeanAs; import static java.util.Arrays.asList; import static org.hamcrest.MatcherAssert.assertThat; @@ -20,7 +21,7 @@ public class ProjectValidationResultParamTest { @Test public void testDeser() throws Exception { - final List result = new ObjectMapper() + final List result = OBJECT_MAPPER .readValue(getClass().getResourceAsStream("/project/project-validationResultParam.json"), new TypeReference>() { }); diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java index 143f5ec99..ec80813cf 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; @@ -17,8 +17,7 @@ public class ProjectValidationResultTest { @Test public void testDeserialize() throws Exception { - final ProjectValidationResult log = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-validationResultLog.json"), ProjectValidationResult.class); + final ProjectValidationResult log = readObjectFromResource("/project/project-validationResultLog.json", ProjectValidationResult.class); assertThat(log.getCategory(), is("TRANSITIVITY")); assertThat(log.getLevel(), is("WARN")); @@ -29,8 +28,7 @@ public void testDeserialize() throws Exception { @Test public void testToStringFormat() throws Exception { - final ProjectValidationResult log = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-validationResultLog.json"), ProjectValidationResult.class); + final ProjectValidationResult log = readObjectFromResource("/project/project-validationResultLog.json", ProjectValidationResult.class); assertThat(log.toString(), matchesPattern(ProjectValidationResult.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java index 44b3c0971..aff7ebb9d 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationResultsTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -16,8 +16,7 @@ public class ProjectValidationResultsTest { @Test public void testDeserialize() throws Exception { - final ProjectValidationResults result = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-validationResults.json"), ProjectValidationResults.class); + final ProjectValidationResults result = readObjectFromResource("/project/project-validationResults.json", ProjectValidationResults.class); assertThat(result.isError(), is(true)); assertThat(result.isFatalError(), is(true)); diff --git a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java index 1489a1fc8..08968de9a 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationTypeTest.java @@ -5,9 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -16,13 +16,13 @@ public class ProjectValidationTypeTest { @Test public void testSerialize() throws Exception { - final String myValidationType = new ObjectMapper().writeValueAsString(new ProjectValidationType("myValidationType")); + final String myValidationType = OBJECT_MAPPER.writeValueAsString(new ProjectValidationType("myValidationType")); assertThat(myValidationType, is("\"myValidationType\"")); } @Test public void testDeserialize() throws Exception { - final ProjectValidationType myValidationType = new ObjectMapper().readValue("\"myValidationType\"", ProjectValidationType.class); + final ProjectValidationType myValidationType = OBJECT_MAPPER.readValue("\"myValidationType\"", ProjectValidationType.class); assertThat(myValidationType, notNullValue()); assertThat(myValidationType.getValue(), is("myValidationType")); } diff --git a/src/test/java/com/gooddata/project/ProjectValidationsTest.java b/src/test/java/com/gooddata/project/ProjectValidationsTest.java index b30c09211..59edcb881 100644 --- a/src/test/java/com/gooddata/project/ProjectValidationsTest.java +++ b/src/test/java/com/gooddata/project/ProjectValidationsTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import static com.gooddata.JsonMatchers.serializesToJson; @@ -16,6 +15,7 @@ import static com.gooddata.project.ProjectValidationType.PDM_PK_FK_CONSISTENCY; import static com.gooddata.project.ProjectValidationType.PDM_TRANSITIVITY; import static com.gooddata.project.ProjectValidationType.PDM_VS_DWH; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.is; @@ -32,8 +32,7 @@ public void testSerialize() throws Exception { @Test public void testDeserialize() throws Exception { - final ProjectValidations validations = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/project/project-validationAvail.json"), ProjectValidations.class); + final ProjectValidations validations = readObjectFromResource("/project/project-validationAvail.json", ProjectValidations.class); assertThat(validations, is(notNullValue())); assertThat(validations.getValidations(), hasItems(PDM_VS_DWH, METRIC_FILTER, PDM_TRANSITIVITY, LDM, diff --git a/src/test/java/com/gooddata/project/RoleTest.java b/src/test/java/com/gooddata/project/RoleTest.java index 727ea63d8..ab57782a5 100644 --- a/src/test/java/com/gooddata/project/RoleTest.java +++ b/src/test/java/com/gooddata/project/RoleTest.java @@ -5,12 +5,11 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.io.IOException; -import java.io.InputStream; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; @@ -44,7 +43,6 @@ public void testEquals() throws IOException { } private Role readRole(final String suffix) throws java.io.IOException { - final InputStream stream = getClass().getResourceAsStream("/project/project-role" + suffix + ".json"); - return new ObjectMapper().readValue(stream, Role.class); + return readObjectFromResource("/project/project-role" + suffix + ".json", Role.class); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/project/RolesTest.java b/src/test/java/com/gooddata/project/RolesTest.java index 4d878869c..d63574f0f 100644 --- a/src/test/java/com/gooddata/project/RolesTest.java +++ b/src/test/java/com/gooddata/project/RolesTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.notNullValue; @@ -20,8 +18,7 @@ public class RolesTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/project/project-roles.json"); - final Roles roles = new ObjectMapper().readValue(stream, Roles.class); + final Roles roles = readObjectFromResource("/project/project-roles.json", Roles.class); assertThat(roles, notNullValue()); assertThat(roles.getRoles(), hasSize(2)); @@ -31,8 +28,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/project/project-roles.json"); - final Roles roles = new ObjectMapper().readValue(stream, Roles.class); + final Roles roles = readObjectFromResource("/project/project-roles.json", Roles.class); assertThat(roles.toString(), matchesPattern(Roles.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/project/UserTest.java b/src/test/java/com/gooddata/project/UserTest.java index 46f48beed..5edb8b6b6 100644 --- a/src/test/java/com/gooddata/project/UserTest.java +++ b/src/test/java/com/gooddata/project/UserTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; @@ -20,8 +18,7 @@ public class UserTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/project/project-user.json"); - final User user = new ObjectMapper().readValue(stream, User.class); + final User user = readObjectFromResource("/project/project-user.json", User.class); assertThat(user, notNullValue()); assertThat(user.getEmail(), is("ateam+ads-testing@gooddata.com")); @@ -35,8 +32,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/project/project-user.json"); - final User user = new ObjectMapper().readValue(stream, User.class); + final User user = readObjectFromResource("/project/project-user.json", User.class); assertThat(user.toString(), matchesPattern(User.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/project/UsersTest.java b/src/test/java/com/gooddata/project/UsersTest.java index fbd820df8..dcf74a6c3 100644 --- a/src/test/java/com/gooddata/project/UsersTest.java +++ b/src/test/java/com/gooddata/project/UsersTest.java @@ -5,11 +5,9 @@ */ package com.gooddata.project; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; - +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.is; @@ -21,8 +19,7 @@ public class UsersTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/project/project-users.json"); - final Users users = new ObjectMapper().readValue(stream, Users.class); + final Users users = readObjectFromResource("/project/project-users.json", Users.class); assertThat(users, notNullValue()); assertThat(users, hasSize(1)); diff --git a/src/test/java/com/gooddata/report/ReportServiceIT.java b/src/test/java/com/gooddata/report/ReportServiceIT.java index 1498176c0..1b2b8768d 100644 --- a/src/test/java/com/gooddata/report/ReportServiceIT.java +++ b/src/test/java/com/gooddata/report/ReportServiceIT.java @@ -16,7 +16,9 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.port; import static org.hamcrest.Matchers.is; @@ -39,7 +41,7 @@ public void setUp() throws IOException { .havingMethodEqualTo("POST") .respond() .withStatus(202) - .withBody(MAPPER.writeValueAsString(new UriResponse("http://localhost:" + port() + URI))); + .withBody(OBJECT_MAPPER.writeValueAsString(new UriResponse("http://localhost:" + port() + URI))); onRequest() .havingPathEqualTo(URI) .havingMethodEqualTo("GET") @@ -53,7 +55,7 @@ public void setUp() throws IOException { @Test public void shouldExportReportDefinition() throws Exception { - final ReportDefinition rd = MAPPER.readValue(readFromResource("/md/report/gridReportDefinition.json"), ReportDefinition.class); + final ReportDefinition rd = readObjectFromResource("/md/report/gridReportDefinition.json", ReportDefinition.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); @@ -61,7 +63,7 @@ public void shouldExportReportDefinition() throws Exception { @Test public void shouldExportReport() throws Exception { - final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); + final Report rd = readObjectFromResource("/md/report/report.json", Report.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); assertThat(output.toString(StandardCharsets.US_ASCII.name()), is(RESPONSE)); @@ -75,7 +77,7 @@ public void shouldFail() throws Exception { .respond() .withStatus(400); - final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); + final Report rd = readObjectFromResource("/md/report/report.json", Report.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); } @@ -88,7 +90,7 @@ public void shouldFailNoData() throws Exception { .respond() .withStatus(204); - final Report rd = MAPPER.readValue(readFromResource("/md/report/report.json"), Report.class); + final Report rd = readObjectFromResource("/md/report/report.json", Report.class); final ByteArrayOutputStream output = new ByteArrayOutputStream(); gd.getReportService().exportReport(rd, ReportExportFormat.CSV, output).get(); } diff --git a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java index f723e2345..4680a237d 100644 --- a/src/test/java/com/gooddata/util/BooleanDeserializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanDeserializerTest.java @@ -9,54 +9,53 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class BooleanDeserializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void shouldDeserializeIntegerTrue() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanIntegerClass(true)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").numberValue().intValue(), is(1)); - final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); + final BooleanIntegerClass moo = OBJECT_MAPPER.readValue(json, BooleanIntegerClass.class); assertThat(moo.isFoo(), is(true)); } @Test public void shouldDeserializeIntegerFalse() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanIntegerClass(false)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").numberValue().intValue(), is(0)); - final BooleanIntegerClass moo = MAPPER.readValue(json, BooleanIntegerClass.class); + final BooleanIntegerClass moo = OBJECT_MAPPER.readValue(json, BooleanIntegerClass.class); assertThat(moo.isFoo(), is(false)); } @Test public void shouldDeserializeStringTrue() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanStringClass(true)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").textValue(), is("1")); - final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + final BooleanStringClass moo = OBJECT_MAPPER.readValue(json, BooleanStringClass.class); assertThat(moo.isFoo(), is(true)); } @Test public void shouldDeserializeStringFalse() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanStringClass(false)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").textValue(), is("0")); - final BooleanStringClass moo = MAPPER.readValue(json, BooleanStringClass.class); + final BooleanStringClass moo = OBJECT_MAPPER.readValue(json, BooleanStringClass.class); assertThat(moo.isFoo(), is(false)); } diff --git a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java index 7db295878..796f4a002 100644 --- a/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanIntegerSerializerTest.java @@ -6,29 +6,27 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class BooleanIntegerSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void shouldSerializeTrue() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(true)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanIntegerClass(true)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").numberValue().intValue(), is(1)); } @Test public void shouldSerializeFalse() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanIntegerClass(false)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanIntegerClass(false)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").numberValue().intValue(), is(0)); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java index c4a2ce598..32db34423 100644 --- a/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java +++ b/src/test/java/com/gooddata/util/BooleanStringSerializerTest.java @@ -6,29 +6,27 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class BooleanStringSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void shouldSerializeTrue() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(true)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanStringClass(true)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").textValue(), is("1")); } @Test public void shouldSerializeFalse() throws Exception { - final String json = MAPPER.writeValueAsString(new BooleanStringClass(false)); + final String json = OBJECT_MAPPER.writeValueAsString(new BooleanStringClass(false)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("foo").textValue(), is("0")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java index 2119896f9..3a232cd06 100644 --- a/src/test/java/com/gooddata/util/GDDateDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateDeserializerTest.java @@ -10,21 +10,20 @@ import org.joda.time.LocalDate; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class GDDateDeserializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeserialize() throws Exception { - final String json = MAPPER.writeValueAsString(new GDDateClass(new LocalDate(2012, 3, 20))); + final String json = OBJECT_MAPPER.writeValueAsString(new GDDateClass(new LocalDate(2012, 3, 20))); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20")); - final GDDateClass date = MAPPER.readValue(json, GDDateClass.class); + final GDDateClass date = OBJECT_MAPPER.readValue(json, GDDateClass.class); assertThat(date.getDate(), is(new LocalDate(2012, 3, 20))); } diff --git a/src/test/java/com/gooddata/util/GDDateSerializerTest.java b/src/test/java/com/gooddata/util/GDDateSerializerTest.java index 6abd62593..4a47c9b60 100644 --- a/src/test/java/com/gooddata/util/GDDateSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateSerializerTest.java @@ -6,22 +6,20 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.LocalDate; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class GDDateSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testSerialize() throws Exception { final GDDateClass foo = new GDDateClass(new LocalDate(2012, 3, 20)); - final String json = MAPPER.writeValueAsString(foo); - final JsonNode node = MAPPER.readTree(json); + final String json = OBJECT_MAPPER.writeValueAsString(foo); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20")); } diff --git a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java index 4f57321e0..a5511d9a9 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeDeserializerTest.java @@ -6,26 +6,24 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class GDDateTimeDeserializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeserialize() throws Exception { - final String json = MAPPER.writeValueAsString(new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); + final String json = OBJECT_MAPPER.writeValueAsString(new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC))); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20 14:31:05")); - final GDDateTimeClass date = MAPPER.readValue(json, GDDateTimeClass.class); + final GDDateTimeClass date = OBJECT_MAPPER.readValue(json, GDDateTimeClass.class); assertThat(date.getDate(), is(new DateTime(2012, 3, 20, 14, 31, 5, DateTimeZone.UTC))); } } diff --git a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java index 6321c0689..0f90d2a60 100644 --- a/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/GDDateTimeSerializerTest.java @@ -6,23 +6,21 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class GDDateTimeSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testSerialize() throws Exception { final GDDateTimeClass foo = new GDDateTimeClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); - final String json = MAPPER.writeValueAsString(foo); - final JsonNode node = MAPPER.readTree(json); + final String json = OBJECT_MAPPER.writeValueAsString(foo); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20 14:31:05")); } diff --git a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java index 34af7035b..ac284909e 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeDeserializerTest.java @@ -6,27 +6,25 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class ISODateTimeDeserializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testDeserialize() throws Exception { final DateTime expected = new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC); - final String json = MAPPER.writeValueAsString(new ISODateClass(expected)); + final String json = OBJECT_MAPPER.writeValueAsString(new ISODateClass(expected)); - final JsonNode node = MAPPER.readTree(json); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20T14:31:05.003Z")); - final ISODateClass moo = MAPPER.readValue(json, ISODateClass.class); + final ISODateClass moo = OBJECT_MAPPER.readValue(json, ISODateClass.class); assertThat(moo.getDate(), is(expected)); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java index eb6ef0c72..58d055fc2 100644 --- a/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java +++ b/src/test/java/com/gooddata/util/ISODateTimeSerializerTest.java @@ -6,23 +6,21 @@ package com.gooddata.util; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; public class ISODateTimeSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void testSerialize() throws Exception { final ISODateClass foo = new ISODateClass(new DateTime(2012, 3, 20, 14, 31, 5, 3, DateTimeZone.UTC)); - final String json = MAPPER.writeValueAsString(foo); - final JsonNode node = MAPPER.readTree(json); + final String json = OBJECT_MAPPER.writeValueAsString(foo); + final JsonNode node = OBJECT_MAPPER.readTree(json); assertThat(node.path("date").textValue(), is("2012-03-20T14:31:05.003Z")); } diff --git a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java index 3d4addcc1..f4450491a 100644 --- a/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java +++ b/src/test/java/com/gooddata/util/ResponseErrorHandlerTest.java @@ -5,7 +5,6 @@ */ package com.gooddata.util; -import com.fasterxml.jackson.databind.ObjectMapper; import com.gooddata.GoodData; import com.gooddata.GoodDataRestException; import org.springframework.http.HttpHeaders; @@ -18,6 +17,7 @@ import java.io.IOException; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static java.util.Collections.singletonList; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; @@ -28,8 +28,6 @@ public class ResponseErrorHandlerTest { - private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); - private ResponseErrorHandler responseErrorHandler; @BeforeMethod diff --git a/src/test/java/com/gooddata/util/TagsDeserializerTest.java b/src/test/java/com/gooddata/util/TagsDeserializerTest.java index b18b4e78c..d797ff2e9 100644 --- a/src/test/java/com/gooddata/util/TagsDeserializerTest.java +++ b/src/test/java/com/gooddata/util/TagsDeserializerTest.java @@ -5,33 +5,33 @@ */ package com.gooddata.util; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.hasItems; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.Matchers.is; public class TagsDeserializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void shouldDeserializeOneToken() throws Exception { - final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG\"}", TagsTestClass.class); + final TagsTestClass tags = OBJECT_MAPPER.readValue("{\"tags\":\"TAG\"}", TagsTestClass.class); assertThat(tags.getTags(), hasSize(1)); assertThat(tags.getTags().iterator().next(), is("TAG")); } @Test public void shouldDeserializeTwoTokens() throws Exception { - final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); + final TagsTestClass tags = OBJECT_MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); assertThat(tags.getTags(), hasSize(2)); assertThat(tags.getTags(), hasItems("TAG", "TAG2")); } @Test public void shouldDeserializeMultipleWhitespaceSeparatedTokens() throws Exception { - final TagsTestClass tags = MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); + final TagsTestClass tags = OBJECT_MAPPER.readValue("{\"tags\":\"TAG TAG2\"}", TagsTestClass.class); assertThat(tags.getTags(), hasSize(2)); assertThat(tags.getTags(), hasItems("TAG", "TAG2")); } diff --git a/src/test/java/com/gooddata/util/TagsSerializerTest.java b/src/test/java/com/gooddata/util/TagsSerializerTest.java index 24e42f15d..047955bf5 100644 --- a/src/test/java/com/gooddata/util/TagsSerializerTest.java +++ b/src/test/java/com/gooddata/util/TagsSerializerTest.java @@ -5,12 +5,12 @@ */ package com.gooddata.util; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.Collections; import java.util.LinkedHashSet; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static org.hamcrest.MatcherAssert.assertThat; @@ -18,26 +18,24 @@ public class TagsSerializerTest { - private static final ObjectMapper MAPPER = new ObjectMapper(); - @Test public void shouldSerializeOneTag() throws Exception { final TagsTestClass tags = new TagsTestClass(singleton("TAG")); - final String jsonString = MAPPER.writeValueAsString(tags); + final String jsonString = OBJECT_MAPPER.writeValueAsString(tags); assertThat(jsonString, is("{\"tags\":\"TAG\"}")); } @Test public void shouldSerializeZeroTags() throws Exception { final TagsTestClass tags = new TagsTestClass(Collections.emptySet()); - final String jsonString = MAPPER.writeValueAsString(tags); + final String jsonString = OBJECT_MAPPER.writeValueAsString(tags); assertThat(jsonString, is("{\"tags\":\"\"}")); } @Test public void shouldSerializeTwoTags() throws Exception { final TagsTestClass tags = new TagsTestClass(new LinkedHashSet<>(asList("TAG", "TAG2"))); - final String jsonString = MAPPER.writeValueAsString(tags); + final String jsonString = OBJECT_MAPPER.writeValueAsString(tags); assertThat(jsonString, is("{\"tags\":\"TAG TAG2\"}")); } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java index e8ea543ad..4e76f6d4d 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseSchemaTest.java @@ -5,18 +5,17 @@ */ package com.gooddata.warehouse; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.text.MatchesPattern.matchesPattern; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; import java.util.LinkedHashMap; import java.util.Map; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.text.MatchesPattern.matchesPattern; + public class WarehouseSchemaTest { private static final String NAME = "default"; @@ -32,8 +31,7 @@ public class WarehouseSchemaTest { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/schema.json"); - final WarehouseSchema warehouseSchema = new ObjectMapper().readValue(stream, WarehouseSchema.class); + final WarehouseSchema warehouseSchema = readObjectFromResource("/warehouse/schema.json", WarehouseSchema.class); assertThat(warehouseSchema.getName(), is(NAME)); assertThat(warehouseSchema.getDescription(), is(DESCRIPTION)); @@ -42,8 +40,7 @@ public void testDeserialization() throws Exception { @Test public void testToStringFormat() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/schema.json"); - final WarehouseSchema warehouseSchema = new ObjectMapper().readValue(stream, WarehouseSchema.class); + final WarehouseSchema warehouseSchema = readObjectFromResource("/warehouse/schema.json", WarehouseSchema.class); assertThat(warehouseSchema.toString(), matchesPattern(WarehouseSchema.class.getSimpleName() + "\\[.*\\]")); } diff --git a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java index a7fb6dd4c..b6e3286cc 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseServiceIT.java @@ -18,7 +18,9 @@ import java.io.IOException; import java.util.Collections; +import static com.gooddata.util.ResourceUtils.OBJECT_MAPPER; import static com.gooddata.util.ResourceUtils.readFromResource; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static net.jadler.Jadler.onRequest; import static net.jadler.Jadler.verifyThatRequest; import static org.hamcrest.MatcherAssert.assertThat; @@ -52,10 +54,10 @@ public class WarehouseServiceIT extends AbstractGoodDataIT { @BeforeClass public void setUp() throws Exception { - pollingTask = MAPPER.readValue(readFromResource(TASK_POLL), WarehouseTask.class); - finishedTask = MAPPER.readValue(readFromResource(TASK_DONE), WarehouseTask.class); - warehouse = MAPPER.readValue(readFromResource(WAREHOUSE), Warehouse.class); - warehouseSchema = MAPPER.readValue(readFromResource(WAREHOUSE_SCHEMA), WarehouseSchema.class); + pollingTask = readObjectFromResource(TASK_POLL, WarehouseTask.class); + finishedTask = readObjectFromResource(TASK_DONE, WarehouseTask.class); + warehouse = readObjectFromResource(WAREHOUSE, Warehouse.class); + warehouseSchema = readObjectFromResource(WAREHOUSE_SCHEMA, WarehouseSchema.class); } @Test @@ -151,7 +153,7 @@ public void shouldUpdateWarehouse() throws Exception { final String updatedTitle = "UPDATED_TITLE"; - final Warehouse toUpdate = MAPPER.readValue(readFromResource(WAREHOUSE), Warehouse.class); + final Warehouse toUpdate = readObjectFromResource(WAREHOUSE, Warehouse.class); toUpdate.setTitle(updatedTitle); onRequest() @@ -163,7 +165,7 @@ public void shouldUpdateWarehouse() throws Exception { .havingMethodEqualTo("GET") .havingPathEqualTo(warehouse.getUri()) .respond() - .withBody(MAPPER.writeValueAsString(toUpdate)) + .withBody(OBJECT_MAPPER.writeValueAsString(toUpdate)) .withStatus(200); final Warehouse updated = gd.getWarehouseService().updateWarehouse(toUpdate); @@ -177,7 +179,7 @@ public void shouldUpdateWarehouse() throws Exception { @Override public boolean matches(Object o) { try { - Warehouse instance = MAPPER.readValue((String) o, Warehouse.class); + Warehouse instance = OBJECT_MAPPER.readValue((String) o, Warehouse.class); return updatedTitle.equals(instance.getTitle()); } catch (IOException e) { return false; diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java index 5bdfdf3b4..7e321e307 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTaskTest.java @@ -5,20 +5,18 @@ */ package com.gooddata.warehouse; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.MatcherAssert.*; - -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; -import java.io.InputStream; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; public class WarehouseTaskTest { @SuppressWarnings("deprecation") @Test public void testDeserializePoll() throws Exception { - final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-poll.json"); + final WarehouseTask warehouseTask = readObjectFromResource("/warehouse/warehouseTask-poll.json", WarehouseTask.class); assertThat(warehouseTask.getPollLink(), is("/gdc/datawarehouse/executions/executionId")); assertThat(warehouseTask.getPollUri(), is("/gdc/datawarehouse/executions/executionId")); } @@ -26,13 +24,9 @@ public void testDeserializePoll() throws Exception { @SuppressWarnings("deprecation") @Test public void testDeserializeInstance() throws Exception { - final WarehouseTask warehouseTask = deserialize("/warehouse/warehouseTask-finished.json"); + 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")); } - private WarehouseTask deserialize(String path) throws Exception { - final InputStream stream = getClass().getResourceAsStream(path); - return new ObjectMapper().readValue(stream, WarehouseTask.class); - } } \ No newline at end of file diff --git a/src/test/java/com/gooddata/warehouse/WarehouseTest.java b/src/test/java/com/gooddata/warehouse/WarehouseTest.java index f16042035..8e1b3a770 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseTest.java @@ -6,6 +6,7 @@ package com.gooddata.warehouse; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.CoreMatchers.nullValue; import static org.hamcrest.core.Is.is; import static org.hamcrest.MatcherAssert.assertThat; @@ -68,8 +69,7 @@ public void testSerializationWithLicense() throws Exception { @Test public void testDeserialization() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse.json"); - final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + final Warehouse warehouse = readObjectFromResource("/warehouse/warehouse.json", Warehouse.class); assertThat(warehouse.getTitle(), is(TITLE)); assertThat(warehouse.getDescription(), is(DESCRIPTION)); @@ -86,8 +86,7 @@ public void testDeserialization() throws Exception { @Test public void testDeserializationWithLicense() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse-withLicense.json"); - final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + final Warehouse warehouse = readObjectFromResource("/warehouse/warehouse-withLicense.json", Warehouse.class); assertThat(warehouse.getTitle(), is(TITLE)); assertThat(warehouse.getDescription(), is(DESCRIPTION)); @@ -105,8 +104,7 @@ public void testDeserializationWithLicense() throws Exception { @Test public void testDeserializationWithNullToken() throws Exception { - final InputStream stream = getClass().getResourceAsStream("/warehouse/warehouse-null-token.json"); - final Warehouse warehouse = new ObjectMapper().readValue(stream, Warehouse.class); + final Warehouse warehouse = readObjectFromResource("/warehouse/warehouse-null-token.json", Warehouse.class); assertThat(warehouse.getTitle(), is(TITLE)); assertThat(warehouse.getDescription(), is(DESCRIPTION)); diff --git a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java index a4555edd3..536fdbf32 100644 --- a/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java +++ b/src/test/java/com/gooddata/warehouse/WarehouseUserTest.java @@ -5,13 +5,13 @@ */ package com.gooddata.warehouse; -import com.fasterxml.jackson.databind.ObjectMapper; import org.testng.annotations.Test; import java.util.LinkedHashMap; import java.util.Map; import static com.gooddata.JsonMatchers.serializesToJson; +import static com.gooddata.util.ResourceUtils.readObjectFromResource; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.hamcrest.text.MatchesPattern.matchesPattern; @@ -47,8 +47,7 @@ public void testCompleteSerialization() throws Exception { @Test public void testDeserialization() throws Exception { - final WarehouseUser user = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/warehouse/user.json"), WarehouseUser.class); + final WarehouseUser user = readObjectFromResource("/warehouse/user.json", WarehouseUser.class); assertThat(user.getRole(), is(ROLE)); assertThat(user.getProfile(), is(PROFILE)); @@ -65,8 +64,7 @@ public void testGetId() throws Exception { @Test public void testToStringFormat() throws Exception { - final WarehouseUser user = new ObjectMapper() - .readValue(getClass().getResourceAsStream("/warehouse/user.json"), WarehouseUser.class); + final WarehouseUser user = readObjectFromResource("/warehouse/user.json", WarehouseUser.class); assertThat(user.toString(), matchesPattern(WarehouseUser.class.getSimpleName() + "\\[.*\\]")); } From b0224182dfcdb827d61b4153fccf168adbb3df7f Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 25 May 2017 15:53:37 +0200 Subject: [PATCH 0520/1191] add: getSanitizedLimit(max) --- .../java/com/gooddata/collections/PageRequest.java | 14 ++++++++++++++ .../com/gooddata/collections/PageRequestTest.java | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/main/java/com/gooddata/collections/PageRequest.java b/src/main/java/com/gooddata/collections/PageRequest.java index 64cf2fd80..e97743dbd 100644 --- a/src/main/java/com/gooddata/collections/PageRequest.java +++ b/src/main/java/com/gooddata/collections/PageRequest.java @@ -70,10 +70,24 @@ public int getLimit() { return limit; } + /** + * Return the limit value or the {@link #DEFAULT_LIMIT} if the limit is lower than or equal to zero + * @return sanitized limit + */ public int getSanitizedLimit() { return limit > 0 ? limit : DEFAULT_LIMIT; } + /** + * Return the {@link #getSanitizedLimit()} if lower than the given maximum or the maximum value + * @param max maximum value + * @return sanitized limit + */ + public int getSanitizedLimit(final int max) { + final int limit = getSanitizedLimit(); + return limit < max ? limit : max; + } + public void setLimit(final int limit) { this.limit = limit; } diff --git a/src/test/java/com/gooddata/collections/PageRequestTest.java b/src/test/java/com/gooddata/collections/PageRequestTest.java index 4d59a2139..564485d47 100644 --- a/src/test/java/com/gooddata/collections/PageRequestTest.java +++ b/src/test/java/com/gooddata/collections/PageRequestTest.java @@ -76,4 +76,16 @@ public void testGetSanitizedLimit() throws Exception { pageRequest.setLimit(-2); assertThat(pageRequest.getSanitizedLimit(), is(DEFAULT_LIMIT)); } + + @Test + public void shouldReturnDefaultForZero() throws Exception { + final PageRequest pageRequest = new PageRequest(0); + assertThat(pageRequest.getSanitizedLimit(), is(DEFAULT_LIMIT)); + } + + @Test + public void shouldReturnMaxForSanitizedLimit() throws Exception { + final PageRequest pageRequest = new PageRequest(100); + assertThat(pageRequest.getSanitizedLimit(10), is(10)); + } } From a72ee494dfd4fdacf0625a94782fb6a5959d7d85 Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 25 May 2017 16:43:50 +0200 Subject: [PATCH 0521/1191] refactor and remove duplicated code --- .../com/gooddata/dataset/DatasetService.java | 38 ++++++++----------- .../gooddata/dataset/DatasetServiceTest.java | 4 +- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index eef92c864..1ee248e10 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -8,11 +8,14 @@ import com.gooddata.AbstractPollHandler; import com.gooddata.AbstractService; import com.gooddata.FutureResult; -import com.gooddata.PollResult; import com.gooddata.GoodDataException; import com.gooddata.GoodDataRestException; -import com.gooddata.gdc.*; +import com.gooddata.PollResult; import com.gooddata.gdc.AboutLinks.Link; +import com.gooddata.gdc.DataStoreException; +import com.gooddata.gdc.DataStoreService; +import com.gooddata.gdc.TaskStatus; +import com.gooddata.gdc.UriResponse; import com.gooddata.project.Project; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.http.client.ClientHttpResponse; @@ -25,7 +28,10 @@ import java.net.URI; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; import java.util.stream.Collectors; import static com.gooddata.util.Validate.notEmpty; @@ -94,19 +100,9 @@ public FutureResult loadDataset(final Project project, final DatasetManife notNull(project, "project"); notNull(dataset, "dataset"); notNull(manifest, "manifest"); - final Path dirPath = Paths.get("/", project.getId() + "_" + RandomStringUtils.randomAlphabetic(3), "/"); - try { - dataStoreService.upload(dirPath.resolve(manifest.getFile()).toString(), dataset); - final String manifestJson = mapper.writeValueAsString(manifest); - final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); - dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); + manifest.setSource(dataset); - return pullLoad(project, dirPath, manifest.getDataSet()); - } catch (IOException e) { - throw new DatasetException("Unable to serialize manifest", manifest.getDataSet(), e); - } catch (DataStoreException | GoodDataRestException | RestClientException e) { - throw new DatasetException("Unable to load", manifest.getDataSet(), e); - } + return loadDatasets(project, manifest); } /** @@ -156,7 +152,7 @@ public FutureResult loadDatasets(final Project project, final Collection datasets) } } - private FutureResult pullLoad(Project project, final Path dirPath, final String dataset) { - return pullLoad(project, dirPath, singletonList(dataset)); - } - - private FutureResult pullLoad(Project project, final Path dirPath, final Collection datasets) { + private FutureResult pullLoad(Project project, final String dirPath, final Collection datasets) { final PullTask pullTask = restTemplate - .postForObject(Pull.URI, new Pull(dirPath.toString()), PullTask.class, project.getId()); + .postForObject(Pull.URI, new Pull(dirPath), PullTask.class, project.getId()); return new PollResult<>(this, new AbstractPollHandler(pullTask.getPollUri(), TaskStatus.class, Void.class) { @Override @@ -207,7 +199,7 @@ public void handlePollException(final GoodDataRestException e) { @Override protected void onFinish() { try { - dataStoreService.delete(dirPath.toString()); + dataStoreService.delete(dirPath); } catch (DataStoreException ignored) { // todo log? } diff --git a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java index 65b032bbd..006f0dca6 100644 --- a/src/test/java/com/gooddata/dataset/DatasetServiceTest.java +++ b/src/test/java/com/gooddata/dataset/DatasetServiceTest.java @@ -128,7 +128,9 @@ public void testLoadDatasetWithNullDataset() throws Exception { public void testLoadDatasetWhenUploadFails() throws Exception { doThrow(DataStoreException.class).when(dataStoreService).upload(anyString(), eq(stream)); when(manifest.getFile()).thenReturn(""); - service.loadDataset(project, manifest, stream); + when(manifest.getSource()).thenReturn(stream); + when(manifest.getDataSet()).thenReturn(DATASET_ID); + service.loadDatasets(project, manifest); } @Test(expectedExceptions = IllegalArgumentException.class) From ad71485b81d696986737eeda8f097b0673224a8b Mon Sep 17 00:00:00 2001 From: Martin Caslavsky Date: Thu, 25 May 2017 17:13:34 +0200 Subject: [PATCH 0522/1191] use simple string to resolve windows issue #456 --- .../java/com/gooddata/dataset/DatasetService.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gooddata/dataset/DatasetService.java b/src/main/java/com/gooddata/dataset/DatasetService.java index 1ee248e10..357a1e19a 100644 --- a/src/main/java/com/gooddata/dataset/DatasetService.java +++ b/src/main/java/com/gooddata/dataset/DatasetService.java @@ -26,8 +26,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -40,7 +38,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; -import static java.util.Collections.singletonList; import static org.springframework.util.StringUtils.isEmpty; /** @@ -142,17 +139,17 @@ public FutureResult loadDatasets(final Project project, final Collection datasetsNames = new ArrayList<>(datasets.size()); try { - final Path dirPath = Paths.get("/", project.getId() + "_" + RandomStringUtils.randomAlphabetic(3), "/"); + final String dirPath = "/" + project.getId() + "_" + RandomStringUtils.randomAlphabetic(3) + "/"; for (DatasetManifest datasetManifest : datasets) { datasetsNames.add(datasetManifest.getDataSet()); - dataStoreService.upload(dirPath.resolve(datasetManifest.getFile()).toString(), datasetManifest.getSource()); + dataStoreService.upload(dirPath + datasetManifest.getFile(), datasetManifest.getSource()); } final String manifestJson = mapper.writeValueAsString(new DatasetManifests(datasets)); final ByteArrayInputStream inputStream = new ByteArrayInputStream(manifestJson.getBytes(UTF_8)); - dataStoreService.upload(dirPath.resolve(MANIFEST_FILE_NAME).toString(), inputStream); + dataStoreService.upload(dirPath + MANIFEST_FILE_NAME, inputStream); - return pullLoad(project, dirPath.toString(), datasetsNames); + return pullLoad(project, dirPath, datasetsNames); } catch (IOException e) { throw new DatasetException("Unable to serialize manifest", datasetsNames, e); } catch (DataStoreException | GoodDataRestException | RestClientException e) { From 7dcd2fa99fb55f90601ea579b4fcfde5a93a7d20 Mon Sep 17 00:00:00 2001 From: Jiri Mikulasek Date: Tue, 23 May 2017 19:33:23 +0200 Subject: [PATCH 0523/1191] introduce support for projectTemplates ProjectTemplateService enables to get for list of templates or particular template by URI. --- src/main/java/com/gooddata/GoodData.java | 17 +- .../ProjectTemplateService.java | 75 +++++++ .../gooddata/projecttemplate/Template.java | 189 ++++++++++++++++++ .../gooddata/projecttemplate/Templates.java | 32 +++ .../ProjectTemplateServiceIT.java | 79 ++++++++ .../ProjectTemplateServiceTest.java | 74 +++++++ .../projecttemplate/TemplateTest.java | 44 ++++ .../resources/projecttemplate/template.json | 26 +++ .../resources/projecttemplate/templates.json | 47 +++++ 9 files changed, 581 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gooddata/projecttemplate/ProjectTemplateService.java create mode 100644 src/main/java/com/gooddata/projecttemplate/Template.java create mode 100644 src/main/java/com/gooddata/projecttemplate/Templates.java create mode 100644 src/test/java/com/gooddata/projecttemplate/ProjectTemplateServiceIT.java create mode 100644 src/test/java/com/gooddata/projecttemplate/ProjectTemplateServiceTest.java create mode 100644 src/test/java/com/gooddata/projecttemplate/TemplateTest.java create mode 100644 src/test/resources/projecttemplate/template.json create mode 100644 src/test/resources/projecttemplate/templates.json diff --git a/src/main/java/com/gooddata/GoodData.java b/src/main/java/com/gooddata/GoodData.java index 7d872bbbe..46828d62e 100644 --- a/src/main/java/com/gooddata/GoodData.java +++ b/src/main/java/com/gooddata/GoodData.java @@ -12,6 +12,7 @@ import com.gooddata.featureflag.FeatureFlagService; import com.gooddata.md.maintenance.ExportImportService; import com.gooddata.notification.NotificationService; +import com.gooddata.projecttemplate.ProjectTemplateService; import com.gooddata.util.ResponseErrorHandler; import com.gooddata.authentication.LoginPasswordAuthentication; import com.gooddata.warehouse.WarehouseService; @@ -81,6 +82,7 @@ public class GoodData { private final ExportImportService exportImportService; private final FeatureFlagService featureFlagService; private final OutputStageService outputStageService; + private final ProjectTemplateService projectTemplateService; /** * Create instance configured to communicate with GoodData Platform under user with given credentials. @@ -211,8 +213,9 @@ protected GoodData(GoodDataEndpoint endpoint, Authentication authentication, Goo connectorService = new ConnectorService(getRestTemplate(), projectService); notificationService = new NotificationService(getRestTemplate()); exportImportService = new ExportImportService(getRestTemplate()); - featureFlagService = new FeatureFlagService(restTemplate); - outputStageService = new OutputStageService(restTemplate); + featureFlagService = new FeatureFlagService(getRestTemplate()); + outputStageService = new OutputStageService(getRestTemplate()); + projectTemplateService = new ProjectTemplateService(getRestTemplate()); } static RestTemplate createRestTemplate(GoodDataEndpoint endpoint, HttpClient httpClient) { @@ -448,4 +451,14 @@ public FeatureFlagService getFeatureFlagService() { public OutputStageService getOutputStageService() { return outputStageService; } + + /** + * Get initialized service for project templates + * + * @return initialized service for project templates + */ + @Bean + public ProjectTemplateService getProjectTemplateService() { + return projectTemplateService; + } } diff --git a/src/main/java/com/gooddata/projecttemplate/ProjectTemplateService.java b/src/main/java/com/gooddata/projecttemplate/ProjectTemplateService.java new file mode 100644 index 000000000..53c59a622 --- /dev/null +++ b/src/main/java/com/gooddata/projecttemplate/ProjectTemplateService.java @@ -0,0 +1,75 @@ +/** + * 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.projecttemplate; + +import com.gooddata.AbstractService; +import com.gooddata.GoodDataException; +import com.gooddata.GoodDataRestException; +import com.gooddata.dataset.DatasetManifest; +import com.gooddata.util.Validate; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; + +import java.util.Collection; +import java.util.stream.Collectors; + +/** + * Service enabling access to project templates, under /projectTemplates/... + */ +public class ProjectTemplateService extends AbstractService { + + /** + * Sets RESTful HTTP Spring template. Should be called from constructor of concrete service extending + * this abstract one. + * + * @param restTemplate RESTful HTTP Spring template + */ + public ProjectTemplateService(RestTemplate restTemplate) { + super(restTemplate); + } + + /** + * List of all projects' templates + * @return list of templates + */ + public Collection