3131import edu .harvard .iq .dataverse .engine .command .impl .UpdateDatasetTargetURLCommand ;
3232import edu .harvard .iq .dataverse .engine .command .impl .UpdateDatasetVersionCommand ;
3333import edu .harvard .iq .dataverse .export .DDIExportServiceBean ;
34+ import edu .harvard .iq .dataverse .export .ExportService ;
3435import edu .harvard .iq .dataverse .export .ddi .DdiExportUtil ;
3536import edu .harvard .iq .dataverse .util .SystemConfig ;
3637import edu .harvard .iq .dataverse .util .json .JsonParseException ;
@@ -76,7 +77,7 @@ public class Datasets extends AbstractApiBean {
7677
7778 @ EJB
7879 DDIExportServiceBean ddiExportService ;
79-
80+
8081 @ EJB
8182 SystemConfig systemConfig ;
8283
@@ -93,21 +94,55 @@ private interface DsVersionHandler<T> {
9394
9495 @ GET
9596 @ Path ("{id}" )
96- public Response getDataset ( @ PathParam ("id" ) String id ) {
97-
97+ public Response getDataset (@ PathParam ("id" ) String id ) {
98+
9899 try {
99100 final DataverseRequest r = createDataverseRequest (findUserOrDie ());
100-
101+
101102 Dataset retrieved = execCommand (new GetDatasetCommand (r , findDatasetOrDie (id )));
102103 DatasetVersion latest = execCommand (new GetLatestAccessibleDatasetVersionCommand (r , retrieved ));
103104 final JsonObjectBuilder jsonbuilder = json (retrieved );
104-
105+
105106 return okResponse (jsonbuilder .add ("latestVersion" , (latest != null ) ? json (latest ) : null ));
106- } catch ( WrappedResponse ex ) {
107- return ex .refineResponse ( "GETting dataset " + id + " failed." );
108- }
109-
107+ } catch (WrappedResponse ex ) {
108+ return ex .refineResponse ("GETting dataset " + id + " failed." );
109+ }
110+
110111 }
112+
113+
114+ @ GET
115+ @ Path ("/export" )
116+ @ Produces ({"application/xml" , "application/json" })
117+ public Response exportDataset (@ QueryParam ("persistentId" ) String persistentId , @ QueryParam ("exporter" ) String exporter ) {
118+ boolean ddiExportEnabled = systemConfig .isDdiExportEnabled ();
119+ if (!ddiExportEnabled ) {
120+ return errorResponse (Response .Status .FORBIDDEN , "Disabled" );
121+ }
122+ try {
123+ Dataset dataset = datasetService .findByGlobalId (persistentId );
124+ if (dataset == null ) {
125+ return errorResponse (Response .Status .NOT_FOUND , "A dataset with the persistentId " + persistentId + " could not be found." );
126+ }
127+
128+ ExportService instance = ExportService .getInstance ();
129+ final JsonObjectBuilder datasetAsJson = jsonAsDatasetDto (dataset .getLatestVersion ());
130+ OutputStream output = instance .getExport (datasetAsJson .build (), exporter );
131+ String xml = output .toString ();
132+ LOGGER .fine ("xml to return: " + xml );
133+ String mediaType = MediaType .TEXT_PLAIN ;
134+ if (instance .isXMLFormat (exporter )){
135+ mediaType = MediaType .APPLICATION_XML ;
136+ }
137+ return Response .ok ()
138+ .entity (xml )
139+ .type (mediaType ).
140+ build ();
141+ } catch (Exception wr ) {
142+ return errorResponse (Response .Status .FORBIDDEN , "Export Failed" );
143+ }
144+ }
145+
111146
112147 @ DELETE
113148 @ Path ("{id}" )
@@ -534,7 +569,7 @@ public Response getDdi(@QueryParam("id") long id, @QueryParam("persistentId") St
534569 return wr .getResponse ();
535570 }
536571 }
537-
572+
538573 /**
539574 * @todo Make this real. Currently only used for API testing. Copied from
540575 * the equivalent API endpoint for dataverses and simplified with values
0 commit comments