forked from gooddata/gooddata-java
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModelService.java
More file actions
129 lines (114 loc) · 5.22 KB
/
ModelService.java
File metadata and controls
129 lines (114 loc) · 5.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
* Copyright (C) 2007-2014, GoodData(R) Corporation. All rights reserved.
*/
package com.gooddata.model;
import com.gooddata.AbstractService;
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;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.io.Reader;
import java.util.Collection;
import java.util.HashSet;
import static com.gooddata.Validate.notEmpty;
import static com.gooddata.Validate.notNull;
import static com.gooddata.model.ModelDiff.UpdateScript;
/**
* Service for manipulating with project model
*/
public class ModelService extends AbstractService {
public ModelService(RestTemplate restTemplate) {
super(restTemplate);
}
private FutureResult<ModelDiff> getProjectModelDiff(Project project, DiffRequest diffRequest) {
notNull(project, "project");
notNull(diffRequest, "diffRequest");
try {
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);
}
}
public FutureResult<ModelDiff> getProjectModelDiff(Project project, String targetModel) {
notNull(project, "project");
notNull(targetModel, "targetModel");
return getProjectModelDiff(project, new DiffRequest(targetModel));
}
public FutureResult<ModelDiff> getProjectModelDiff(Project project, Reader targetModel) {
notNull(project, "project");
notNull(targetModel, "targetModel");
try {
return getProjectModelDiff(project, FileCopyUtils.copyToString(targetModel));
} catch (IOException e) {
throw new ModelException("Can't read target model", e);
}
}
/**
* 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 collection of results (task statuses) of execution of all MAQL script chunks
*/
public Collection<FutureResult<MaqlDdlTaskStatus>> updateProjectModel(Project project, ModelDiff modelDiff) {
notNull(project, "project");
notNull(modelDiff, "modelDiff");
final Collection<FutureResult<MaqlDdlTaskStatus>> results = new HashSet<>();
for (String maql : modelDiff.getUpdateMaql()) {
results.add(updateProjectModel(project, maql));
}
return results;
}
/**
* 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 collection of results (task statuses) of execution of all MAQL script chunks
*/
public Collection<FutureResult<MaqlDdlTaskStatus>> updateProjectModel(Project project, UpdateScript updateScript) {
notNull(project, "project");
notNull(updateScript, "updateScript");
final Collection<FutureResult<MaqlDdlTaskStatus>> results = new HashSet<>();
for (String maql : updateScript.getMaqlChunks()) {
results.add(updateProjectModel(project, maql));
}
return results;
}
public FutureResult<MaqlDdlTaskStatus> 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());
return new FutureResult<>(this,
new PollHandler<MaqlDdlTaskStatus>(linkEntries.getStatusLink(), MaqlDdlTaskStatus.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);
}
}
}