Changeset 341
- Timestamp:
- 04/13/10 17:09:41 (14 years ago)
- Location:
- VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main
- Files:
-
- 3 added
- 7 edited
- 3 moved
Legend:
- Unmodified
- Added
- Removed
-
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIErrorCode.java
r321 r341 9 9 NO_RECORDS_MATCH, 10 10 NO_METADATA_FORMATS, 11 NO_SET_HIERARCHY 11 NO_SET_HIERARCHY; 12 13 public static String toXmlString(OAIErrorCode code) { 14 switch (code) { 15 case BAD_ARGUMENT: 16 return "badArgument"; 17 case BAD_RESUMPTION_TOKEN: 18 return "badResumptionToken"; 19 case BAD_VERB: 20 return "badVerb"; 21 case CANNOT_DISSERMINATE_FORMAT: 22 return "cannotDisserminateFormat"; 23 case ID_DOES_NOT_EXIST: 24 return "idDoesNotExist"; 25 case NO_RECORDS_MATCH: 26 return "noRecordsMatch"; 27 case NO_METADATA_FORMATS: 28 return "noMetadataFormats"; 29 case NO_SET_HIERARCHY: 30 return "noSetHierarchy"; 31 default: 32 // cannot happen 33 throw new InternalError("invalid OAIErrorCode"); 34 } 35 } 36 12 37 } // enum OAIError -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIProvider.java
r340 r341 1 1 package eu.clarin.cmdi.virtualcollectionregistry.oai; 2 2 3 import java.io.PrintWriter;4 3 import java.util.ArrayList; 5 4 import java.util.List; 6 5 import java.util.Set; 7 6 7 import javax.servlet.http.HttpServletResponse; 8 8 9 import org.slf4j.Logger; 9 10 import org.slf4j.LoggerFactory; 10 11 12 import eu.clarin.cmdi.virtualcollectionregistry.oai.impl.VerbContextImpl; 11 13 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Argument; 12 14 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.GetRecordVerb; 13 15 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.IdentifyVerb; 14 16 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Verb; 15 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.VerbContext;16 17 17 18 public class OAIProvider { … … 20 21 private static final OAIProvider s_instance = new OAIProvider(); 21 22 private final List<Verb> verbs; 22 23 23 24 private OAIProvider() { 24 25 super(); … … 29 30 30 31 public void process(VerbContextImpl ctx) throws OAIException { 32 Verb verb = null; 33 31 34 String verbName = ctx.getParameter("verb"); 32 if (verbName == null) { 33 throw new OAIException("missing verb"); 34 } 35 if (ctx.isParameterMultivalued("verb")) { 36 throw new OAIException("multiple verb arguments"); 35 if (verbName != null) { 36 if (!ctx.isRepeatedParameter("verb")) { 37 for (Verb v : verbs) { 38 if (verbName.equals(v.getName())) { 39 verb = v; 40 break; 41 } 42 } // for 43 } else { 44 ctx.addError(OAIErrorCode.BAD_VERB, "OAI verb is repeated"); 45 } 46 } else { 47 ctx.addError(OAIErrorCode.BAD_VERB, "OAI verb is missing"); 37 48 } 38 49 39 Verb verb = null; 40 for (Verb v : verbs) { 41 if (verbName.equals(v.getName())) { 42 verb = v; 43 break; 44 } 45 } // for 50 if (verb != null) { 51 // set verb 52 ctx.setVerb(verbName); 46 53 47 if (verb != null) {54 // process arguments 48 55 Set<String> remaining = ctx.getParameterNames(); 49 56 for (Argument arg : verb.getArguments()) { … … 51 58 if ((value == null) && arg.isRequired()) { 52 59 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 53 54 "' requiresargument '" +55 60 "OAI verb '" + verbName + 61 "' is missing required argument '" + 62 arg.getName() + "'"); 56 63 } else { 57 64 remaining.remove(arg.getName()); 58 if (ctx.is ParameterMultivalued(arg.getName())) {65 if (ctx.isRepeatedParameter(arg.getName())) { 59 66 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 60 "OAI verb '" + verbName +61 "' illegally has multiple values for" +62 "argument '" +arg.getName() + "'");67 "OAI verb '" + verbName + 68 "' has repeated values for argument '" + 69 arg.getName() + "'"); 63 70 } else { 64 logger.debug("key: {}, value: {}", 65 arg.getName(), value); 66 try { 67 arg.validateArgument(value); 71 if (arg.validateArgument(value)) { 68 72 ctx.setArgument(arg.getName(), value); 69 } catch (OAIException e){73 } else { 70 74 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 71 "Value of argument '" + 72 arg.getName() + "' of OAI verb '" + 73 verbName + "' is invalid: " + 74 e.getMessage()); 75 "Value of argument '" + 76 arg.getName() + "' of OAI verb '" + 77 verbName + "' is invalid"); 75 78 } 76 79 } 77 80 } 78 } // for81 } // for 79 82 80 if (!remaining.isEmpty()) { 83 if (remaining.isEmpty()) { 84 logger.debug("processing verb '{}'", verb.getName()); 85 verb.process(ctx); 86 } else { 81 87 for (String key : remaining) { 82 88 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 83 "superfluous argument '" + key + "'"); 89 "OAI verb '" + verbName + "' was submitted " + 90 "with illegal argument '" + key + "' "+ 91 "(value='" + ctx.getParameter(key) + "')"); 84 92 } 85 } else { 86 logger.debug("processing verb '{}'", verb.getName()); 87 verb.process(ctx); 93 } 94 95 if (ctx.hasErrors()) { 96 OAIOutputStream out = 97 ctx.getOutputStream(HttpServletResponse.SC_BAD_REQUEST); 98 for (VerbContext.Error error : ctx.getErrors()) { 99 out.writeStartElement("error"); 100 out.writeAttribute("code", 101 OAIErrorCode.toXmlString(error.getCode())); 102 out.writeCharacters(error.getMessage()); 103 out.writeEndElement(); // error element 104 } 105 out.close(); 88 106 } 89 107 } else { 90 108 ctx.addError(OAIErrorCode.BAD_VERB, "illegal OAI verb '" + 91 109 verbName + "'"); 92 }93 94 if (ctx.hasErrors()) {95 PrintWriter out = new PrintWriter(ctx.getWriter());96 out.println("OAI protocol error:");97 // XXX: just testing ...98 logger.error("OAI-CONTEXT: {}", ctx.getRequestURI());99 for (VerbContext.Error error : ctx.getErrors()) {100 logger.error("OAI-ERROR ({}): {}",101 error.getCode(), error.getMessage());102 out.println(error.getCode() + ": " + error.getMessage());103 }104 110 } 105 111 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/VerbContext.java
r340 r341 1 package eu.clarin.cmdi.virtualcollectionregistry.oai .verb;1 package eu.clarin.cmdi.virtualcollectionregistry.oai; 2 2 3 import java.io.Writer;4 3 import java.util.List; 4 import java.util.Map; 5 5 6 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIErrorCode;7 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIProvider;8 6 9 7 public interface VerbContext { … … 16 14 public OAIProvider getProvider(); 17 15 16 public String getVerb(); 17 18 18 public String getArgument(String name); 19 20 public Map<String, String> getArguments(); 19 21 20 22 public String getRequestURI(); … … 26 28 public List<Error> getErrors(); 27 29 28 public Writer getWriter(); 30 public abstract OAIOutputStream getOutputStream() 31 throws OAIException; 32 33 public abstract OAIOutputStream getOutputStream(int status) 34 throws OAIException; 29 35 30 36 } // interface VerbContext -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/OAIProviderServlet.java
r340 r341 1 package eu.clarin.cmdi.virtualcollectionregistry.oai ;1 package eu.clarin.cmdi.virtualcollectionregistry.oai.impl; 2 2 3 3 import java.io.IOException; 4 import java.io.Writer;5 import java.text.SimpleDateFormat;6 import java.util.Date;7 import java.util.TimeZone;8 4 9 5 import javax.servlet.ServletException; … … 11 7 import javax.servlet.http.HttpServletRequest; 12 8 import javax.servlet.http.HttpServletResponse; 13 import javax.xml.XMLConstants;14 import javax.xml.stream.XMLOutputFactory;15 import javax.xml.stream.XMLStreamWriter;16 9 17 10 import org.slf4j.Logger; 18 11 import org.slf4j.LoggerFactory; 12 13 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIProvider; 19 14 20 15 public class OAIProviderServlet extends HttpServlet { … … 24 19 private OAIProvider provider; 25 20 26 private static final String NS_OAI =27 "http://www.openarchives.org/OAI/2.0/";28 private static final String NS_OAI_SCHEMA_LOCATION =29 "http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd";30 31 21 @Override 32 22 protected void doGet(HttpServletRequest req, HttpServletResponse resp) … … 47 37 } 48 38 49 private void handleRequest(HttpServletRequest req, HttpServletResponse resp) 50 throws ServletException, IOException { 39 private void handleRequest(HttpServletRequest request, 40 HttpServletResponse response) 41 throws ServletException, IOException { 51 42 try { 52 resp.setCharacterEncoding("utf-8");53 VerbContextImpl ctx = new VerbContextImpl(provider, req, resp);43 VerbContextImpl ctx = 44 new VerbContextImpl(provider, request, response); 54 45 provider.process(ctx); 55 } catch (OAIException e) {56 logger.error("OAI-ERROR: {}", e.getMessage());57 resp.setContentType("application/xml");58 foo(resp.getWriter());59 }60 }61 62 private void foo(Writer writer) throws ServletException {63 try {64 SimpleDateFormat df =65 new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");66 df.setTimeZone(TimeZone.getTimeZone("UTC"));67 68 XMLOutputFactory factory = XMLOutputFactory.newInstance();69 XMLStreamWriter out = factory.createXMLStreamWriter(writer);70 out.writeStartDocument("utf-8", "1.0");71 out.setDefaultNamespace(NS_OAI);72 out.writeStartElement("OAI-PMH");73 out.writeNamespace("xsi",74 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI);75 out.writeAttribute(XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI,76 "schemaLocation",77 NS_OAI + " " + NS_OAI_SCHEMA_LOCATION);78 out.writeStartElement("responseDate");79 out.writeCharacters(df.format(new Date()));80 out.writeEndElement();81 out.writeEndElement();82 out.writeEndDocument();83 46 } catch (Exception e) { 84 throw new ServletException("foo failed", e); 47 logger.error("OAI provider error", e); 48 response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, 49 "Internal OAI provider error"); 85 50 } 86 51 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/VerbContextImpl.java
r340 r341 1 package eu.clarin.cmdi.virtualcollectionregistry.oai ;1 package eu.clarin.cmdi.virtualcollectionregistry.oai.impl; 2 2 3 import java.io.IOException;4 import java.io.Writer;5 3 import java.util.ArrayList; 6 4 import java.util.Collections; … … 15 13 import javax.servlet.http.HttpServletResponse; 16 14 17 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.VerbContext; 15 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIErrorCode; 16 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException; 17 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIOutputStream; 18 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIProvider; 19 import eu.clarin.cmdi.virtualcollectionregistry.oai.VerbContext; 20 18 21 19 22 public class VerbContextImpl implements VerbContext { … … 41 44 private final HttpServletRequest request; 42 45 private final HttpServletResponse response; 46 private String verb = null; 43 47 private Map<String, String> arguments = null; 44 48 private List<Error> errors = null; 45 49 46 50 VerbContextImpl(OAIProvider provider, 47 HttpServletRequest request, 48 HttpServletResponse response) { 49 super(); 51 HttpServletRequest request, 52 HttpServletResponse response) { 50 53 this.provider = provider; 51 this.request 54 this.request = request; 52 55 this.response = response; 53 56 } … … 64 67 } 65 68 66 public boolean is ParameterMultivalued(String name) {69 public boolean isRepeatedParameter(String name) { 67 70 String[] params = request.getParameterValues(name); 68 71 if (params != null) { … … 85 88 } 86 89 90 public void setVerb(String verb) { 91 this.verb = verb; 92 } 93 87 94 public void setArgument(String name, String value) { 95 if ((name == null) || (value == null)) { 96 throw new NullPointerException("name == null || value == null"); 97 } 88 98 if (arguments == null) { 89 99 arguments = new HashMap<String, String>(); 90 100 } 91 101 arguments.put(name, value); 102 } 103 104 @Override 105 public String getVerb() { 106 return verb; 92 107 } 93 108 … … 103 118 value = arguments.get(name); 104 119 } 105 if (value == null) { 106 throw new NullPointerException("bad argument: value == null"); 120 return value; 121 } 122 123 @Override 124 public Map<String, String> getArguments() { 125 if (arguments == null) { 126 return Collections.emptyMap(); 107 127 } 108 return value;128 return Collections.unmodifiableMap(arguments); 109 129 } 110 130 … … 119 139 @Override 120 140 public String getRequestURI() { 121 // FIXME: supposed to return request uri 122 return null; 141 return request.getRequestURL().toString(); 123 142 } 124 143 … … 137 156 138 157 @Override 139 public Writer getWriter() { 140 // FIXME: this is for testing only, need to be re-factored 158 public OAIOutputStream getOutputStream() throws OAIException { 159 return this.getOutputStream(HttpServletResponse.SC_OK); 160 } 161 162 @Override 163 public OAIOutputStream getOutputStream(int status) throws OAIException { 141 164 try { 165 response.setStatus(status); 142 166 response.setCharacterEncoding("utf-8"); 143 response.setContentType("text/ plain");144 re sponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);145 return response.getWriter();146 } catch (IOException e) {167 response.setContentType("text/xml"); 168 return new OAIOutputStreamImpl(this, response.getOutputStream()); 169 } catch (Exception e) { 170 throw new OAIException("error creating output stream", e); 147 171 } 148 return null;149 172 } 150 173 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Argument.java
r340 r341 1 1 package eu.clarin.cmdi.virtualcollectionregistry.oai.verb; 2 3 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException;4 5 2 6 3 public class Argument { … … 44 41 } 45 42 46 public void validateArgument(String value) throws OAIException{43 public boolean validateArgument(String value) { 47 44 // XXX: implement validation 45 return true; 48 46 } 49 47 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/GetRecordVerb.java
r340 r341 2 2 3 3 import java.util.Arrays; 4 import java.util.Date; 4 5 import java.util.List; 5 6 7 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException; 8 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIOutputStream; 9 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIOutputStream.NamespaceDecl; 10 import eu.clarin.cmdi.virtualcollectionregistry.oai.VerbContext; 6 11 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Argument.Name; 7 12 8 13 public class GetRecordVerb extends Verb { 14 private static final String NS_OAI_DC = 15 "http://www.openarchives.org/OAI/2.0/oai_dc/"; 16 private static final String NS_OAI_DC_SCHEMA_LOCATION = 17 "http://www.openarchives.org/OAI/2.0/oai_dc.xsd"; 18 private static final String NS_DC = 19 "http://purl.org/dc/elements/1.1/"; 9 20 private static final List<Argument> s_arguments = 10 21 Arrays.asList(new Argument(Name.IDENTIFIER, true), … … 22 33 23 34 @Override 24 public void process(VerbContext ctx) {35 public void process(VerbContext ctx) throws OAIException { 25 36 logger.debug("process GET-RECORD"); 37 38 // XXX: testing only ... 39 OAIOutputStream out = ctx.getOutputStream(); 40 out.writeStartElement("GetRecord"); 41 out.writeStartElement("record"); 42 43 out.writeStartElement("header"); 44 out.writeStartElement("identifier"); 45 out.writeCharacters(ctx.getArgument("identifier")); 46 out.writeEndElement(); 47 out.writeStartElement("datestamp"); 48 out.writeDateAsCharacters(new Date()); 49 out.writeEndElement(); // datestamp element 50 out.writeEndElement(); // header element 51 52 out.writeStartElement("metadata"); 53 54 out.writeStartElement(NS_OAI_DC, "dc", Arrays.asList( 55 new NamespaceDecl(NS_OAI_DC, "oai_dc", NS_OAI_DC_SCHEMA_LOCATION), 56 new NamespaceDecl(NS_DC, "dc") 57 )); 58 59 out.writeStartElement(NS_DC, "title"); 60 out.writeCharacters("Test title"); 61 out.writeEndElement(); // dc:title element 62 out.writeStartElement(NS_DC, "creator"); 63 out.writeCharacters("Test Creator"); 64 out.writeEndElement(); // dc:creator element 65 66 out.writeEndElement(); // oai:dc element 67 68 out.writeEndElement(); // metadata element 69 out.writeEndElement(); // record element 70 out.writeEndElement(); // GetRecord element 71 out.close(); 26 72 } 27 73 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/IdentifyVerb.java
r340 r341 3 3 import java.util.Collections; 4 4 import java.util.List; 5 6 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException; 7 import eu.clarin.cmdi.virtualcollectionregistry.oai.VerbContext; 5 8 6 9 public class IdentifyVerb extends Verb { … … 17 20 18 21 @Override 19 public void process(VerbContext ctx) {22 public void process(VerbContext ctx) throws OAIException { 20 23 logger.debug("process IDENTIFY"); 21 24 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Verb.java
r340 r341 5 5 import org.slf4j.Logger; 6 6 import org.slf4j.LoggerFactory; 7 8 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException; 9 import eu.clarin.cmdi.virtualcollectionregistry.oai.VerbContext; 7 10 8 11 public abstract class Verb { … … 13 16 public abstract List<Argument> getArguments(); 14 17 15 public abstract void process(VerbContext ctx) ;18 public abstract void process(VerbContext ctx) throws OAIException; 16 19 17 } // abstract class Verb Base20 } // abstract class Verb -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/webapp/WEB-INF/web.xml
r320 r341 35 35 <display-name>Virtual Collection Registry OAI-PMH Provider</display-name> 36 36 <servlet-name>OAI-PMH-Provider</servlet-name> 37 <servlet-class>eu.clarin.cmdi.virtualcollectionregistry.oai. OAIProviderServlet</servlet-class>37 <servlet-class>eu.clarin.cmdi.virtualcollectionregistry.oai.impl.OAIProviderServlet</servlet-class> 38 38 <load-on-startup>2</load-on-startup> 39 39 </servlet>
Note: See TracChangeset
for help on using the changeset viewer.