Skip to content

Commit d603ca5

Browse files
committed
Add workspace timezone setting
1 parent 3f292e0 commit d603ca5

5 files changed

Lines changed: 109 additions & 15 deletions

File tree

gooddata-java-model/src/main/java/com/gooddata/sdk/model/md/Service.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class Service implements Serializable {
2626
private final String timezone;
2727

2828
@JsonCreator
29-
private Service(@JsonProperty("timezone") String timezone) {
29+
public Service(@JsonProperty("timezone") String timezone) {
3030
this.timezone = timezone;
3131
}
3232

gooddata-java/src/main/java/com/gooddata/sdk/service/md/MetadataService.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,30 @@ public String getTimezone(final Project project) {
464464
}
465465
}
466466

467+
/**
468+
* Set project/workspace timezone.
469+
*
470+
* @param project the project/workspace where to set the timezone
471+
* @param timezone the timezone to be set (see IANA/Olson tz database for possible values)
472+
*/
473+
public void setTimezone(final Project project, final String timezone) {
474+
notNull(project, "project");
475+
notNull(project.getId(), "project.id");
476+
notNull(timezone, "timezone");
477+
notEmpty(timezone, "timezone");
478+
479+
try {
480+
final Service result = restTemplate.postForObject(TIMEZONE_URI, new Service(timezone), Service.class,
481+
project.getId());
482+
483+
if (result == null) {
484+
throw new GoodDataException("Unexpected empty result from API call.");
485+
}
486+
} catch (RestClientException e) {
487+
throw new GoodDataException("Unable to set timezone of project/workspace " + project.getId(), e);
488+
}
489+
}
490+
467491

468492
private Collection<Entry> filterEntries(Collection<Entry> entries, Restriction... restrictions) {
469493
if (restrictions == null || restrictions.length == 0) {

gooddata-java/src/test/java/com/gooddata/sdk/service/md/MetadataServiceAT.java

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import static com.gooddata.sdk.model.md.Restriction.identifier;
3939
import static com.gooddata.sdk.model.md.report.MetricGroup.METRIC_GROUP;
4040
import static java.util.Arrays.asList;
41+
import static java.util.Collections.singletonList;
4142
import static org.hamcrest.MatcherAssert.assertThat;
4243
import static org.hamcrest.Matchers.empty;
4344
import static org.hamcrest.Matchers.hasItems;
@@ -52,15 +53,15 @@
5253
public class MetadataServiceAT extends AbstractGoodDataAT {
5354

5455
@Test(groups = "md", dependsOnGroups = "model")
55-
public void getObjs() throws Exception {
56+
public void getObjs() {
5657
final MetadataService md = gd.getMetadataService();
5758

5859
fact = md.getObjUri(project, Fact.class, identifier("fact.person.shoesize"));
5960
attr = md.getObj(project, Attribute.class, identifier("attr.person.department"));
6061
}
6162

6263
@Test(groups = "md", dependsOnMethods = "getObjs")
63-
public void updateObj() throws Exception {
64+
public void updateObj() {
6465
final MetadataService md = gd.getMetadataService();
6566

6667
attr.setSummary("Changed person department");
@@ -70,7 +71,7 @@ public void updateObj() throws Exception {
7071
}
7172

7273
@Test(groups = "md", dependsOnMethods = "getObjs")
73-
public void createMetric() throws Exception {
74+
public void createMetric() {
7475
final MetadataService md = gd.getMetadataService();
7576
final Metric create = new Metric("Avg shoe size", "SELECT AVG([" + fact + "])", "#,##0");
7677
create.setIdentifier("metric.avgshoesize");
@@ -79,12 +80,12 @@ public void createMetric() throws Exception {
7980
}
8081

8182
@Test(groups = "md", dependsOnMethods = "createMetric")
82-
public void createReport() throws Exception {
83+
public void createReport() {
8384
final MetadataService md = gd.getMetadataService();
8485

8586
reportDefinition = md.createObj(project, GridReportDefinitionContent.create(
8687
"Department avg shoe size",
87-
asList(METRIC_GROUP),
88+
singletonList(METRIC_GROUP),
8889
asList(new AttributeInGrid(attr.getDefaultDisplayForm())),
8990
asList(new MetricElement(metric, "Avg shoe size")),
9091
asList(new Filter("(SELECT [" + metric.getUri() + "]) >= 0"))
@@ -93,7 +94,7 @@ public void createReport() throws Exception {
9394
}
9495

9596
@Test(groups = "md", dependsOnGroups = "model")
96-
public void createDashboardEmpty() throws Exception {
97+
public void createDashboardEmpty() {
9798
dashboard = gd.getMetadataService().createObj(project, new ProjectDashboard("My Dashboard", new Tab("My Tab")));
9899

99100
assertThat(dashboard.getTitle(), is("My Dashboard"));
@@ -139,7 +140,7 @@ public void usedByBatch() {
139140
}
140141

141142
@Test(groups = "md", dependsOnGroups = "model")
142-
public void getObjsByUris() throws Exception {
143+
public void getObjsByUris() {
143144
final MetadataService md = gd.getMetadataService();
144145

145146
final Map<String, String> uris =
@@ -154,7 +155,7 @@ public void getObjsByUris() throws Exception {
154155
}
155156

156157
@Test(groups = "md", dependsOnMethods = "createReport")
157-
public void createScheduledMail() throws Exception {
158+
public void createScheduledMail() {
158159
final MetadataService md = gd.getMetadataService();
159160

160161
scheduledMail = md.createObj(project,
@@ -172,7 +173,7 @@ public void createScheduledMail() throws Exception {
172173
}
173174

174175
@Test(groups = "md", dependsOnMethods = "createScheduledMail")
175-
public void retrieveScheduledMail() throws Exception {
176+
public void retrieveScheduledMail() {
176177
final MetadataService md = gd.getMetadataService();
177178
Collection<Entry> result = md.find(project, ScheduledMail.class);
178179
assertThat(result, hasSize(1));
@@ -183,7 +184,7 @@ public void retrieveScheduledMail() throws Exception {
183184
}
184185

185186
@Test(groups = "md", dependsOnMethods = "retrieveScheduledMail")
186-
public void removeScheduledMail() throws Exception {
187+
public void removeScheduledMail() {
187188
final MetadataService metadataService = gd.getMetadataService();
188189
metadataService.removeObj(scheduledMail);
189190
}
@@ -192,26 +193,26 @@ public void removeScheduledMail() throws Exception {
192193
public void identifiersToUri() {
193194
final MetadataService metadataService = gd.getMetadataService();
194195
final Map<String, String> idsToUris =
195-
metadataService.identifiersToUris(project, asList("attr.person.department"));
196+
metadataService.identifiersToUris(project, singletonList("attr.person.department"));
196197
assertThat(idsToUris.entrySet(), hasSize(1));
197198
final Attribute attribute = metadataService.getObjByUri(idsToUris.get("attr.person.department"), Attribute.class);
198199
assertThat(attribute.getIdentifier(), is("attr.person.department"));
199200
}
200201

201202
@Test(dependsOnGroups = "export", dependsOnMethods = {"usedBy", "usedByBatch"})
202-
public void removeReport() throws Exception {
203+
public void removeReport() {
203204
final MetadataService metadataService = gd.getMetadataService();
204205
metadataService.removeObj(report);
205206
}
206207

207208
@Test(dependsOnMethods = {"removeReport", "removeScheduledMail"})
208-
public void removeDefinition() throws Exception {
209+
public void removeDefinition() {
209210
final MetadataService metadataService = gd.getMetadataService();
210211
metadataService.removeObj(reportDefinition);
211212
}
212213

213214
@Test(groups = "mdAfterLoad", dependsOnGroups = {"model", "dataset"}, dependsOnMethods = "getObjs")
214-
public void getAttributeElements() throws Exception {
215+
public void getAttributeElements() {
215216
final List<AttributeElement> elements = gd.getMetadataService().getAttributeElements(attr);
216217
assertThat("there should be 2 elements", elements, hasSize(2));
217218
final Set<String> titles = new HashSet<>(elements.size());
@@ -227,4 +228,14 @@ public void getTimezone() {
227228
assertThat(tz, is("America/Los_Angeles"));
228229
}
229230

231+
@Test(groups = "md", dependsOnMethods = "getTimezone")
232+
public void setTimezone() {
233+
final MetadataService md = gd.getMetadataService();
234+
235+
md.setTimezone(project, "UTC");
236+
237+
final String tz = md.getTimezone(project);
238+
assertThat(tz, is("UTC"));
239+
}
240+
230241
}

gooddata-java/src/test/java/com/gooddata/sdk/service/md/MetadataServiceIT.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import static java.util.Arrays.asList;
2626
import static java.util.Collections.singletonList;
2727
import static net.jadler.Jadler.onRequest;
28+
import static net.jadler.Jadler.verifyThatRequest;
2829
import static net.javacrumbs.jsonunit.JsonMatchers.jsonEquals;
2930
import static org.hamcrest.CoreMatchers.instanceOf;
3031
import static org.hamcrest.CoreMatchers.is;
@@ -414,4 +415,47 @@ public void getTimezoneShouldThrowGDEOnServerError() {
414415

415416
gd.getMetadataService().getTimezone(project);
416417
}
418+
419+
@Test
420+
public void setTimezone() {
421+
onRequest()
422+
.havingMethodEqualTo("POST")
423+
.havingPathEqualTo("/gdc/md/PROJECT_ID/service/timezone")
424+
.havingBodyEqualTo("{\"service\":{\"timezone\":\"America/Los_Angeles\"}}")
425+
.respond()
426+
.withStatus(200)
427+
.withBody("{\"service\":{\"timezone\":\"America/Los_Angeles\"}}");
428+
429+
gd.getMetadataService().setTimezone(project, "America/Los_Angeles");
430+
verifyThatRequest().receivedOnce();
431+
}
432+
433+
@Test(expectedExceptions = GoodDataException.class,
434+
expectedExceptionsMessageRegExp = "Unexpected empty result from API call.")
435+
public void setTimezoneReturningNothing() {
436+
onRequest()
437+
.havingMethodEqualTo("POST")
438+
.havingPathEqualTo("/gdc/md/PROJECT_ID/service/timezone")
439+
.havingBodyEqualTo("{\"service\":{\"timezone\":\"America/Los_Angeles\"}}")
440+
.respond()
441+
.withStatus(200);
442+
443+
gd.getMetadataService().setTimezone(project, "America/Los_Angeles");
444+
}
445+
446+
@Test(expectedExceptions = GoodDataException.class,
447+
expectedExceptionsMessageRegExp = ".*The timezone 'wrong' could not be loaded, or is an invalid name.*")
448+
public void setTimezoneWithWrongName() {
449+
onRequest()
450+
.havingMethodEqualTo("POST")
451+
.havingPathEqualTo("/gdc/md/PROJECT_ID/service/timezone")
452+
.havingBodyEqualTo("{\"service\":{\"timezone\":\"wrong\"}}")
453+
.respond()
454+
.withStatus(400)
455+
.withBody("{\"error\":{\"parameters\":[\"wrong\"],\"requestId\":\"reqId\",\"component\":" +
456+
"\"MD::Service::Timezone\",\"errorClass\":\"GDC::Exception::User\",\"message\":" +
457+
"\"The timezone '%s' could not be loaded, or is an invalid name.\"}}");
458+
459+
gd.getMetadataService().setTimezone(project, "wrong");
460+
}
417461
}

gooddata-java/src/test/java/com/gooddata/sdk/service/md/MetadataServiceTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,4 +439,19 @@ public void testGetTimezone() {
439439
assertThat(tz, is("UTC"));
440440
}
441441

442+
@Test(expectedExceptions = IllegalArgumentException.class)
443+
public void testSetTimezoneNullProject() {
444+
service.setTimezone(null, "test");
445+
}
446+
447+
@Test(expectedExceptions = IllegalArgumentException.class)
448+
public void testSetTimezoneNullTZ() {
449+
service.setTimezone(project, null);
450+
}
451+
452+
@Test(expectedExceptions = IllegalArgumentException.class)
453+
public void testSetTimezoneEmptyTZ() {
454+
service.setTimezone(project, "");
455+
}
456+
442457
}

0 commit comments

Comments
 (0)