migrate to jersey for an easy wadl generator,
add sentences and keywords positions
diff --git a/src/main/java/de/mannheim/ids/sruws/Corpus.java b/src/main/java/de/mannheim/ids/sruws/Corpus.java
index b980e15..3d80def 100644
--- a/src/main/java/de/mannheim/ids/sruws/Corpus.java
+++ b/src/main/java/de/mannheim/ids/sruws/Corpus.java
@@ -3,19 +3,27 @@
import java.util.ArrayList;
import java.util.List;
-public class Corpus {
+public class Corpus {
String name;
String pid;
- List<String[]> tokenizedSentences;
+ List<Sentence> sentences;
public Corpus(String pid, String name) {
this.pid = pid;
this.name = name;
- tokenizedSentences =new ArrayList<String[]>();
+ this.sentences = new ArrayList<Sentence>();
}
- public void addSentence(String sentence){
- tokenizedSentences.add(sentence.split("\\s+"));
+ public List<Sentence> getSentences() {
+ return sentences;
+ }
+
+ public void setSentences(List<Sentence> sentences) {
+ this.sentences = sentences;
+ }
+
+ public void addSentence(Sentence s){
+ sentences.add(s);
}
public String getName() {
@@ -30,13 +38,4 @@
public void setPid(String pid) {
this.pid = pid;
}
- public List<String[]> getTokenizedSentences() {
- return tokenizedSentences;
- }
- public void setTokenizedSentences(List<String[]> tokenizedSentences) {
- this.tokenizedSentences = tokenizedSentences;
- }
-
-
-
}
diff --git a/src/main/java/de/mannheim/ids/sruws/SRU_WS.java b/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
index fa7d21d..a58e14c 100644
--- a/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
+++ b/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
@@ -9,14 +9,24 @@
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
@@ -25,8 +35,8 @@
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.XMLEvent;
+import org.apache.commons.lang3.ArrayUtils;
import org.apache.http.HttpEntity;
-import org.apache.http.HttpHeaders;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
@@ -37,7 +47,6 @@
import org.xml.sax.SAXException;
import eu.clarin.weblicht.wlfxb.io.WLDObjector;
-import eu.clarin.weblicht.wlfxb.io.WLFormatException;
import eu.clarin.weblicht.wlfxb.tc.api.MatchedCorpus;
import eu.clarin.weblicht.wlfxb.tc.api.MatchesLayer;
import eu.clarin.weblicht.wlfxb.tc.api.SentencesLayer;
@@ -50,12 +59,14 @@
* @author margaretha
* */
-public class SRU_WS extends HttpServlet{
+@Path("/")
+public class SRU_WS{
private String endpointUri;
private String endpointBase = "de.mannheim.ids.sruws.endpoint.";
- private String DUMMY_PID = "Wikipedia";
+ private Corpus defaultCorpus;
+ private static final int DEFAULT_MAX_RECORDS = 10;
private static final String HITS_NS = "http://clarin.eu/fcs/dataview/hits";
private static final String HITS_PREFIX = "hits";
private static final String FCS_NS = "http://clarin.eu/fcs/1.0";
@@ -65,11 +76,85 @@
private static String CORPUS_LANG = "de";
private static String QUERY_LANG = "CQL";
- private Map<String,Corpus> corpusList = new HashMap<String,Corpus>();
-
- private Logger logger = (Logger) LoggerFactory.getLogger(SRU_WS.class);
- private SAXParserFactory factory = SAXParserFactory.newInstance();
-
+ private Map<String,Corpus> corpusList;
+ private SAXParserFactory factory;
+ private Logger logger;
+
+ @Context
+ ServletConfig config;
+
+ public SRU_WS() {
+ logger = (Logger) LoggerFactory.getLogger(SRU_WS.class);
+ factory = SAXParserFactory.newInstance();
+ corpusList = new HashMap<String,Corpus>();
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_XML)
+ public StreamingOutput doGet(@QueryParam("query") String query,
+ @QueryParam("endpoint") String endpoint,
+ @QueryParam("maximumRecords") int maximumRecords) throws IOException, ServletException{
+ return process(endpoint, query, maximumRecords);
+ };
+
+ @POST
+ @Produces(MediaType.TEXT_XML)
+ @Consumes("text/query-cql")
+ public StreamingOutput doPost(@QueryParam("query") String query,
+ @QueryParam("endpoint") String endpoint,
+ @QueryParam("maximumRecords") int maximumRecords) throws IOException, ServletException{
+
+ return process(endpoint, query, maximumRecords);
+ }
+
+ private StreamingOutput process(String endpoint, String query, int max)
+ throws IOException, ServletException {
+
+ if (endpoint == null || endpoint.isEmpty()){
+ throw new WebApplicationException(
+ Response.status(Response.Status.BAD_REQUEST)
+ .entity("Endpoint parameter cannot be empty.")
+ .type(MediaType.TEXT_PLAIN).build());
+ }
+ else if (config.getInitParameter(endpointBase+endpoint) == null){
+ throw new WebApplicationException(
+ Response.status(Response.Status.BAD_REQUEST)
+ .entity("Endpoint URL for the endpoint parameter cannot be found.")
+ .type(MediaType.TEXT_PLAIN).build());
+ }
+ else if (query == null || query.isEmpty()){
+ throw new WebApplicationException(
+ Response.status(Response.Status.BAD_REQUEST)
+ .entity("Query cannot be empty.")
+ .type(MediaType.TEXT_PLAIN).build());
+ }
+
+ if (max==0) max = DEFAULT_MAX_RECORDS;
+
+ endpointUri = config.getInitParameter(endpointBase+endpoint);
+ logger.info("Endpoint URL {} ",endpointUri);
+
+ generateCorpusList();
+ logger.info(query.toString());
+
+ HttpGet getReq = createSearchRetrieveRequest(query, max);
+ CloseableHttpClient httpClient = HttpClients.createDefault();
+ CloseableHttpResponse httpResponse = httpClient.execute(getReq);
+ HttpEntity httpEntity = httpResponse.getEntity();
+ BufferedInputStream bis = new BufferedInputStream(httpEntity.getContent());
+
+ String text;
+ try {
+ text = readKwicInput(bis);
+ //logger.info(text);
+ } catch (XMLStreamException e) {
+ throw new ServletException("XML streaming error");
+ }
+
+ return writeTCL(text, query);
+
+ }
+
private void generateCorpusList() throws IOException{
corpusList = new HashMap<String, Corpus>();
@@ -94,106 +179,20 @@
SAXParser saxParser = factory.newSAXParser();
SRUScanResonseHandler handler = new SRUScanResonseHandler();
saxParser.parse(bis, handler);
- corpusList = handler.getCorpora();
+ corpusList = handler.getCorpora();
} catch (ParserConfigurationException | SAXException e) {
e.printStackTrace();
}
- }
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
-
- String endpoint = req.getParameter("endpoint");
- String query = req.getParameter("query");
- String max = req.getParameter("maximumRecords");
-
- if (!req.getHeader(HttpHeaders.ACCEPT).equals("text/query-cql")){
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST,
- "Only Accept request-header of mediatype 'text/query-cql' is accepted.");
- }
- else if (endpoint == null || endpoint.isEmpty()){
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST,
- "Endpoint parameter cannot be empty.");
- }
- else if (getServletConfig().getInitParameter(endpointBase+endpoint) == null){
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST,
- "Endpoint parameter is incorrect.");
- }
- else if (query == null || query.isEmpty()){
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "Query cannot be empty.");
- }
- else if (max == null || max.isEmpty() || max.equals("0")){
- resp.sendError(HttpServletResponse.SC_BAD_REQUEST,
- "The maximumRecords must be specified greater than 0.");
- }
- else{
-
- endpointUri = getServletConfig().getInitParameter(endpointBase+endpoint);
- logger.info("Endpoint URL {} ",endpointUri);
-
- generateCorpusList();
-
- HttpGet getReq = createSearchRetrieveRequest(query, req.getParameter("maximumRecords"));
- CloseableHttpClient httpClient = HttpClients.createDefault();
- CloseableHttpResponse httpResponse = httpClient.execute(getReq);
- HttpEntity httpEntity = httpResponse.getEntity();
- BufferedInputStream bis = new BufferedInputStream(httpEntity.getContent());
-
- //List<String[]> tokenizedSentences = new ArrayList<String[]>();
- String text;
- try {
- //text = readInput(bis, tokenizedSentences);
- text = readKwicInput(bis);
- //logger.info(text);
- } catch (XMLStreamException e) {
- throw new ServletException("XML streaming error");
- }
-
- writeTCL(resp.getOutputStream(), text, query);
- //writeTCL(resp.getOutputStream(), text, tokenizedSentences, query);
- }
+ defaultCorpus = new Corpus(endpointUri, endpointUri);
+ corpusList.put(endpointUri, defaultCorpus);
}
-
- public void writeTCL(OutputStream out, String text, List<String[]> tokenizedSentences, String query){
- TextCorpusStored textCorpus = new TextCorpusStored(CORPUS_LANG);
+
+ private StreamingOutput writeTCL(String text, String query){
+ final TextCorpusStored textCorpus = new TextCorpusStored(CORPUS_LANG);
textCorpus.createTextLayer().addText(text);
-
- TokensLayer tokensLayer = textCorpus.createTokensLayer();
- SentencesLayer sentencesLayer = textCorpus.createSentencesLayer();
- MatchesLayer matchesLayer = textCorpus.createMatchesLayer(QUERY_LANG, query);
- MatchedCorpus matchedCorpus = matchesLayer.addCorpus("Wikipedia", "WikiPID");
- List<Token> itemToken = new ArrayList<Token>();
- for (int i=0; i<tokenizedSentences.size();i++){
- List<Token> sentenceTokens = new ArrayList<Token>();
- for (String tokenString : tokenizedSentences.get(i)) {
-
- Token token = tokensLayer.addToken(tokenString);
- sentenceTokens.add(token);
-
- if (tokenString.equalsIgnoreCase(query)){
- itemToken.add(token);
- }
- }
- sentencesLayer.addSentence(sentenceTokens);
- matchesLayer.addItem(matchedCorpus, itemToken);
- itemToken.clear();
- }
-
- WLData wlData = new WLData(textCorpus);
- try {
- WLDObjector.write(wlData, out);
- } catch (WLFormatException e) {
- e.printStackTrace();
- }
- }
-
- public void writeTCL(OutputStream out, String text, String query){
- TextCorpusStored textCorpus = new TextCorpusStored(CORPUS_LANG);
- textCorpus.createTextLayer().addText(text);
-
TokensLayer tokensLayer = textCorpus.createTokensLayer();
SentencesLayer sentencesLayer = textCorpus.createSentencesLayer();
MatchesLayer matchesLayer = textCorpus.createMatchesLayer(QUERY_LANG, query);
@@ -201,38 +200,49 @@
Corpus c;
MatchedCorpus matchedCorpus;
for (String pid : corpusList.keySet()){
- c = corpusList.get(pid);
- if (c.getTokenizedSentences().size() == 0) continue;
+ c = corpusList.get(pid);
+ //logger.info(pid);
+ List<Sentence> sentences = c.getSentences();
+ if (sentences.size() == 0) continue;
- matchedCorpus = matchesLayer.addCorpus(c.getName(), c.getPid());
-
- List<String[]> tokenizedSentences = c.getTokenizedSentences();
+ matchedCorpus = matchesLayer.addCorpus(c.getName(), c.getPid());
List<Token> itemToken = new ArrayList<Token>();
- for (int i=0; i<tokenizedSentences.size();i++){
+ for (Sentence sentence : sentences){
+ List<Token> sentenceTokens = new ArrayList<Token>();
- List<Token> sentenceTokens = new ArrayList<Token>();
- for (String tokenString : tokenizedSentences.get(i)) {
+ String[] tokenStrings = sentence.getTokens();
+ int[] keyIndexes = sentence.getKeyIndexes();
+
+ int j=0; // counter for keyIndexes
+ for (int k = 0; k < tokenStrings.length; k++) {
+ String tokenString = tokenStrings[k];
Token token = tokensLayer.addToken(tokenString);
- sentenceTokens.add(token);
-
- if (tokenString.equalsIgnoreCase(query)){
- itemToken.add(token);
+ sentenceTokens.add(token);
+
+ if (j < keyIndexes.length && keyIndexes[j] == k){
+ itemToken.add(j,token);
+ j++;
}
- }
- sentencesLayer.addSentence(sentenceTokens);
+ }
+
+ sentencesLayer.addSentence(sentenceTokens);
matchesLayer.addItem(matchedCorpus, itemToken);
itemToken.clear();
}
}
- WLData wlData = new WLData(textCorpus);
- try {
- WLDObjector.write(wlData, out);
- } catch (WLFormatException e) {
- e.printStackTrace();
- }
+ return new StreamingOutput() {
+ @Override
+ public void write(OutputStream output) throws IOException,
+ WebApplicationException {
+ WLData wlData = new WLData(textCorpus);
+ WLDObjector.write(wlData, output);
+ output.flush();
+ }
+ };
+
}
private String readKwicInput(InputStream is) throws XMLStreamException, UnsupportedEncodingException{
@@ -259,12 +269,10 @@
String pid = reader.getAttributeValue(i);
logger.info("Corpus: " + URLDecoder.decode(pid,"UTF-8"));
c = corpusList.get(URLDecoder.decode(pid,"UTF-8"));
- if (c == null) c = corpusList.get(DUMMY_PID);
- //logger.info(c.getPid());
+ if (c == null) c = defaultCorpus;
}
}
}
-
else if (e == XMLEvent.START_ELEMENT &&
reader.getLocalName().equals("kwic") ){
@@ -273,35 +281,38 @@
else if (e == XMLEvent.START_ELEMENT &&
reader.getLocalName().equals("c") ){
- reader.next();
- sb.append(reader.getText());
+ e = reader.next();
+ while (e == XMLEvent.CHARACTERS){
+ //logger.info("context: "+reader.getText());
+ sb.append(reader.getText());
+ e = reader.next();
+ }
sb.append(" ");
}
else if (e == XMLEvent.START_ELEMENT &&
reader.getLocalName().equals("kw")){
- reader.next();
- sb.append(reader.getText());
- sb.append(" ");
- }
-
- else if (e == XMLEvent.START_ELEMENT &&
- reader.getLocalName().equals("c")){
- reader.next();
- sb.append(reader.getText());
- sb.append(" ");
+ e = reader.next();
+ if (e == XMLEvent.CHARACTERS){
+ String keyword = reader.getText();
+ sb.append("#");
+ sb.append(keyword);
+ sb.append("# ");
+ }
}
else if (e == XMLEvent.END_ELEMENT &&
reader.getLocalName().equals("kwic")){
+
kwic = normalizeString(sb.toString());
- //logger.info("sentence {}", kwic);
- c.addSentence(kwic);
- kwicCollector.append(kwic);
+ Sentence s = createSentence(kwic);
+ c.addSentence(s);
+ //logger.info(kwic);
+ kwicCollector.append(s.getSentenceString());
}
}
return kwicCollector.toString();
- }
+ }
private String readInput(InputStream is, List<String[]> tokenizedSentences)
throws XMLStreamException{
@@ -346,20 +357,55 @@
return kwicCollector.toString();
}
- private String normalizeString(String text){
+ private Sentence createSentence(String kwic){
+ String[] tokens = kwic.split("\\s+");
+ int open = ArrayUtils.indexOf(tokens,"#");
+ tokens = ArrayUtils.remove(tokens, open);
+ int close = ArrayUtils.lastIndexOf(tokens,"#");
+ tokens= ArrayUtils.remove(tokens, close);
+
+ int[] keyIndexes = new int[close-open];
+ int j=0;
+ for (int i=open; i<close; i++){
+ //logger.info(i+" "+tokens[i]);
+ keyIndexes[j] = i;
+ j++;
+ }
+
StringBuilder sb = new StringBuilder();
+ for (String t: tokens){
+ sb.append(t);
+ sb.append(" ");
+ }
+ String sentenceString = sb.toString();
+
+ return new Sentence(sentenceString, tokens, keyIndexes);
+ }
+
+ private String normalizeString(String text){
+ boolean isPrevPunctuation = false;
+
+ StringBuilder sb = new StringBuilder();
for (int j = 0; j < text.length(); j++){
char temp = text.charAt(j);
if (!Character.isDigit(temp) && !Character.isLetter(temp)){
if (temp == '\''){ sb.append(temp); }
- else { sb.append(" "+temp); }
+ else {
+ sb.append(" ");
+ isPrevPunctuation = true;
+ }
}
- else{ sb.append(temp); }
+ sb.append(temp);
+
+ if (isPrevPunctuation) {
+ sb.append(" ");
+ isPrevPunctuation = false;
+ }
}
- return sb.toString();
+ return sb.toString().replaceAll("\\s+", " ");
}
- private HttpGet createSearchRetrieveRequest(String query, String maximumRecords)
+ private HttpGet createSearchRetrieveRequest(String query, int maximumRecords)
throws ServletException{
try {
URIBuilder builder = new URIBuilder(endpointUri);
@@ -367,7 +413,7 @@
builder.setParameter("version", "1.2");
builder.setParameter("query", query);
builder.setParameter("startRecord", "1");
- builder.setParameter("maximumRecords", maximumRecords);
+ builder.setParameter("maximumRecords", String.valueOf(maximumRecords));
URI requestURI = builder.build();
return new HttpGet(requestURI);
}
diff --git a/src/main/java/de/mannheim/ids/sruws/Sentence.java b/src/main/java/de/mannheim/ids/sruws/Sentence.java
new file mode 100644
index 0000000..705f720
--- /dev/null
+++ b/src/main/java/de/mannheim/ids/sruws/Sentence.java
@@ -0,0 +1,34 @@
+package de.mannheim.ids.sruws;
+
+public class Sentence{
+
+ String sentenceString;
+ String[] tokens;
+ int[] keyIndexes;
+
+ public Sentence(String str, String[] tokens, int[] keyIndexes) {
+ this.sentenceString = str;
+ this.tokens = tokens;
+ this.keyIndexes = keyIndexes;
+ }
+
+ public String getSentenceString() {
+ return sentenceString;
+ }
+ public void setSentenceString(String sentenceString) {
+ this.sentenceString = sentenceString;
+ }
+
+ public String[] getTokens() {
+ return tokens;
+ }
+ public void setTokens(String[] tokens) {
+ this.tokens = tokens;
+ }
+ public int[] getKeyIndexes() {
+ return keyIndexes;
+ }
+ public void setKeyIndexes(int[] keyIndexes) {
+ this.keyIndexes = keyIndexes;
+ }
+}
diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties
index 022a9df..ffee5c4 100644
--- a/src/main/resources/log4j.properties
+++ b/src/main/resources/log4j.properties
@@ -1,6 +1,6 @@
-log4j.rootLogger=DEBUG, STDOUT
-log4j.de.mannheim.ids.sruws.SRU_WS = INFO, STDOUT
+log4j.rootLogger=INFO, STDOUT
+log4j.de.mannheim.ids.sruws.SRU_WS = DEBUG, STDOUT
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 27ff16c..d2235e6 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -1,9 +1,18 @@
-<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="SRU_WEB_SERVICE">
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+
+<web-app id="SRU_WEB_SERVICE">
<display-name>SRU Web-service</display-name>
<servlet>
<servlet-name>SRU_WS</servlet-name>
- <servlet-class>de.mannheim.ids.sruws.SRU_WS</servlet-class>
+ <!-- <servlet-class>de.mannheim.ids.sruws.SRU_WS</servlet-class> -->
+ <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
+ <init-param>
+ <param-name>com.sun.jersey.config.property.packages</param-name>
+ <param-value>de.mannheim.ids.sruws</param-value>
+ </init-param>
<init-param>
<param-name>de.mannheim.ids.sruws.endpoint.korap</param-name>
<param-value>http://clarin.ids-mannheim.de/korapsru</param-value>
@@ -24,34 +33,45 @@
<param-name>de.mannheim.ids.sruws.endpoint.stuttgart</param-name>
<param-value>http://clarin01.ims.uni-stuttgart.de/SRUCQIBridge</param-value>
</init-param>
- <!-- same case like goethe, pid is sub-resource -->
- <init-param>
- <param-name>de.mannheim.ids.sruws.endpoint.muenchen</param-name>
- <param-value>https://clarin.phonetik.uni-muenchen.de/BASSRU/</param-value>
- </init-param>
- <!-- weird pid -->
- <init-param>
- <param-name>de.mannheim.ids.sruws.endpoint.mpi</param-name>
- <param-value>http://cqlservlet.mpi.nl/</param-value>
- </init-param>
- <!-- doesnt provide scan -->
- <init-param>
- <param-name>de.mannheim.ids.sruws.endpoint.saarland</param-name>
- <param-value>http://fedora.clarin-d.uni-saarland.de/sru2</param-value>
- </init-param>
- <!-- empty pid -->
+
+ <!-- empty pid -->
<init-param>
<param-name>de.mannheim.ids.sruws.endpoint.berlin</param-name>
<param-value>http://dspin.dwds.de:8088/DDC-Endpoint/sru</param-value>
- </init-param>
+ </init-param>
+
+
+ <!-- broken sentences -->
+
+ <!-- same case like goethe, pid is sub-resource -->
+ <!-- <init-param>
+ <param-name>de.mannheim.ids.sruws.endpoint.muenchen</param-name>
+ <param-value>https://clarin.phonetik.uni-muenchen.de/BASSRU/</param-value>
+ </init-param> -->
+
+ <!-- weird pid -->
+ <!-- <init-param>
+ <param-name>de.mannheim.ids.sruws.endpoint.mpi</param-name>
+ <param-value>http://cqlservlet.mpi.nl/</param-value>
+ </init-param> -->
+
<!-- pid doesn't match -->
- <init-param>
+ <!-- <init-param>
<param-name>de.mannheim.ids.sruws.endpoint.hamburg</param-name>
<param-value>http://virt-fedora.multilingua.uni-hamburg.de:8080/HZSKsru/</param-value>
- </init-param>
+ </init-param> -->
+
+ <!-- doesnt provide scan -->
+ <!-- <init-param>
+ <param-name>de.mannheim.ids.sruws.endpoint.saarland</param-name>
+ <param-value>http://fedora.clarin-d.uni-saarland.de/sru2/</param-value>
+ </init-param> -->
+
+ <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SRU_WS</servlet-name>
<url-pattern>/*</url-pattern>
- </servlet-mapping>
+ </servlet-mapping>
+
</web-app>
\ No newline at end of file