Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .github/workflows/ddi-pdf-maven-snapshot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
name: DDI PDF Snapshot to Maven Central Repository
on:
push:
branches:
- main
paths:
- "ddi-pdf/**"
pull_request:
branches:
- main
paths:
- "ddi-pdf/**"
jobs:
publish:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.head_commit.message, '[maven-release-plugin]') }}
strategy:
matrix:
java: [17]
steps:
- uses: actions/checkout@v4
- name: Set up Maven Central Repository
uses: actions/setup-java@v4
with:
java-version: ${{ matrix.java }}
distribution: 'adopt'
server-id: ossrh
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
- name: Cache Maven packages
uses: actions/cache@v4
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build, test, verify and publish snapshot
run: mvn -f ddi-pdf -B verify -Djdk.version=${{ matrix.java }}
- name: Publish snapshot
if: ${{ matrix.java == '17' }}
run: mvn -f ddi-pdf deploy -DskipAnalysis -DskipUT -DskipIT -Djdk.version=${{ matrix.java }}
env:
MAVEN_USERNAME: ${{ secrets.DATAVERSEBOT_SONATYPE_USERNAME }}
MAVEN_PASSWORD: ${{ secrets.DATAVERSEBOT_SONATYPE_TOKEN }}
86 changes: 86 additions & 0 deletions ddi-pdf/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>io.gdcc.export</groupId>
<artifactId>ddi-pdf</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

<dependencies>
<dependency>
<groupId>io.gdcc</groupId>
<artifactId>dataverse-spi</artifactId>
<scope>provided</scope>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<scope>provided</scope>
<version>1.0.1</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<scope>provided</scope>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<scope>provided</scope>
<version>3.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.xmlgraphics/fop -->
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>fop</artifactId>
<version>2.8</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
<repository>
<id>ossrh</id>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>17</release>
</configuration>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.13</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://s01.oss.sonatype.org</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>

</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package io.gdcc.spi.export.ddipdf;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.*;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import jakarta.json.Json;
import jakarta.json.JsonArray;
import jakarta.json.JsonArrayBuilder;
import jakarta.json.JsonObject;
import jakarta.json.JsonString;
import jakarta.json.JsonValue;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;

// For write operation
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import java.io.InputStream;

import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXResult;

import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.Fop;
import org.apache.fop.apps.FopFactory;
import org.apache.fop.apps.MimeConstants;
import java.io.File;


public class DdiPdfExportUtil {

private static final Logger logger = Logger.getLogger(DdiPdfExportUtil.class.getCanonicalName());
public static void datasetPdfDDI(InputStream datafile, OutputStream outputStream) throws XMLStreamException {
try {
InputStream styleSheetInput = DdiPdfExportUtil.class.getResourceAsStream("ddi-to-fo.xsl");

final FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
FOUserAgent foUserAgent = fopFactory.newFOUserAgent();

try {
Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, foUserAgent, outputStream);
// Setup XSLT
TransformerFactory factory = TransformerFactory.newInstance();
Source mySrc = new StreamSource(styleSheetInput);
factory.setURIResolver(new FileResolver());
Transformer transformer = factory.newTransformer(mySrc);

// Set the value of a <param> in the stylesheet
String localeEnvVar = System.getenv().get("LANG");
if (localeEnvVar != null) {
if (localeEnvVar.indexOf('.') > 0) {
localeEnvVar = localeEnvVar.substring(0, localeEnvVar.indexOf('.'));
}
} else {
localeEnvVar = "en";
}
transformer.setParameter("language-code", localeEnvVar);

// Setup input for XSLT transformation
Source src = new StreamSource(datafile);

// Resulting SAX events (the generated FO) must be piped through to FOP
Result res = new SAXResult(fop.getDefaultHandler());

// Start XSLT transformation and FOP processing
transformer.transform(src, res);

} catch (Exception e) {
logger.severe(e.getMessage());
}
} catch (Exception e) {
logger.severe(e.getMessage());
}
}

}
28 changes: 28 additions & 0 deletions ddi-pdf/src/main/java/io/gdcc/spi/export/ddipdf/FileResolver.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package io.gdcc.spi.export.ddipdf;

import java.io.InputStream;
import java.util.logging.Logger;

import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;

public class FileResolver implements URIResolver {

private static final Logger logger = Logger.getLogger(FileResolver.class.getCanonicalName());


@Override
public Source resolve(String href, String base) throws TransformerException {
logger.info("In File Resolver: " + href + " " + base);
if (href.startsWith("file:")) {
String url =href.substring("file:".length()); // some calculation from its parameters
InputStream is = this.getClass().getResourceAsStream(url);
return new StreamSource(is);
} else {
return null;
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@


package io.gdcc.spi.export.ddipdf;

import com.google.auto.service.AutoService;

import io.gdcc.spi.export.ddipdf.DdiPdfExportUtil;
import io.gdcc.spi.export.ExportDataProvider;
import io.gdcc.spi.export.ExportException;
import io.gdcc.spi.export.Exporter;
import jakarta.ws.rs.core.MediaType;

import javax.xml.stream.XMLStreamException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Locale;
import java.util.Optional;

@AutoService(Exporter.class)
public class PdfCodeBookExporter implements Exporter {

@Override
public String getFormatName() {
return "pdf";
}

@Override
public String getDisplayName(Locale locale) {
//String displayName = BundleUtil.getStringFromBundle("dataset.exportBtn.itemLabel.pdf", locale);
String displayName = null;
return Optional.ofNullable(displayName).orElse("DDI pdf codebook");
}

@Override
public void exportDataset(ExportDataProvider dataProvider, OutputStream outputStream) throws ExportException {
Optional<InputStream> ddiInputStreamOptional = dataProvider.getPrerequisiteInputStream();
if (ddiInputStreamOptional.isPresent()) {
try (InputStream ddiInputStream = ddiInputStreamOptional.get()) {
DdiPdfExportUtil.datasetPdfDDI(ddiInputStream, outputStream);
} catch (IOException e) {
throw new ExportException("Cannot open export_ddi cached file");
} catch (XMLStreamException xse) {
throw new ExportException("Caught XMLStreamException performing DDI export");
}
} else {
throw new ExportException("No prerequisite input stream found");
}
}

@Override
public Boolean isHarvestable() {
// No, we don't want this format to be harvested!
// For datasets with tabular data the <data> portions of the DDIs
// become huge and expensive to parse; even as they don't contain any
// metadata useful to remote harvesters. -- L.A. 4.5
return false;
}

@Override
public Boolean isAvailableToUsers() {
return true;
}

@Override
public Optional<String> getPrerequisiteFormatName() {
//This exporter relies on being able to get the output of the ddi exporter
return Optional.of("ddi");
}

@Override
public String getMediaType() {
return MediaType.WILDCARD;
};
}



Loading