some renamings, clean up, add Bundeskunsthalle harvest, update to gradle 4.3.1

This commit is contained in:
Jörg Prante 2017-12-08 11:24:59 +01:00
parent cd5004b292
commit d6591cd68e
50 changed files with 645 additions and 376 deletions

1
.gitignore vendored
View file

@ -14,3 +14,4 @@ build
/sessions /sessions
*~ *~
*.MARC *.MARC
out

View file

@ -1,13 +1,25 @@
plugins { plugins {
id "org.sonarqube" version "2.2" id "org.sonarqube" version "2.6.1"
id "org.ajoberstar.github-pages" version "1.6.0-rc.1" id "io.codearte.nexus-staging" version "0.11.0"
id "org.xbib.gradle.plugin.jbake" version "1.2.1" id "org.xbib.gradle.plugin.asciidoctor" version "1.5.4.1.0"
} }
allprojects { printf "Host: %s\nOS: %s %s %s\nJVM: %s %s %s %s\nGroovy: %s\nGradle: %s\n" +
"Build: group: ${project.group} name: ${project.name} version: ${project.version}\n",
InetAddress.getLocalHost(),
System.getProperty("os.name"),
System.getProperty("os.arch"),
System.getProperty("os.version"),
System.getProperty("java.version"),
System.getProperty("java.vm.version"),
System.getProperty("java.vm.vendor"),
System.getProperty("java.vm.name"),
GroovySystem.getVersion(),
gradle.gradleVersion
group = 'org.xbib' apply plugin: "io.codearte.nexus-staging"
version = '1.0.2'
allprojects {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'maven' apply plugin: 'maven'
@ -16,20 +28,25 @@ allprojects {
apply plugin: 'pmd' apply plugin: 'pmd'
apply plugin: 'checkstyle' apply plugin: 'checkstyle'
apply plugin: "jacoco" apply plugin: "jacoco"
apply plugin: 'org.xbib.gradle.plugin.asciidoctor'
repositories { repositories {
mavenCentral() mavenCentral()
} }
configurations { configurations {
alpnagent
asciidoclet
wagon wagon
} }
dependencies { dependencies {
testCompile 'junit:junit:4.12' testCompile "junit:junit:${project.property('junit.version')}"
testCompile 'org.apache.logging.log4j:log4j-core:2.7' testCompile "org.apache.logging.log4j:log4j-core:${project.property('log4j.version')}"
testCompile 'org.apache.logging.log4j:log4j-jul:2.7' testCompile "org.apache.logging.log4j:log4j-jul:${project.property('log4j.version')}"
wagon 'org.apache.maven.wagon:wagon-ssh-external:2.10' testCompile "org.xbib:bibliographic-character-sets:${project.property('xbib-bibliographic-character-sets.version')}"
asciidoclet "org.asciidoctor:asciidoclet:${project.property('asciidoclet.version')}"
wagon "org.apache.maven.wagon:wagon-ssh:${project.property('wagon.version')}"
} }
sourceCompatibility = JavaVersion.VERSION_1_8 sourceCompatibility = JavaVersion.VERSION_1_8
@ -40,6 +57,10 @@ allprojects {
options.compilerArgs << "-Xlint:all" << "-profile" << "compact2" options.compilerArgs << "-Xlint:all" << "-profile" << "compact2"
} }
clean {
delete 'out'
}
test { test {
testLogging { testLogging {
showStandardStreams = false showStandardStreams = false
@ -52,12 +73,15 @@ allprojects {
classifier 'sources' classifier 'sources'
from sourceSets.main.allSource from sourceSets.main.allSource
} }
task javadocJar(type: Jar, dependsOn: javadoc) { task javadocJar(type: Jar, dependsOn: javadoc) {
classifier 'javadoc' classifier 'javadoc'
} }
artifacts { artifacts {
archives sourcesJar, javadocJar archives sourcesJar, javadocJar
} }
if (project.hasProperty('signing.keyId')) { if (project.hasProperty('signing.keyId')) {
signing { signing {
sign configurations.archives sign configurations.archives

14
gradle.properties Normal file
View file

@ -0,0 +1,14 @@
group = org.xbib
name = oai
version = 1.1.0
xbib-content.version = 1.1.0
xbib-bibliographic-character-sets.version = 1.0.0
xbib-marc.version = 1.0.17
helianthus.version = 1.0.10
tcnative.version = 2.0.1.Final
alpnagent.version = 2.0.6
junit.version 4.12
log4j.version = 2.8.2
wagon.version = 2.12
asciidoclet.version = 1.5.4

View file

@ -5,8 +5,4 @@ ext {
scmUrl = 'https://github.com/xbib/oai' scmUrl = 'https://github.com/xbib/oai'
scmConnection = 'scm:git:git://github.com/xbib/oai.git' scmConnection = 'scm:git:git://github.com/xbib/oai.git'
scmDeveloperConnection = 'scm:git:git://github.com/xbib/oai.git' scmDeveloperConnection = 'scm:git:git://github.com/xbib/oai.git'
versions = [
'tcnative': '1.1.33.Fork23',
'alpnboot': '8.1.9.v20160720'
]
} }

View file

@ -22,10 +22,8 @@ tasks.withType(Checkstyle) {
jacocoTestReport { jacocoTestReport {
reports { reports {
xml.enabled true xml.enabled = true
csv.enabled false csv.enabled = false
xml.destination "${buildDir}/reports/jacoco-xml"
html.destination "${buildDir}/reports/jacoco-html"
} }
} }

Binary file not shown.

View file

@ -1,6 +1,6 @@
#Mon Oct 03 00:03:03 CEST 2016 #Wed Dec 06 21:25:32 CET 2017
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-all.zip

172
gradlew vendored Executable file
View file

@ -0,0 +1,172 @@
#!/usr/bin/env sh
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

84
gradlew.bat vendored Normal file
View file

@ -0,0 +1,84 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View file

@ -4,30 +4,18 @@ configurations {
dependencies { dependencies {
compile project(':oai-common') compile project(':oai-common')
compile "org.xbib.helianthus:helianthus-client:1.0.3" compile "org.xbib:marc:${project.property('xbib-marc.version')}"
if ('os x' == org.gradle.internal.os.OperatingSystem.current().getFamilyName()) { compile "org.xbib.helianthus:helianthus-client:${project.property('helianthus.version')}"
testCompile "io.netty:netty-tcnative:${versions.tcnative}:osx-x86_64" compile "io.netty:netty-tcnative-boringssl-static:${project.property('tcnative.version')}"
} testCompile "org.xbib:bibliographic-character-sets:${project.property('xbib-bibliographic-character-sets.version')}"
if ('linux' == org.gradle.internal.os.OperatingSystem.current().getFamilyName()) { alpnagent "org.mortbay.jetty.alpn:jetty-alpn-agent:${project.property('alpnagent.version')}"
if (new File("/etc/redhat-release").exists()) {
// use this for linking to libssl.so.10 (RHEL/Fedora/CentOS)
testCompile "io.netty:netty-tcnative:${versions.tcnative}:linux-x86_64-fedora"
} else {
// use this for linking to libssl.so.1.0.0
testCompile "io.netty:netty-tcnative:${versions.tcnative}:linux-x86_64"
}
}
alpnboot "org.mortbay.jetty.alpn:alpn-boot:${versions.alpnboot}"
} }
test { test {
jvmArgs "-javaagent:" + configurations.alpnagent.asPath
testLogging { testLogging {
showStandardStreams = true showStandardStreams = true
exceptionFormat = 'full' exceptionFormat = 'full'
} }
// note: bootstrapClasspath does not use /p (or /a)
jvmArgs "-Xbootclasspath/p:" + configurations.alpnboot.asPath
systemProperty 'java.util.logging.manager', 'org.apache.logging.log4j.jul.LogManager' systemProperty 'java.util.logging.manager', 'org.apache.logging.log4j.jul.LogManager'
systemProperty 'io.netty.leakDetection.level', 'advanced'
} }

View file

@ -17,9 +17,9 @@ import java.util.logging.Logger;
/** /**
* Client OAI request. * Client OAI request.
*/ */
public class ClientOAIRequest implements OAIRequest { public abstract class AbstractOAIRequest implements OAIRequest {
private static final Logger logger = Logger.getLogger(ClientOAIRequest.class.getName()); private static final Logger logger = Logger.getLogger(AbstractOAIRequest.class.getName());
private URIBuilder uriBuilder; private URIBuilder uriBuilder;
@ -37,7 +37,7 @@ public class ClientOAIRequest implements OAIRequest {
private boolean retry; private boolean retry;
protected ClientOAIRequest() { protected AbstractOAIRequest() {
uriBuilder = new URIBuilder(); uriBuilder = new URIBuilder();
} }
@ -135,35 +135,35 @@ public class ClientOAIRequest implements OAIRequest {
return retry; return retry;
} }
class GetRecord extends ClientOAIRequest { class GetRecord extends AbstractOAIRequest {
public GetRecord() { public GetRecord() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.GET_RECORD); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.GET_RECORD);
} }
} }
class Identify extends ClientOAIRequest { class Identify extends AbstractOAIRequest {
public Identify() { public Identify() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.IDENTIFY); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.IDENTIFY);
} }
} }
class ListIdentifiers extends ClientOAIRequest { class ListIdentifiers extends AbstractOAIRequest {
public ListIdentifiers() { public ListIdentifiers() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_IDENTIFIERS); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_IDENTIFIERS);
} }
} }
class ListMetadataFormats extends ClientOAIRequest { class ListMetadataFormats extends AbstractOAIRequest {
public ListMetadataFormats() { public ListMetadataFormats() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_METADATA_FORMATS); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_METADATA_FORMATS);
} }
} }
class ListRecordsRequest extends ClientOAIRequest { class ListRecordsRequest extends AbstractOAIRequest {
public ListRecordsRequest() { public ListRecordsRequest() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_RECORDS); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_RECORDS);
@ -171,7 +171,7 @@ public class ClientOAIRequest implements OAIRequest {
} }
class ListSetsRequest extends ClientOAIRequest { class ListSetsRequest extends AbstractOAIRequest {
public ListSetsRequest() { public ListSetsRequest() {
addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_SETS); addParameter(OAIConstants.VERB_PARAMETER, OAIConstants.LIST_SETS);

View file

@ -9,7 +9,7 @@ import java.io.Writer;
/** /**
* Default OAI response. * Default OAI response.
*/ */
public interface ClientOAIResponse extends OAIResponse { public abstract class AbstractOAIResponse implements OAIResponse {
void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException; public abstract void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException;
} }

View file

@ -16,9 +16,9 @@ import java.net.URL;
import java.time.Duration; import java.time.Duration;
/** /**
* Default OAI client. * OAI client.
*/ */
public class DefaultOAIClient implements OAIClientMethods, AutoCloseable { public class OAIClient implements AutoCloseable {
private HttpClient client; private HttpClient client;
@ -26,13 +26,11 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
private URL url; private URL url;
@Override public OAIClient setURL(URL url) throws URISyntaxException {
public DefaultOAIClient setURL(URL url) throws URISyntaxException {
return setURL(url, false); return setURL(url, false);
} }
@Override public OAIClient setURL(URL url, boolean trustAlways) throws URISyntaxException {
public DefaultOAIClient setURL(URL url, boolean trustAlways) throws URISyntaxException {
this.url = url; this.url = url;
this.clientFactory = ClientFactory.DEFAULT; this.clientFactory = ClientFactory.DEFAULT;
this.client = new ClientBuilder("none+" + url.toURI()) this.client = new ClientBuilder("none+" + url.toURI())
@ -42,64 +40,103 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return this; return this;
} }
@Override
public URL getURL() { public URL getURL() {
return url; return url;
} }
@Override
public HttpClient getHttpClient() { public HttpClient getHttpClient() {
return client; return client;
} }
@Override
public ClientFactory getFactory() { public ClientFactory getFactory() {
return clientFactory; return clientFactory;
} }
@Override /**
* This verb is used to retrieve information about a repository.
* Some of the information returned is required as part of the OAI-PMH.
* Repositories may also employ the Identify verb to return additional
* descriptive information.
* @return identify request
*/
public IdentifyRequest newIdentifyRequest() { public IdentifyRequest newIdentifyRequest() {
IdentifyRequest request = new IdentifyRequest(); IdentifyRequest request = new IdentifyRequest();
request.setURL(url); request.setURL(url);
return request; return request;
} }
@Override /**
* This verb is used to retrieve the metadata formats available
* from a repository. An optional argument restricts the request
* to the formats available for a specific item.
* @return list metadata formats request
*/
public ListMetadataFormatsRequest newListMetadataFormatsRequest() { public ListMetadataFormatsRequest newListMetadataFormatsRequest() {
ListMetadataFormatsRequest request = new ListMetadataFormatsRequest(); ListMetadataFormatsRequest request = new ListMetadataFormatsRequest();
request.setURL(getURL()); request.setURL(getURL());
return request; return request;
} }
@Override /**
* This verb is used to retrieve the set structure of a repository,
* useful for selective harvesting.
* @return list sets request
*/
public ListSetsRequest newListSetsRequest() { public ListSetsRequest newListSetsRequest() {
ListSetsRequest request = new ListSetsRequest(); ListSetsRequest request = new ListSetsRequest();
request.setURL(getURL()); request.setURL(getURL());
return request; return request;
} }
@Override /**
* This verb is an abbreviated form of ListRecords, retrieving only
* headers rather than records. Optional arguments permit selective
* harvesting of headers based on set membership and/or datestamp.
* Depending on the repository's support for deletions, a returned
* header may have a status attribute of "deleted" if a record
* matching the arguments specified in the request has been deleted.
* @return list identifiers request
*
*/
public ListIdentifiersRequest newListIdentifiersRequest() { public ListIdentifiersRequest newListIdentifiersRequest() {
ListIdentifiersRequest request = new ListIdentifiersRequest(); ListIdentifiersRequest request = new ListIdentifiersRequest();
request.setURL(getURL()); request.setURL(getURL());
return request; return request;
} }
@Override /**
* This verb is used to retrieve an individual metadata record from
* a repository. Required arguments specify the identifier of the item
* from which the record is requested and the format of the metadata
* that should be included in the record. Depending on the level at
* which a repository tracks deletions, a header with a "deleted" value
* for the status attribute may be returned, in case the metadata format
* specified by the metadataPrefix is no longer available from the
* repository or from the specified item.
* @return get record request
*/
public GetRecordRequest newGetRecordRequest() { public GetRecordRequest newGetRecordRequest() {
GetRecordRequest request = new GetRecordRequest(); GetRecordRequest request = new GetRecordRequest();
request.setURL(getURL()); request.setURL(getURL());
return request; return request;
} }
@Override /**
* This verb is used to harvest records from a repository.
* Optional arguments permit selective harvesting of records based on
* set membership and/or datestamp. Depending on the repository's
* support for deletions, a returned header may have a status
* attribute of "deleted" if a record matching the arguments
* specified in the request has been deleted. No metadata
* will be present for records with deleted status.
* @return list records request
*/
public ListRecordsRequest newListRecordsRequest() { public ListRecordsRequest newListRecordsRequest() {
ListRecordsRequest request = new ListRecordsRequest(); ListRecordsRequest request = new ListRecordsRequest();
request.setURL(getURL()); request.setURL(getURL());
return request; return request;
} }
@Override
public IdentifyRequest resume(IdentifyRequest request, ResumptionToken<?> token) { public IdentifyRequest resume(IdentifyRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);
@ -113,7 +150,6 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return nextRequest; return nextRequest;
} }
@Override
public ListRecordsRequest resume(ListRecordsRequest request, ResumptionToken<?> token) { public ListRecordsRequest resume(ListRecordsRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);
@ -127,7 +163,6 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return nextRequest; return nextRequest;
} }
@Override
public ListIdentifiersRequest resume(ListIdentifiersRequest request, ResumptionToken<?> token) { public ListIdentifiersRequest resume(ListIdentifiersRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);
@ -141,7 +176,6 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return nextRequest; return nextRequest;
} }
@Override
public ListMetadataFormatsRequest resume(ListMetadataFormatsRequest request, ResumptionToken<?> token) { public ListMetadataFormatsRequest resume(ListMetadataFormatsRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);
@ -155,7 +189,6 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return nextRequest; return nextRequest;
} }
@Override
public ListSetsRequest resume(ListSetsRequest request, ResumptionToken<?> token) { public ListSetsRequest resume(ListSetsRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);
@ -169,7 +202,6 @@ public class DefaultOAIClient implements OAIClientMethods, AutoCloseable {
return nextRequest; return nextRequest;
} }
@Override
public GetRecordRequest resume(GetRecordRequest request, ResumptionToken<?> token) { public GetRecordRequest resume(GetRecordRequest request, ResumptionToken<?> token) {
if (request.isRetry()) { if (request.isRetry()) {
request.setRetry(false); request.setRetry(false);

View file

@ -1,105 +0,0 @@
package org.xbib.oai.client;
import org.xbib.helianthus.client.ClientFactory;
import org.xbib.helianthus.client.http.HttpClient;
import org.xbib.oai.client.getrecord.GetRecordRequest;
import org.xbib.oai.client.identify.IdentifyRequest;
import org.xbib.oai.client.listidentifiers.ListIdentifiersRequest;
import org.xbib.oai.client.listmetadataformats.ListMetadataFormatsRequest;
import org.xbib.oai.client.listrecords.ListRecordsRequest;
import org.xbib.oai.client.listsets.ListSetsRequest;
import org.xbib.oai.util.ResumptionToken;
import java.net.URISyntaxException;
import java.net.URL;
/**
* OAI client API.
*
*/
public interface OAIClientMethods {
OAIClientMethods setURL(URL uri, boolean trustAlways) throws URISyntaxException;
OAIClientMethods setURL(URL uri) throws URISyntaxException;
URL getURL();
HttpClient getHttpClient();
ClientFactory getFactory();
/**
* This verb is used to retrieve information about a repository.
* Some of the information returned is required as part of the OAI-PMH.
* Repositories may also employ the Identify verb to return additional
* descriptive information.
* @return identify request
*/
IdentifyRequest newIdentifyRequest();
IdentifyRequest resume(IdentifyRequest request, ResumptionToken<?> token);
/**
* This verb is an abbreviated form of ListRecords, retrieving only
* headers rather than records. Optional arguments permit selective
* harvesting of headers based on set membership and/or datestamp.
* Depending on the repository's support for deletions, a returned
* header may have a status attribute of "deleted" if a record
* matching the arguments specified in the request has been deleted.
* @return list identifiers request
*
*/
ListIdentifiersRequest newListIdentifiersRequest();
ListIdentifiersRequest resume(ListIdentifiersRequest request, ResumptionToken<?> token);
/**
* This verb is used to retrieve the metadata formats available
* from a repository. An optional argument restricts the request
* to the formats available for a specific item.
* @return list metadata formats request
*/
ListMetadataFormatsRequest newListMetadataFormatsRequest();
ListMetadataFormatsRequest resume(ListMetadataFormatsRequest request, ResumptionToken<?> token);
/**
* This verb is used to retrieve the set structure of a repository,
* useful for selective harvesting.
* @return list sets request
*/
ListSetsRequest newListSetsRequest();
ListSetsRequest resume(ListSetsRequest request, ResumptionToken<?> token);
/**
* This verb is used to harvest records from a repository.
* Optional arguments permit selective harvesting of records based on
* set membership and/or datestamp. Depending on the repository's
* support for deletions, a returned header may have a status
* attribute of "deleted" if a record matching the arguments
* specified in the request has been deleted. No metadata
* will be present for records with deleted status.
* @return list records request
*/
ListRecordsRequest newListRecordsRequest();
ListRecordsRequest resume(ListRecordsRequest request, ResumptionToken<?> token);
/**
* This verb is used to retrieve an individual metadata record from
* a repository. Required arguments specify the identifier of the item
* from which the record is requested and the format of the metadata
* that should be included in the record. Depending on the level at
* which a repository tracks deletions, a header with a "deleted" value
* for the status attribute may be returned, in case the metadata format
* specified by the metadataPrefix is no longer available from the
* repository or from the specified item.
* @return get record request
*/
GetRecordRequest newGetRecordRequest();
GetRecordRequest resume(GetRecordRequest request, ResumptionToken<?> token);
}

View file

@ -1,11 +1,11 @@
package org.xbib.oai.client.getrecord; package org.xbib.oai.client.getrecord;
import org.xbib.oai.client.ClientOAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
/** /**
* *
*/ */
public class GetRecordRequest extends ClientOAIRequest { public class GetRecordRequest extends AbstractOAIRequest {
public GetRecordRequest() { public GetRecordRequest() {
super(); super();

View file

@ -1,18 +1,17 @@
package org.xbib.oai.client.getrecord; package org.xbib.oai.client.getrecord;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import java.io.IOException;
import java.io.Writer; import java.io.Writer;
/** /**
* *
*/ */
public class GetRecordResponse implements ClientOAIResponse { public class GetRecordResponse extends AbstractOAIResponse {
@Override @Override
public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException { public void receivedResponse(AggregatedHttpMessage message, Writer writer) {
// not implemented yet // not implemented yet
} }
} }

View file

@ -1,12 +1,11 @@
package org.xbib.oai.client.identify; package org.xbib.oai.client.identify;
import org.xbib.oai.OAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
import org.xbib.oai.client.ClientOAIRequest;
/** /**
* *
*/ */
public class IdentifyRequest extends ClientOAIRequest implements OAIRequest { public class IdentifyRequest extends AbstractOAIRequest {
public IdentifyRequest() { public IdentifyRequest() {
super(); super();

View file

@ -4,7 +4,7 @@ import org.w3c.dom.Document;
import org.w3c.dom.Element; import org.w3c.dom.Element;
import org.w3c.dom.NodeList; import org.w3c.dom.NodeList;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import org.xml.sax.InputSource; import org.xml.sax.InputSource;
import org.xml.sax.SAXException; import org.xml.sax.SAXException;
@ -22,7 +22,7 @@ import javax.xml.parsers.ParserConfigurationException;
/** /**
* *
*/ */
public class IdentifyResponse implements ClientOAIResponse { public class IdentifyResponse extends AbstractOAIResponse {
private String repositoryName; private String repositoryName;

View file

@ -1,12 +1,11 @@
package org.xbib.oai.client.listidentifiers; package org.xbib.oai.client.listidentifiers;
import org.xbib.oai.OAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
import org.xbib.oai.client.ClientOAIRequest;
/** /**
* *
*/ */
public class ListIdentifiersRequest extends ClientOAIRequest implements OAIRequest { public class ListIdentifiersRequest extends AbstractOAIRequest {
public ListIdentifiersRequest() { public ListIdentifiersRequest() {
super(); super();

View file

@ -1,7 +1,7 @@
package org.xbib.oai.client.listidentifiers; package org.xbib.oai.client.listidentifiers;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
@ -9,7 +9,7 @@ import java.io.Writer;
/** /**
* *
*/ */
public class ListIdentifiersResponse implements ClientOAIResponse { public class ListIdentifiersResponse extends AbstractOAIResponse {
@Override @Override
public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException { public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException {

View file

@ -1,16 +1,14 @@
package org.xbib.oai.client.listmetadataformats; package org.xbib.oai.client.listmetadataformats;
import org.xbib.oai.OAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
import org.xbib.oai.client.ClientOAIRequest;
/** /**
* *
*/ */
public class ListMetadataFormatsRequest extends ClientOAIRequest implements OAIRequest { public class ListMetadataFormatsRequest extends AbstractOAIRequest {
public ListMetadataFormatsRequest() { public ListMetadataFormatsRequest() {
super(); super();
addParameter(VERB_PARAMETER, LIST_METADATA_FORMATS); addParameter(VERB_PARAMETER, LIST_METADATA_FORMATS);
} }
} }

View file

@ -1,7 +1,7 @@
package org.xbib.oai.client.listmetadataformats; package org.xbib.oai.client.listmetadataformats;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
@ -9,7 +9,7 @@ import java.io.Writer;
/** /**
* *
*/ */
public class ListMetadataFormatsResponse implements ClientOAIResponse { public class ListMetadataFormatsResponse extends AbstractOAIResponse {
@Override @Override
public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException { public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException {

View file

@ -1,7 +1,7 @@
package org.xbib.oai.client.listrecords; package org.xbib.oai.client.listrecords;
import org.xbib.oai.OAIConstants; import org.xbib.oai.OAIConstants;
import org.xbib.oai.client.ClientOAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
import org.xbib.oai.xml.MetadataHandler; import org.xbib.oai.xml.MetadataHandler;
import java.util.LinkedList; import java.util.LinkedList;
@ -10,7 +10,7 @@ import java.util.List;
/** /**
* *
*/ */
public class ListRecordsRequest extends ClientOAIRequest { public class ListRecordsRequest extends AbstractOAIRequest {
private List<MetadataHandler> handlers = new LinkedList<>(); private List<MetadataHandler> handlers = new LinkedList<>();

View file

@ -5,7 +5,7 @@ import io.netty.util.AsciiString;
import org.xbib.content.xml.transform.TransformerURIResolver; import org.xbib.content.xml.transform.TransformerURIResolver;
import org.xbib.content.xml.util.XMLUtil; import org.xbib.content.xml.util.XMLUtil;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import org.xbib.oai.exceptions.BadArgumentException; import org.xbib.oai.exceptions.BadArgumentException;
import org.xbib.oai.exceptions.BadResumptionTokenException; import org.xbib.oai.exceptions.BadResumptionTokenException;
import org.xbib.oai.exceptions.NoRecordsMatchException; import org.xbib.oai.exceptions.NoRecordsMatchException;
@ -32,7 +32,7 @@ import javax.xml.transform.stream.StreamResult;
/** /**
* *
*/ */
public class ListRecordsResponse implements ClientOAIResponse { public class ListRecordsResponse extends AbstractOAIResponse {
private static final Logger logger = Logger.getLogger(ListRecordsResponse.class.getName()); private static final Logger logger = Logger.getLogger(ListRecordsResponse.class.getName());
private static final String[] RETRY_AFTER_HEADERS = { private static final String[] RETRY_AFTER_HEADERS = {

View file

@ -1,11 +1,11 @@
package org.xbib.oai.client.listsets; package org.xbib.oai.client.listsets;
import org.xbib.oai.client.ClientOAIRequest; import org.xbib.oai.client.AbstractOAIRequest;
/** /**
* *
*/ */
public class ListSetsRequest extends ClientOAIRequest { public class ListSetsRequest extends AbstractOAIRequest {
public ListSetsRequest() { public ListSetsRequest() {
super(); super();

View file

@ -1,7 +1,7 @@
package org.xbib.oai.client.listsets; package org.xbib.oai.client.listsets;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.oai.client.ClientOAIResponse; import org.xbib.oai.client.AbstractOAIResponse;
import java.io.IOException; import java.io.IOException;
import java.io.Writer; import java.io.Writer;
@ -9,7 +9,7 @@ import java.io.Writer;
/** /**
* *
*/ */
public class ListSetsResponse implements ClientOAIResponse { public class ListSetsResponse extends AbstractOAIResponse {
@Override @Override
public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException { public void receivedResponse(AggregatedHttpMessage message, Writer writer) throws IOException {

View file

@ -4,6 +4,7 @@ import static org.junit.Assert.assertTrue;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.xbib.helianthus.client.http.HttpClient; import org.xbib.helianthus.client.http.HttpClient;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
@ -15,8 +16,6 @@ import org.xbib.oai.client.identify.IdentifyResponse;
import org.xbib.oai.client.listrecords.ListRecordsRequest; import org.xbib.oai.client.listrecords.ListRecordsRequest;
import org.xbib.oai.client.listrecords.ListRecordsResponse; import org.xbib.oai.client.listrecords.ListRecordsResponse;
import org.xbib.oai.xml.SimpleMetadataHandler; import org.xbib.oai.xml.SimpleMetadataHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
@ -33,13 +32,14 @@ import java.util.concurrent.atomic.AtomicLong;
/** /**
* *
*/ */
@Ignore
public class ArxivClientTest { public class ArxivClientTest {
private static final Logger logger = LogManager.getLogger(ArxivClientTest.class.getName()); private static final Logger logger = LogManager.getLogger(ArxivClientTest.class.getName());
@Test @Test
public void testListRecordsArxiv() throws Exception { public void testListRecordsArxiv() throws Exception {
try (DefaultOAIClient client = new DefaultOAIClient().setURL(new URL("http://export.arxiv.org/oai2"))) { try (OAIClient client = new OAIClient().setURL(new URL("http://export.arxiv.org/oai2"))) {
IdentifyRequest identifyRequest = client.newIdentifyRequest(); IdentifyRequest identifyRequest = client.newIdentifyRequest();
HttpClient httpClient = client.getHttpClient(); HttpClient httpClient = client.getHttpClient();
AggregatedHttpMessage response = httpClient.execute(HttpHeaders.of(HttpMethod.GET, identifyRequest.getPath()) AggregatedHttpMessage response = httpClient.execute(HttpHeaders.of(HttpMethod.GET, identifyRequest.getPath())
@ -58,46 +58,13 @@ public class ArxivClientTest {
listRecordsRequest.setFrom(Instant.parse("2016-11-01T00:00:00Z")); listRecordsRequest.setFrom(Instant.parse("2016-11-01T00:00:00Z"));
listRecordsRequest.setUntil(Instant.parse("2016-11-02T00:00:00Z")); listRecordsRequest.setUntil(Instant.parse("2016-11-02T00:00:00Z"));
listRecordsRequest.setMetadataPrefix("arXiv"); listRecordsRequest.setMetadataPrefix("arXiv");
final AtomicLong count = new AtomicLong(0L); Handler handler = new Handler();
SimpleMetadataHandler simpleMetadataHandler = new SimpleMetadataHandler() {
@Override
public void startDocument() throws SAXException {
logger.debug("start doc");
}
@Override
public void endDocument() throws SAXException {
logger.debug("end doc");
count.incrementAndGet();
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
}
@Override
public void startElement(String ns, String localname, String qname, Attributes atrbts) throws SAXException {
}
@Override
public void endElement(String ns, String localname, String qname) throws SAXException {
}
@Override
public void characters(char[] chars, int pos, int len) throws SAXException {
}
};
File file = File.createTempFile("arxiv.", ".xml"); File file = File.createTempFile("arxiv.", ".xml");
file.deleteOnExit(); file.deleteOnExit();
FileWriter fileWriter = new FileWriter(file); FileWriter fileWriter = new FileWriter(file);
while (listRecordsRequest != null) { while (listRecordsRequest != null) {
try { try {
listRecordsRequest.addHandler(simpleMetadataHandler); listRecordsRequest.addHandler(handler);
ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest); ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest);
logger.info("sending {}", listRecordsRequest.getPath()); logger.info("sending {}", listRecordsRequest.getPath());
response = httpClient.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath()) response = httpClient.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath())
@ -112,12 +79,32 @@ public class ArxivClientTest {
} }
} }
fileWriter.close(); fileWriter.close();
logger.info("count={}", count.get()); logger.info("count={}", handler.count());
assertTrue(count.get() > 0L); assertTrue(handler.count() > 0L);
} catch (ConnectException | ExecutionException e) { } catch (ConnectException | ExecutionException e) {
logger.warn("skipped, can not connect", e); logger.warn("skipped, can not connect", e);
} catch (InterruptedException | IOException e) { } catch (InterruptedException | IOException e) {
throw e; throw e;
} }
} }
class Handler extends SimpleMetadataHandler {
final AtomicLong count = new AtomicLong(0L);
@Override
public void startDocument() {
logger.debug("start doc");
}
@Override
public void endDocument() {
logger.debug("end doc");
count.incrementAndGet();
}
long count() {
return count.get();
}
}
} }

View file

@ -0,0 +1,112 @@
package org.xbib.oai.client;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import org.xbib.helianthus.client.Clients;
import org.xbib.helianthus.client.http.HttpClient;
import org.xbib.helianthus.common.http.AggregatedHttpMessage;
import org.xbib.helianthus.common.http.HttpHeaderNames;
import org.xbib.helianthus.common.http.HttpHeaders;
import org.xbib.helianthus.common.http.HttpMethod;
import org.xbib.marc.Marc;
import org.xbib.marc.json.MarcJsonWriter;
import org.xbib.marc.xml.MarcContentHandler;
import org.xbib.oai.client.identify.IdentifyRequest;
import org.xbib.oai.client.identify.IdentifyResponse;
import org.xbib.oai.client.listrecords.ListRecordsRequest;
import org.xbib.oai.client.listrecords.ListRecordsResponse;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.ConnectException;
import java.net.URI;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutionException;
/**
*
*/
public class BundeskunsthalleTest {
private static final Logger logger = LogManager.getLogger(BundeskunsthalleTest.class.getName());
@Test
public void testListRecords() throws Exception {
String spec = "http://www.bundeskunsthalle.de/cgi-bin/bib/oai-pmh";
try (OAIClient oaiClient = new OAIClient().setURL(new URL(spec), true)) {
IdentifyRequest identifyRequest = oaiClient.newIdentifyRequest();
HttpClient client = oaiClient.getHttpClient();
AggregatedHttpMessage response = client.execute(HttpHeaders.of(HttpMethod.GET, identifyRequest.getPath())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
// follow a maximum of 10 HTTP redirects
int max = 10;
while (response.followUrl() != null && max-- > 0) {
URI uri = URI.create(response.followUrl());
client = Clients.newClient(oaiClient.getFactory(), "none+" + uri, HttpClient.class);
response = client.execute(HttpHeaders.of(HttpMethod.GET, response.followUrl())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
}
IdentifyResponse identifyResponse = new IdentifyResponse();
logger.debug("identifyResponse = {}", response.content().toStringUtf8());
identifyResponse.receivedResponse(response, new StringWriter());
String granularity = identifyResponse.getGranularity();
logger.info("granularity = {}", granularity);
DateTimeFormatter dateTimeFormatter = "YYYY-MM-DD".equals(granularity) ?
DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("GMT")) : null;
ListRecordsRequest listRecordsRequest = oaiClient.newListRecordsRequest();
listRecordsRequest.setDateTimeFormatter(dateTimeFormatter);
listRecordsRequest.setMetadataPrefix("marcxml");
try (MarcJsonWriter writer = new MarcJsonWriter("bk-bulk%d.jsonl", 1000,
MarcJsonWriter.Style.ELASTICSEARCH_BULK, 65536, false)
.setIndex("testindex", "testtype")) {
writer.startDocument();
writer.beginCollection();
while (listRecordsRequest != null) {
try {
ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest);
logger.debug("response = {}", response.headers());
client = oaiClient.getHttpClient();
response = client.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
// follow a maximum of 10 HTTP redirects
max = 10;
while (response.followUrl() != null && max-- > 0) {
URI uri = URI.create(response.followUrl());
client = Clients.newClient(oaiClient.getFactory(), "none+" + uri, HttpClient.class);
response = client.execute(HttpHeaders.of(HttpMethod.GET, response.followUrl())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
}
InputStream inputStream = new ByteArrayInputStream(response.content().array());
Marc.builder()
.setInputStream(inputStream)
.setCharset(StandardCharsets.UTF_8)
.setContentHandler(new MarcContentHandler()
.setFormat("MarcXML")
.setType("Bibliographic")
.addNamespace("http://www.loc.gov/MARC21/slim")
.setMarcListener(writer))
.build()
.xmlReader().parse();
listRecordsResponse.receivedResponse(response, new StringWriter());
listRecordsRequest = oaiClient.resume(listRecordsRequest, listRecordsResponse.getResumptionToken());
} catch (IOException e) {
logger.error(e.getMessage(), e);
listRecordsRequest = null;
}
}
writer.endCollection();
writer.endDocument();
}
} catch (ConnectException | ExecutionException e) {
logger.warn("skipped, can not connect, exception is:", e);
} catch (InterruptedException | IOException e) {
throw e;
}
}
}

View file

@ -4,6 +4,7 @@ import static org.junit.Assert.assertEquals;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.xbib.helianthus.client.http.HttpClient; import org.xbib.helianthus.client.http.HttpClient;
import org.xbib.helianthus.common.http.AggregatedHttpMessage; import org.xbib.helianthus.common.http.AggregatedHttpMessage;
@ -14,8 +15,6 @@ import org.xbib.oai.client.identify.IdentifyRequest;
import org.xbib.oai.client.listrecords.ListRecordsRequest; import org.xbib.oai.client.listrecords.ListRecordsRequest;
import org.xbib.oai.client.listrecords.ListRecordsResponse; import org.xbib.oai.client.listrecords.ListRecordsResponse;
import org.xbib.oai.xml.SimpleMetadataHandler; import org.xbib.oai.xml.SimpleMetadataHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
@ -29,13 +28,14 @@ import java.util.concurrent.atomic.AtomicLong;
/** /**
* *
*/ */
@Ignore
public class DNBClientTest { public class DNBClientTest {
private static final Logger logger = LogManager.getLogger(DNBClientTest.class.getName()); private static final Logger logger = LogManager.getLogger(DNBClientTest.class.getName());
@Test @Test
public void testIdentify() throws Exception { public void testIdentify() throws Exception {
DefaultOAIClient client = new DefaultOAIClient().setURL(new URL("http://services.dnb.de/oai/repository")); OAIClient client = new OAIClient().setURL(new URL("http://services.dnb.de/oai/repository"));
IdentifyRequest request = client.newIdentifyRequest(); IdentifyRequest request = client.newIdentifyRequest();
HttpClient httpClient = client.getHttpClient(); HttpClient httpClient = client.getHttpClient();
assertEquals("/oai/repository?verb=Identify", request.getPath()); assertEquals("/oai/repository?verb=Identify", request.getPath());
@ -45,55 +45,23 @@ public class DNBClientTest {
@Test @Test
public void testListRecordsDNB() throws Exception { public void testListRecordsDNB() throws Exception {
try (DefaultOAIClient client = new DefaultOAIClient().setURL(new URL("http://services.dnb.de/oai/repository"))){ try (OAIClient client = new OAIClient().setURL(new URL("http://services.dnb.de/oai/repository"))){
ListRecordsRequest listRecordsRequest = client.newListRecordsRequest(); ListRecordsRequest listRecordsRequest = client.newListRecordsRequest();
listRecordsRequest.setFrom(Instant.parse("2016-01-01T00:00:00Z")); listRecordsRequest.setFrom(Instant.parse("2016-01-01T00:00:00Z"));
listRecordsRequest.setUntil(Instant.parse("2016-01-10T00:00:00Z")); listRecordsRequest.setUntil(Instant.parse("2016-01-10T00:00:00Z"));
listRecordsRequest.setSet("bib"); listRecordsRequest.setSet("bib");
listRecordsRequest.setMetadataPrefix("PicaPlus-xml"); listRecordsRequest.setMetadataPrefix("PicaPlus-xml");
final AtomicLong count = new AtomicLong(0L); Handler handler = new Handler();
SimpleMetadataHandler simpleMetadataHandler = new SimpleMetadataHandler() {
@Override
public void startDocument() throws SAXException {
logger.debug("startDocument");
}
@Override
public void endDocument() throws SAXException {
count.incrementAndGet();
logger.debug("endDocument");
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
}
@Override
public void startElement(String ns, String localname, String qname, Attributes atrbts) throws SAXException {
}
@Override
public void endElement(String ns, String localname, String qname) throws SAXException {
}
@Override
public void characters(char[] chars, int pos, int len) throws SAXException {
}
};
File file = File.createTempFile("dnb-bib-pica.", ".xml"); File file = File.createTempFile("dnb-bib-pica.", ".xml");
file.deleteOnExit(); file.deleteOnExit();
FileWriter sw = new FileWriter(file); FileWriter sw = new FileWriter(file);
while (listRecordsRequest != null) { while (listRecordsRequest != null) {
try { try {
ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest); ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest);
listRecordsRequest.addHandler(simpleMetadataHandler); listRecordsRequest.addHandler(handler);
HttpClient httpClient = client.getHttpClient(); HttpClient httpClient = client.getHttpClient();
AggregatedHttpMessage response = httpClient.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath()) AggregatedHttpMessage response =
httpClient.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get(); .set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
String content = response.content().toStringUtf8(); String content = response.content().toStringUtf8();
listRecordsResponse.receivedResponse(response, sw); listRecordsResponse.receivedResponse(response, sw);
@ -104,11 +72,31 @@ public class DNBClientTest {
} }
} }
sw.close(); sw.close();
logger.info("count={}", count.get()); logger.info("count={}", handler.count());
} catch (ConnectException | ExecutionException e) { } catch (ConnectException | ExecutionException e) {
logger.warn("skipped, can not connect"); logger.warn("skipped, can not connect");
} catch (IOException e) { } catch (IOException e) {
logger.warn("skipped, HTTP exception"); logger.warn("skipped, HTTP exception");
} }
} }
class Handler extends SimpleMetadataHandler {
final AtomicLong count = new AtomicLong(0L);
@Override
public void startDocument() {
logger.debug("start doc");
}
@Override
public void endDocument() {
logger.debug("end doc");
count.incrementAndGet();
}
long count() {
return count.get();
}
}
} }

View file

@ -2,6 +2,7 @@ package org.xbib.oai.client;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.xbib.helianthus.client.Clients; import org.xbib.helianthus.client.Clients;
import org.xbib.helianthus.client.http.HttpClient; import org.xbib.helianthus.client.http.HttpClient;
@ -14,8 +15,6 @@ import org.xbib.oai.client.identify.IdentifyResponse;
import org.xbib.oai.client.listrecords.ListRecordsRequest; import org.xbib.oai.client.listrecords.ListRecordsRequest;
import org.xbib.oai.client.listrecords.ListRecordsResponse; import org.xbib.oai.client.listrecords.ListRecordsResponse;
import org.xbib.oai.xml.SimpleMetadataHandler; import org.xbib.oai.xml.SimpleMetadataHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
@ -30,11 +29,10 @@ import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import static org.junit.Assert.assertTrue;
/** /**
* *
*/ */
@Ignore
public class DOAJClientTest { public class DOAJClientTest {
private static final Logger logger = LogManager.getLogger(DOAJClientTest.class.getName()); private static final Logger logger = LogManager.getLogger(DOAJClientTest.class.getName());
@ -42,7 +40,7 @@ public class DOAJClientTest {
@Test @Test
public void testListRecordsDOAJ() throws Exception { public void testListRecordsDOAJ() throws Exception {
// will redirect to https://doaj.org/oai // will redirect to https://doaj.org/oai
try (DefaultOAIClient oaiClient = new DefaultOAIClient().setURL(new URL("http://doaj.org/oai"), true)) { try (OAIClient oaiClient = new OAIClient().setURL(new URL("http://doaj.org/oai"), true)) {
IdentifyRequest identifyRequest = oaiClient.newIdentifyRequest(); IdentifyRequest identifyRequest = oaiClient.newIdentifyRequest();
HttpClient client = oaiClient.getHttpClient(); HttpClient client = oaiClient.getHttpClient();
AggregatedHttpMessage response = client.execute(HttpHeaders.of(HttpMethod.GET, identifyRequest.getPath()) AggregatedHttpMessage response = client.execute(HttpHeaders.of(HttpMethod.GET, identifyRequest.getPath())
@ -65,48 +63,18 @@ public class DOAJClientTest {
DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("GMT")) : null; DateTimeFormatter.ofPattern("yyyy-MM-dd").withZone(ZoneId.of("GMT")) : null;
ListRecordsRequest listRecordsRequest = oaiClient.newListRecordsRequest(); ListRecordsRequest listRecordsRequest = oaiClient.newListRecordsRequest();
listRecordsRequest.setDateTimeFormatter(dateTimeFormatter); listRecordsRequest.setDateTimeFormatter(dateTimeFormatter);
listRecordsRequest.setFrom(Instant.parse("2016-01-06T00:00:00Z")); listRecordsRequest.setFrom(Instant.parse("2017-01-01T00:00:00Z"));
listRecordsRequest.setUntil(Instant.parse("2016-11-07T00:00:00Z")); listRecordsRequest.setUntil(Instant.parse("2018-01-01T00:00:00Z"));
listRecordsRequest.setMetadataPrefix("oai_dc"); listRecordsRequest.setMetadataPrefix("oai_dc");
final AtomicLong count = new AtomicLong(0L); Handler handler = new Handler();
SimpleMetadataHandler simpleMetadataHandler = new SimpleMetadataHandler() {
@Override
public void startDocument() throws SAXException {
logger.debug("start doc");
}
@Override
public void endDocument() throws SAXException {
logger.debug("end doc");
count.incrementAndGet();
}
@Override
public void startPrefixMapping(String prefix, String uri) throws SAXException {
}
@Override
public void endPrefixMapping(String prefix) throws SAXException {
}
@Override
public void startElement(String ns, String localname, String qname, Attributes atrbts) throws SAXException {
}
@Override
public void endElement(String ns, String localname, String qname) throws SAXException {
}
@Override
public void characters(char[] chars, int pos, int len) throws SAXException {
}
};
File file = File.createTempFile("doaj.", ".xml"); File file = File.createTempFile("doaj.", ".xml");
file.deleteOnExit(); file.deleteOnExit();
FileWriter fileWriter = new FileWriter(file); FileWriter fileWriter = new FileWriter(file);
while (listRecordsRequest != null) { while (listRecordsRequest != null) {
try { try {
listRecordsRequest.addHandler(simpleMetadataHandler); ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest);
logger.debug("response = {}", response.headers());
listRecordsRequest.addHandler(handler);
client = oaiClient.getHttpClient(); client = oaiClient.getHttpClient();
response = client.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath()) response = client.execute(HttpHeaders.of(HttpMethod.GET, listRecordsRequest.getPath())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get(); .set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
@ -118,8 +86,6 @@ public class DOAJClientTest {
response = client.execute(HttpHeaders.of(HttpMethod.GET, response.followUrl()) response = client.execute(HttpHeaders.of(HttpMethod.GET, response.followUrl())
.set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get(); .set(HttpHeaderNames.ACCEPT, "utf-8")).aggregate().get();
} }
ListRecordsResponse listRecordsResponse = new ListRecordsResponse(listRecordsRequest);
logger.debug("response = {}", response.headers());
listRecordsResponse.receivedResponse(response, fileWriter); listRecordsResponse.receivedResponse(response, fileWriter);
listRecordsRequest = oaiClient.resume(listRecordsRequest, listRecordsResponse.getResumptionToken()); listRecordsRequest = oaiClient.resume(listRecordsRequest, listRecordsResponse.getResumptionToken());
} catch (IOException e) { } catch (IOException e) {
@ -128,8 +94,7 @@ public class DOAJClientTest {
} }
} }
fileWriter.close(); fileWriter.close();
logger.info("count={}", count.get()); logger.info("count={}", handler.count());
assertTrue(count.get() > 0L);
} catch (ConnectException | ExecutionException e) { } catch (ConnectException | ExecutionException e) {
logger.warn("skipped, can not connect, exception is:", e); logger.warn("skipped, can not connect, exception is:", e);
} catch (InterruptedException | IOException e) { } catch (InterruptedException | IOException e) {
@ -137,4 +102,23 @@ public class DOAJClientTest {
} }
} }
class Handler extends SimpleMetadataHandler {
final AtomicLong count = new AtomicLong(0L);
@Override
public void startDocument() {
logger.debug("start doc");
}
@Override
public void endDocument() {
logger.debug("end doc");
count.incrementAndGet();
}
long count() {
return count.get();
}
}
} }

View file

@ -1,3 +1,3 @@
dependencies { dependencies {
compile "org.xbib:content-rdf:1.0.5" compile "org.xbib:content-rdf:${project.property('xbib-content.version')}"
} }

View file

@ -11,7 +11,7 @@ import java.util.Map;
/** /**
* *
*/ */
public abstract class ServerOAIRequest implements OAIRequest { public abstract class AbstractOAIRequest implements OAIRequest {
private String path; private String path;
@ -29,7 +29,7 @@ public abstract class ServerOAIRequest implements OAIRequest {
private boolean retry; private boolean retry;
protected ServerOAIRequest() { protected AbstractOAIRequest() {
this.parameters = new HashMap<>(); this.parameters = new HashMap<>();
} }

View file

@ -7,11 +7,11 @@ import javax.xml.stream.util.XMLEventConsumer;
/** /**
* Default OAI response. * Default OAI response.
*/ */
public class ServerOAIResponse implements OAIResponse { public abstract class AbstractOAIResponse implements OAIResponse {
private XMLEventConsumer consumer; private XMLEventConsumer consumer;
public ServerOAIResponse setConsumer(XMLEventConsumer consumer) { public AbstractOAIResponse setConsumer(XMLEventConsumer consumer) {
this.consumer = consumer; this.consumer = consumer;
return this; return this;
} }

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.getrecord; package org.xbib.oai.server.getrecord;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class GetRecordServerRequest extends ServerOAIRequest { public class GetRecordServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,9 +1,9 @@
package org.xbib.oai.server.getrecord; package org.xbib.oai.server.getrecord;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
/** /**
* *
*/ */
public class GetRecordServerResponse extends ServerOAIResponse { public class GetRecordServerResponse extends AbstractOAIResponse {
} }

View file

@ -1,9 +1,9 @@
package org.xbib.oai.server.identify; package org.xbib.oai.server.identify;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class IdentifyServerRequest extends ServerOAIRequest { public class IdentifyServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,6 +1,6 @@
package org.xbib.oai.server.identify; package org.xbib.oai.server.identify;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
@ -10,7 +10,7 @@ import java.util.List;
/** /**
* *
*/ */
public class IdentifyServerResponse extends ServerOAIResponse { public class IdentifyServerResponse extends AbstractOAIResponse {
private String repositoryName; private String repositoryName;

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listidentifiers; package org.xbib.oai.server.listidentifiers;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class ListIdentifiersServerRequest extends ServerOAIRequest { public class ListIdentifiersServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listidentifiers; package org.xbib.oai.server.listidentifiers;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
/** /**
* *
*/ */
public class ListIdentifiersServerResponse extends ServerOAIResponse { public class ListIdentifiersServerResponse extends AbstractOAIResponse {
} }

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listmetadataformats; package org.xbib.oai.server.listmetadataformats;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class ListMetadataFormatsServerRequest extends ServerOAIRequest { public class ListMetadataFormatsServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listmetadataformats; package org.xbib.oai.server.listmetadataformats;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
/** /**
* *
*/ */
public class ListMetadataFormatsServerResponse extends ServerOAIResponse { public class ListMetadataFormatsServerResponse extends AbstractOAIResponse {
} }

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listrecords; package org.xbib.oai.server.listrecords;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class ListRecordsServerRequest extends ServerOAIRequest { public class ListRecordsServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,13 +1,13 @@
package org.xbib.oai.server.listrecords; package org.xbib.oai.server.listrecords;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
import java.util.Date; import java.util.Date;
/** /**
* *
*/ */
public class ListRecordsServerResponse extends ServerOAIResponse { public class ListRecordsServerResponse extends AbstractOAIResponse {
private String error; private String error;

View file

@ -1,10 +1,10 @@
package org.xbib.oai.server.listsets; package org.xbib.oai.server.listsets;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
/** /**
* *
*/ */
public class ListSetsServerRequest extends ServerOAIRequest { public class ListSetsServerRequest extends AbstractOAIRequest {
} }

View file

@ -1,9 +1,9 @@
package org.xbib.oai.server.listsets; package org.xbib.oai.server.listsets;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
/** /**
* *
*/ */
public class ListSetsServerResponse extends ServerOAIResponse { public class ListSetsServerResponse extends AbstractOAIResponse {
} }

View file

@ -3,10 +3,9 @@ package org.xbib.oai.server.verb;
import org.xbib.oai.OAIConstants; import org.xbib.oai.OAIConstants;
import org.xbib.oai.exceptions.OAIException; import org.xbib.oai.exceptions.OAIException;
import org.xbib.oai.server.OAIServer; import org.xbib.oai.server.OAIServer;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@ -29,22 +28,22 @@ public abstract class AbstractVerb {
private static final String NS_PREFIX = "xsi"; private static final String NS_PREFIX = "xsi";
private final ServerOAIRequest request; private final AbstractOAIRequest request;
private final ServerOAIResponse response; private final AbstractOAIResponse response;
public AbstractVerb(ServerOAIRequest request, ServerOAIResponse response) { public AbstractVerb(AbstractOAIRequest request, AbstractOAIResponse response) {
this.request = request; this.request = request;
this.response = response; this.response = response;
} }
public abstract void execute(OAIServer adapter) throws OAIException; public abstract void execute(OAIServer server) throws OAIException;
protected void beginDocument() throws XMLStreamException { protected void beginDocument() throws XMLStreamException {
response.getConsumer().add(eventFactory.createStartDocument()); response.getConsumer().add(eventFactory.createStartDocument());
} }
protected void endDocument() throws XMLStreamException, IOException { protected void endDocument() throws XMLStreamException {
response.getConsumer().add(eventFactory.createEndDocument()); response.getConsumer().add(eventFactory.createEndDocument());
} }

View file

@ -15,10 +15,10 @@ public class Identify extends AbstractVerb {
} }
@Override @Override
public void execute(OAIServer adapter) throws OAIException { public void execute(OAIServer server) throws OAIException {
try { try {
beginDocument(); beginDocument();
beginOAIPMH(adapter.getBaseURL()); beginOAIPMH(server.getBaseURL());
beginElement("Identify"); beginElement("Identify");
endElement("Identify"); endElement("Identify");
endOAIPMH(); endOAIPMH();

View file

@ -2,15 +2,15 @@ package org.xbib.oai.server.verb;
import org.xbib.oai.exceptions.OAIException; import org.xbib.oai.exceptions.OAIException;
import org.xbib.oai.server.OAIServer; import org.xbib.oai.server.OAIServer;
import org.xbib.oai.server.ServerOAIRequest; import org.xbib.oai.server.AbstractOAIRequest;
import org.xbib.oai.server.ServerOAIResponse; import org.xbib.oai.server.AbstractOAIResponse;
/** /**
* *
*/ */
public class ListMetadataFormats extends AbstractVerb { public class ListMetadataFormats extends AbstractVerb {
public ListMetadataFormats(ServerOAIRequest request, ServerOAIResponse response) { public ListMetadataFormats(AbstractOAIRequest request, AbstractOAIResponse response) {
super(request, response); super(request, response);
} }

View file

@ -16,7 +16,6 @@ import org.xbib.oai.server.listsets.ListSetsServerResponse;
import org.xbib.oai.server.verb.Identify; import org.xbib.oai.server.verb.Identify;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL; import java.net.URL;
import java.util.Date; import java.util.Date;

View file

@ -1,4 +1,5 @@
rootProject.name = 'oai' rootProject.name = name
include 'oai-common' include 'oai-common'
include 'oai-client' include 'oai-client'
include 'oai-server' include 'oai-server'