Skip to content

Commit e560a34

Browse files
committed
Initial Check In - Support of Service Providers
Exporters Infrastructure
1 parent e1ac44b commit e560a34

15 files changed

Lines changed: 9153 additions & 49 deletions

File tree

pom.xml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,14 @@
374374
<artifactId>log4j</artifactId>
375375
<version>1.2.17</version>
376376
</dependency>
377-
377+
<!-- Added for AutoService -->
378+
<dependency>
379+
<groupId>com.google.auto.service</groupId>
380+
<artifactId>auto-service</artifactId>
381+
<version>1.0-rc2</version>
382+
<optional>true</optional>
383+
<type>jar</type>
384+
</dependency>
378385
</dependencies>
379386

380387
<build>

src/main/java/Bundle.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,10 @@ dataset.editBtn.itemLabel.widgets=Widgets
799799
dataset.editBtn.itemLabel.deleteDataset=Delete Dataset
800800
dataset.editBtn.itemLabel.deleteDraft=Delete Draft Version
801801
dataset.editBtn.itemLabel.deaccession=Deaccession Dataset
802+
dataset.exportBtn=Export Metadata
803+
dataset.exportBtn.itemLabel.ddi=DDI
804+
dataset.exportBtn.itemLabel.dublinCore=Dublin Core
805+
dataset.exportBtn.itemLabel.json=JSON
802806
metrics.title=Metrics
803807
metrics.comingsoon=Coming soon...
804808
metrics.views=Views

src/main/java/edu/harvard/iq/dataverse/DatasetFieldConstant.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ public class DatasetFieldConstant implements java.io.Serializable {
4848

4949

5050
public final static String title = "title";
51-
public final static String subTitle="subTitle";
51+
public final static String subTitle="subtitle"; //SEK 6-7-2016 to match what is in DB
52+
public final static String alternativeTitle="alternativeTitle"; //missing from class
5253
public final static String datasetId = "datasetId";
5354
public final static String authorName ="authorName";
5455
public final static String authorAffiliation = "authorAffiliation";
@@ -86,20 +87,24 @@ public class DatasetFieldConstant implements java.io.Serializable {
8687
public final static String datasetVersionValue="datasetVersionValue";
8788
public final static String versionDate="versionDate";
8889
public final static String keywordValue="keywordValue";
89-
public final static String keywordVocab="keywordVocab";
90-
public final static String keywordVocabURI="keywordVocabURI";
90+
public final static String keywordVocab="keywordVocabulary"; //SEK 6/10/2016 to match what is in the db
91+
public final static String keywordVocabURI="keywordVocabularyURI"; //SEK 6/10/2016 to match what is in the db
9192
public final static String topicClassValue="topicClassValue";
9293
public final static String topicClassVocab="topicClassVocab";
9394
public final static String topicClassVocabURI="topicClassVocabURI";
9495
public final static String descriptionText="dsDescriptionValue";
9596
public final static String descriptionDate="descriptionDate";
97+
public final static String timePeriodCovered="timePeriodCovered"; // SEK added 6/13/2016
9698
public final static String timePeriodCoveredStart="timePeriodCoveredStart";
9799
public final static String timePeriodCoveredEnd="timePeriodCoveredEnd";
100+
public final static String dateOfCollection="dateOfCollection"; // SEK added 6/13/2016
98101
public final static String dateOfCollectionStart="dateOfCollectionStart";
99102
public final static String dateOfCollectionEnd="dateOfCollectionEnd";
100103
public final static String country="country";
101104
public final static String geographicCoverage="geographicCoverage";
102105
public final static String otherGeographicCoverage="otherGeographicCoverage";
106+
public final static String city="city"; // SEK added 6/13/2016
107+
public final static String state="state"; // SEK added 6/13/2016
103108
public final static String geographicUnit="geographicUnit";
104109
public final static String westLongitude="westLongitude";
105110
public final static String eastLongitude="eastLongitude";

src/main/java/edu/harvard/iq/dataverse/DatasetPage.java

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import edu.harvard.iq.dataverse.engine.command.impl.PublishDatasetCommand;
1919
import edu.harvard.iq.dataverse.engine.command.impl.PublishDataverseCommand;
2020
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetCommand;
21+
import edu.harvard.iq.dataverse.export.ExportService;
22+
import edu.harvard.iq.dataverse.export.spi.Exporter;
2123
import edu.harvard.iq.dataverse.ingest.IngestRequest;
2224
import edu.harvard.iq.dataverse.ingest.IngestServiceBean;
2325
import edu.harvard.iq.dataverse.metadataimport.ForeignMetadataImportServiceBean;
@@ -3404,7 +3406,7 @@ public String getVariableMetadataURL(Long fileid) {
34043406
}
34053407

34063408
public String getTabularDataFileURL(Long fileid) {
3407-
String myHostURL = getDataverseSiteUrl();;
3409+
String myHostURL = getDataverseSiteUrl();
34083410
String dataURL = myHostURL + "/api/access/datafile/" + fileid;
34093411

34103412
return dataURL;
@@ -3421,6 +3423,44 @@ public String getMetadataAsJsonUrl() {
34213423
}
34223424
return null;
34233425
}
3426+
3427+
public List< String[]> getExporters(){
3428+
List<String[]> retList = new ArrayList();
3429+
String myHostURL = getDataverseSiteUrl();
3430+
for (String [] provider : ExportService.getInstance().getExportersLabels() ){
3431+
String[] temp = new String[2];
3432+
temp[0] = provider[0];
3433+
temp[1] = myHostURL + "/api/datasets/export?exporter=" + provider[1]+ "&persistentId=" + dataset.getGlobalId();
3434+
retList.add(temp);
3435+
}
3436+
return retList;
3437+
}
3438+
3439+
public String getExportMetadataDDIUrl() {
3440+
if (dataset != null) {
3441+
Long datasetId = dataset.getId();
3442+
if (datasetId != null) {
3443+
String myHostURL = getDataverseSiteUrl();
3444+
String metadataAsJsonUrl = myHostURL + "/api/datasets/" + datasetId + "/export?exporter=DDI&persistentId=" + dataset.getGlobalId();
3445+
System.out.print(metadataAsJsonUrl);
3446+
return metadataAsJsonUrl;
3447+
}
3448+
}
3449+
return null;
3450+
}
3451+
3452+
public String getExportMetadataDublinCoreUrl() {
3453+
if (dataset != null) {
3454+
Long datasetId = dataset.getId();
3455+
if (datasetId != null) {
3456+
String myHostURL = getDataverseSiteUrl();
3457+
String metadataAsJsonUrl = myHostURL + "/api/datasets/" + datasetId + "/export?exporter=DublinCore&persistentId=" + dataset.getGlobalId();
3458+
System.out.print(metadataAsJsonUrl);
3459+
return metadataAsJsonUrl;
3460+
}
3461+
}
3462+
return null;
3463+
}
34243464

34253465
private FileMetadata fileMetadataSelected = null;
34263466

src/main/java/edu/harvard/iq/dataverse/api/Datasets.java

Lines changed: 45 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetTargetURLCommand;
3232
import edu.harvard.iq.dataverse.engine.command.impl.UpdateDatasetVersionCommand;
3333
import edu.harvard.iq.dataverse.export.DDIExportServiceBean;
34+
import edu.harvard.iq.dataverse.export.ExportService;
3435
import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil;
3536
import edu.harvard.iq.dataverse.util.SystemConfig;
3637
import 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
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
package edu.harvard.iq.dataverse.export;
3+
4+
import com.google.auto.service.AutoService;
5+
import edu.harvard.iq.dataverse.export.ddi.DdiExportUtil;
6+
import edu.harvard.iq.dataverse.export.spi.Exporter;
7+
import edu.harvard.iq.dataverse.util.BundleUtil;
8+
import java.io.OutputStream;
9+
import javax.json.JsonObject;
10+
11+
/**
12+
*
13+
* @author skraffmi
14+
*/
15+
@AutoService(Exporter.class)
16+
public class DDIExporter implements Exporter {
17+
18+
@Override
19+
public String getProvider() {
20+
return "DDI";
21+
}
22+
23+
@Override
24+
public String getButtonLabel() {
25+
return BundleUtil.getStringFromBundle("dataset.exportBtn.itemLabel.ddi") != null ? BundleUtil.getStringFromBundle("dataset.exportBtn.itemLabel.ddi") : "DDI";
26+
}
27+
28+
@Override
29+
public OutputStream exportDataset(JsonObject json) {
30+
return DdiExportUtil.datasetJson2ddi(json);
31+
}
32+
33+
@Override
34+
public Boolean isXMLFormat() {
35+
return true;
36+
}
37+
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
2+
package edu.harvard.iq.dataverse.export;
3+
4+
import com.google.auto.service.AutoService;
5+
import edu.harvard.iq.dataverse.export.spi.Exporter;
6+
import edu.harvard.iq.dataverse.util.BundleUtil;
7+
import java.io.OutputStream;
8+
import javax.json.JsonObject;
9+
10+
/**
11+
*
12+
* @author skraffmi
13+
*/
14+
@AutoService(Exporter.class)
15+
public class DublinCoreExporter implements Exporter {
16+
17+
18+
@Override
19+
public String getProvider() {
20+
return "DublinCore";
21+
}
22+
23+
@Override
24+
public String getButtonLabel() {
25+
return BundleUtil.getStringFromBundle("dataset.exportBtn.itemLabel.dublinCore") != null ? BundleUtil.getStringFromBundle("dataset.exportBtn.itemLabel.dublinCore") : "Dublin Core";
26+
}
27+
28+
@Override
29+
public OutputStream exportDataset(JsonObject json) {
30+
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
31+
}
32+
33+
@Override
34+
public Boolean isXMLFormat() {
35+
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
36+
}
37+
38+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
2+
package edu.harvard.iq.dataverse.export;
3+
4+
import edu.harvard.iq.dataverse.export.spi.Exporter;
5+
import java.io.OutputStream;
6+
import java.util.ArrayList;
7+
import java.util.Iterator;
8+
import java.util.List;
9+
import java.util.ServiceConfigurationError;
10+
import java.util.ServiceLoader;
11+
import javax.json.JsonObject;
12+
13+
/**
14+
*
15+
* @author skraffmi
16+
*/
17+
public class ExportService {
18+
19+
private static ExportService service;
20+
private ServiceLoader<Exporter> loader;
21+
22+
private ExportService() {
23+
loader = ServiceLoader.load(Exporter.class);
24+
}
25+
26+
public static synchronized ExportService getInstance() {
27+
if (service == null) {
28+
service = new ExportService();
29+
} else{
30+
service.loader.reload();
31+
}
32+
return service;
33+
}
34+
35+
public List< String[]> getExportersLabels() {
36+
List<String[]> retList = new ArrayList();
37+
Iterator<Exporter> exporters = ExportService.getInstance().loader.iterator();
38+
while (exporters.hasNext()) {
39+
Exporter e = exporters.next();
40+
String[] temp = new String[2];
41+
temp[0] = e.getButtonLabel();
42+
temp[1] = e.getProvider();
43+
retList.add(temp);
44+
}
45+
return retList;
46+
}
47+
48+
public OutputStream getExport(JsonObject json, String provider) {
49+
OutputStream retVal = null;
50+
try {
51+
Iterator<Exporter> exporters = loader.iterator();
52+
while (retVal == null && exporters.hasNext()) {
53+
Exporter e = exporters.next();
54+
if (e.getProvider().equals(provider)) {
55+
retVal = e.exportDataset(json);
56+
break;
57+
}
58+
}
59+
} catch (ServiceConfigurationError serviceError) {
60+
retVal = null;
61+
serviceError.printStackTrace();
62+
}
63+
return retVal;
64+
}
65+
66+
public Boolean isXMLFormat(String provider){
67+
Boolean retVal = false;
68+
try {
69+
Iterator<Exporter> exporters = loader.iterator();
70+
while (exporters.hasNext()) {
71+
Exporter e = exporters.next();
72+
if (e.getProvider().equals(provider)) {
73+
retVal = e.isXMLFormat();
74+
break;
75+
}
76+
}
77+
} catch (ServiceConfigurationError serviceError) {
78+
retVal = null;
79+
serviceError.printStackTrace();
80+
}
81+
return retVal;
82+
}
83+
84+
}

0 commit comments

Comments
 (0)