44package com .gooddata .dataset ;
55
66import com .gooddata .AbstractService ;
7+ import com .gooddata .GoodDataException ;
78import com .gooddata .gdc .DataStoreService ;
89import com .gooddata .project .Project ;
10+ import com .gooddata .task .PullTask ;
11+ import com .gooddata .task .PullTaskStatus ;
12+ import org .apache .commons .io .IOUtils ;
13+ import org .apache .commons .lang .RandomStringUtils ;
14+ import org .codehaus .jackson .map .ObjectMapper ;
15+ import org .springframework .http .client .ClientHttpResponse ;
16+ import org .springframework .web .client .HttpMessageConverterExtractor ;
917import org .springframework .web .client .RestTemplate ;
18+ import java .io .IOException ;
19+ import java .io .InputStream ;
20+ import java .net .URI ;
1021
1122/**
1223 */
1324public class DatasetService extends AbstractService {
1425
26+ private static final String MANIFEST_FILE_NAME = "upload_info.json" ;
1527 private final DataStoreService dataStoreService ;
28+ private final static ObjectMapper mapper = new ObjectMapper ();
1629
1730 public DatasetService (RestTemplate restTemplate , DataStoreService dataStoreService ) {
1831 super (restTemplate );
@@ -23,4 +36,34 @@ public DatasetManifest getDatasetManifest(Project project, String datasetId) {
2336 return restTemplate .getForObject (DatasetManifest .URI , DatasetManifest .class , project .getId (), datasetId );
2437 }
2538
39+ public void loadDataset (Project project , InputStream dataset , DatasetManifest manifest ) {
40+ final String dirPath = "/" + project .getId () + "_" + RandomStringUtils .randomAlphabetic (3 );
41+ try {
42+ dataStoreService .upload (dirPath + "/" + manifest .getFile (), dataset );
43+ String manifestJson = mapper .writeValueAsString (manifest );
44+ dataStoreService .upload (dirPath + "/" + MANIFEST_FILE_NAME , IOUtils .toInputStream (manifestJson ));
45+
46+ final PullTask pullTask = restTemplate .postForObject (Pull .URI , new Pull (dirPath ), PullTask .class , project .getId ());
47+ PullTaskStatus taskStatus = poll (URI .create (pullTask .getUri ()), new ConditionCallback () {
48+ @ Override
49+ public boolean finished (ClientHttpResponse response ) throws IOException {
50+ final PullTaskStatus status = new HttpMessageConverterExtractor <>(PullTaskStatus .class , restTemplate .getMessageConverters ())
51+ .extractData (response );
52+ return status .isFinished ();
53+ }
54+ }, PullTaskStatus .class );
55+ if (!taskStatus .isSuccess ()) {
56+ throw new GoodDataException ("ETL pull finished with status " + taskStatus .getStatus ());
57+ }
58+ } catch (IOException e ) {
59+ throw new GoodDataException ("Unable to serialize manifest" , e );
60+ } finally {
61+ // TODO delete
62+ }
63+
64+ }
65+
66+ public void loadDataset (Project project , InputStream dataset , String datasetId ) {
67+ loadDataset (project , dataset , getDatasetManifest (project , datasetId ));
68+ }
2669}
0 commit comments