Changeset 340
- Timestamp:
- 04/12/10 12:28:01 (14 years ago)
- Location:
- VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIProvider.java
r321 r340 1 1 package eu.clarin.cmdi.virtualcollectionregistry.oai; 2 2 3 import java.io.PrintWriter; 3 4 import java.util.ArrayList; 4 5 import java.util.List; 6 import java.util.Set; 5 7 6 8 import org.slf4j.Logger; 7 9 import org.slf4j.LoggerFactory; 8 10 11 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Argument; 9 12 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.GetRecordVerb; 10 13 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.IdentifyVerb; … … 25 28 } 26 29 27 public void process(VerbContext ctx) throws OAIException { 30 public void process(VerbContextImpl ctx) throws OAIException { 31 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"); 37 } 38 28 39 Verb verb = null; 40 for (Verb v : verbs) { 41 if (verbName.equals(v.getName())) { 42 verb = v; 43 break; 44 } 45 } // for 29 46 30 String verbArg = ctx.getArgument("verb"); 31 if (verbArg != null && !verbArg.isEmpty()) { 32 for (Verb v : verbs) { 33 if (verbArg.equals(v.getName())) { 34 verb = v; 35 break; 47 if (verb != null) { 48 Set<String> remaining = ctx.getParameterNames(); 49 for (Argument arg : verb.getArguments()) { 50 String value = ctx.getParameter(arg.getName()); 51 if ((value == null) && arg.isRequired()) { 52 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 53 "OAI verb '" + verbName + 54 "' requires argument '" + 55 arg.getName() + "'"); 56 } else { 57 remaining.remove(arg.getName()); 58 if (ctx.isParameterMultivalued(arg.getName())) { 59 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 60 "OAI verb '" + verbName + 61 "' illegally has multiple values for " + 62 "argument '" + arg.getName() + "'"); 63 } else { 64 logger.debug("key: {}, value: {}", 65 arg.getName(), value); 66 try { 67 arg.validateArgument(value); 68 ctx.setArgument(arg.getName(), value); 69 } catch (OAIException e) { 70 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 71 "Value of argument '" + 72 arg.getName() + "' of OAI verb '" + 73 verbName + "' is invalid: " + 74 e.getMessage()); 75 } 76 } 36 77 } 37 78 } // for 38 if (verb == null) { 39 ctx.addError(OAIErrorCode.BAD_VERB, "illegal OAI verb '" + 40 verbArg + "'"); 79 80 if (!remaining.isEmpty()) { 81 for (String key : remaining) { 82 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 83 "superfluous argument '" + key + "'"); 84 } 85 } else { 86 logger.debug("processing verb '{}'", verb.getName()); 87 verb.process(ctx); 41 88 } 42 89 } else { 43 ctx.addError(OAIErrorCode.BAD_VERB, "missing OAI verb"); 90 ctx.addError(OAIErrorCode.BAD_VERB, "illegal OAI verb '" + 91 verbName + "'"); 44 92 } 45 93 46 if ((verb != null) && !ctx.hasErrors()) {47 logger.debug("processing verb '{}'", verb.getName());48 verb.process(ctx);49 }50 94 if (ctx.hasErrors()) { 95 PrintWriter out = new PrintWriter(ctx.getWriter()); 96 out.println("OAI protocol error:"); 51 97 // XXX: just testing ... 98 logger.error("OAI-CONTEXT: {}", ctx.getRequestURI()); 52 99 for (VerbContext.Error error : ctx.getErrors()) { 53 100 logger.error("OAI-ERROR ({}): {}", 54 101 error.getCode(), error.getMessage()); 102 out.println(error.getCode() + ": " + error.getMessage()); 55 103 } 56 104 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIProviderServlet.java
r321 r340 17 17 import org.slf4j.Logger; 18 18 import org.slf4j.LoggerFactory; 19 20 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.VerbContext;21 19 22 20 public class OAIProviderServlet extends HttpServlet { … … 53 51 try { 54 52 resp.setCharacterEncoding("utf-8"); 55 VerbContext ctx = new VerbContextImpl(provider, req, resp);53 VerbContextImpl ctx = new VerbContextImpl(provider, req, resp); 56 54 provider.process(ctx); 57 55 } catch (OAIException e) { … … 68 66 df.setTimeZone(TimeZone.getTimeZone("UTC")); 69 67 70 XMLOutputFactory factory = XMLOutputFactory.new Factory();68 XMLOutputFactory factory = XMLOutputFactory.newInstance(); 71 69 XMLStreamWriter out = factory.createXMLStreamWriter(writer); 72 70 out.writeStartDocument("utf-8", "1.0"); -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/VerbContextImpl.java
r321 r340 1 1 package eu.clarin.cmdi.virtualcollectionregistry.oai; 2 2 3 import java.io.IOException; 4 import java.io.Writer; 3 5 import java.util.ArrayList; 4 6 import java.util.Collections; 7 import java.util.HashMap; 8 import java.util.HashSet; 9 import java.util.Iterator; 5 10 import java.util.List; 11 import java.util.Map; 12 import java.util.Set; 6 13 7 import javax.servlet. ServletRequest;8 import javax.servlet. ServletResponse;14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 9 16 10 17 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.VerbContext; … … 32 39 } // class ErrorImpl 33 40 private final OAIProvider provider; 34 private final ServletRequest request; 35 private final ServletResponse response; 41 private final HttpServletRequest request; 42 private final HttpServletResponse response; 43 private Map<String, String> arguments = null; 36 44 private List<Error> errors = null; 37 45 38 VerbContextImpl(OAIProvider provider, ServletRequest request, ServletResponse response) { 46 VerbContextImpl(OAIProvider provider, 47 HttpServletRequest request, 48 HttpServletResponse response) { 39 49 super(); 40 50 this.provider = provider; 41 51 this.request = request; 42 52 this.response = response; 53 } 54 55 public String getParameter(String name) { 56 String value = request.getParameter(name); 57 if (value != null) { 58 value = value.trim(); 59 if (!value.isEmpty()) { 60 return value; 61 } 62 } 63 return null; 64 } 65 66 public boolean isParameterMultivalued(String name) { 67 String[] params = request.getParameterValues(name); 68 if (params != null) { 69 return params.length > 1; 70 } 71 return false; 72 } 73 74 public Set<String> getParameterNames() { 75 Set<String> names = new HashSet<String>(); 76 for (Iterator<?> i = request.getParameterMap().keySet().iterator(); 77 i.hasNext(); ) { 78 String s = (String) i.next(); 79 if (s.equalsIgnoreCase("verb")) { 80 continue; 81 } 82 names.add(s); 83 } 84 return names; 85 } 86 87 public void setArgument(String name, String value) { 88 if (arguments == null) { 89 arguments = new HashMap<String, String>(); 90 } 91 arguments.put(name, value); 43 92 } 44 93 … … 50 99 @Override 51 100 public String getArgument(String name) { 52 if (name != null) { 53 String value = request.getParameter(name); 54 if (value != null) { 55 return value; 56 } 101 String value = null; 102 if (arguments != null) { 103 value = arguments.get(name); 57 104 } 58 return null; 105 if (value == null) { 106 throw new NullPointerException("bad argument: value == null"); 107 } 108 return value; 59 109 } 60 110 … … 65 115 } 66 116 errors.add(new ErrorImpl(code, message)); 117 } 118 119 @Override 120 public String getRequestURI() { 121 // FIXME: supposed to return request uri 122 return null; 67 123 } 68 124 … … 80 136 } 81 137 138 @Override 139 public Writer getWriter() { 140 // FIXME: this is for testing only, need to be re-factored 141 try { 142 response.setCharacterEncoding("utf-8"); 143 response.setContentType("text/plain"); 144 response.setStatus(HttpServletResponse.SC_BAD_REQUEST); 145 return response.getWriter(); 146 } catch (IOException e) { 147 } 148 return null; 149 } 150 82 151 } // class VerbContextImpl -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Argument.java
r321 r340 13 13 UNTIL; // until 14 14 } // enum Name 15 private final Name name; 16 private final boolean required; 15 17 16 public static enum Use { 17 REQUIRED, OPTIONAL; 18 } // enum Use 19 20 private final Name name; 21 private final Use use; 22 23 public Argument(Name name, Use use) { 24 this.name = name; 25 this.use = use; 18 public Argument(Name name, boolean required) { 19 this.name = name; 20 this.required = required; 26 21 } 27 22 … … 46 41 47 42 public boolean isRequired() { 48 return (use == Use.REQUIRED);43 return required; 49 44 } 50 45 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/GetRecordVerb.java
r321 r340 5 5 6 6 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Argument.Name; 7 import eu.clarin.cmdi.virtualcollectionregistry.oai.verb.Argument.Use;8 7 9 8 public class GetRecordVerb extends Verb { 10 9 private static final List<Argument> s_arguments = 11 Arrays.asList(new Argument(Name.IDENTIFIER, Use.REQUIRED),12 new Argument(Name.METADATAPREFIX, Use.REQUIRED));10 Arrays.asList(new Argument(Name.IDENTIFIER, true), 11 new Argument(Name.METADATAPREFIX, true)); 13 12 14 13 @Override … … 18 17 19 18 @Override 20 p rotectedList<Argument> getArguments() {19 public List<Argument> getArguments() { 21 20 return s_arguments; 22 21 } 23 22 24 23 @Override 25 p rotected void doProcess(VerbContext ctx) {24 public void process(VerbContext ctx) { 26 25 logger.debug("process GET-RECORD"); 27 26 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/IdentifyVerb.java
r321 r340 12 12 13 13 @Override 14 p rotectedList<Argument> getArguments() {14 public List<Argument> getArguments() { 15 15 return Collections.emptyList(); 16 16 } 17 17 18 18 @Override 19 p rotected void doProcess(VerbContext ctx) {19 public void process(VerbContext ctx) { 20 20 logger.debug("process IDENTIFY"); 21 21 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Verb.java
r321 r340 6 6 import org.slf4j.LoggerFactory; 7 7 8 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIErrorCode;9 import eu.clarin.cmdi.virtualcollectionregistry.oai.OAIException;10 11 8 public abstract class Verb { 12 9 protected static final Logger logger = LoggerFactory.getLogger(Verb.class); … … 14 11 public abstract String getName(); 15 12 16 p rotectedabstract List<Argument> getArguments();13 public abstract List<Argument> getArguments(); 17 14 18 protected abstract void doProcess(VerbContext ctx); 19 20 public void process(VerbContext ctx) { 21 /* FIXME: need to check for multiple arguments -> illegal 22 * check for superfluous arguments -> illegal 23 */ 24 for (Argument arg : getArguments()) { 25 String value = ctx.getArgument(arg.getName()); 26 if ((value == null) && arg.isRequired()) { 27 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 28 "OAI verb '" + getName() + 29 "' requires argument '" + arg.getName() + "'"); 30 } else { 31 try { 32 arg.validateArgument(value); 33 } catch (OAIException e) { 34 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 35 "Value of argument '" + 36 arg.getName() + "' of OAI verb '" + 37 getName() + "' is invalid: " + e.getMessage()); 38 } 39 } 40 } // for 41 if (!ctx.hasErrors()) { 42 doProcess(ctx); 43 } 44 } 45 15 public abstract void process(VerbContext ctx); 16 46 17 } // abstract class VerbBase -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/VerbContext.java
r321 r340 1 1 package eu.clarin.cmdi.virtualcollectionregistry.oai.verb; 2 2 3 import java.io.Writer; 3 4 import java.util.List; 4 5 … … 17 18 public String getArgument(String name); 18 19 20 public String getRequestURI(); 21 19 22 public void addError(OAIErrorCode code, String message); 20 23 … … 23 26 public List<Error> getErrors(); 24 27 28 public Writer getWriter(); 29 25 30 } // interface VerbContext
Note: See TracChangeset
for help on using the changeset viewer.