Changeset 359
- Timestamp:
- 04/16/10 13:58:42 (14 years ago)
- Location:
- VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main
- Files:
-
- 1 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/VirtualColletionRegistryOAIRepository.java
r358 r359 10 10 11 11 class VirtualColletionRegistryOAIRepository implements OAIRepository { 12 private staticclass RecordImpl implements Record {12 private class RecordImpl implements Record { 13 13 private final VirtualCollection vc; 14 14 … … 18 18 19 19 @Override 20 public String get Id() {20 public String getLocalId() { 21 21 return Long.toString(vc.getId()); 22 22 } … … 102 102 103 103 @Override 104 public String getSampleRecord Id() {104 public String getSampleRecordLocalId() { 105 105 return "23"; 106 106 } … … 112 112 113 113 @Override 114 public boolean checkLocalId(String id) {114 public boolean validateLocalId(String id) { 115 115 return convertStringToId(id) != -1; 116 116 } -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIProvider.java
r358 r359 89 89 arg.getNameAsString() + "'"); 90 90 } else { 91 if (arg. validateArgument(value)) {92 ctx.setArgument(arg.getName(), value );93 } else { 91 if (arg.checkArgument(value)) { 92 ctx.setArgument(arg.getName(), value, null); 93 } else { 94 94 ctx.addError(OAIErrorCode.BAD_ARGUMENT, 95 95 "Value of argument '" + … … 109 109 } // for 110 110 111 if (remaining.isEmpty()) { 112 if (logger.isDebugEnabled()) { 113 logger.debug("processing verb '{}'", verb.getName()); 114 Map<Argument.Name, String> args = ctx.getArguments(); 115 if (!args.isEmpty()) { 116 int i = 0; 117 for (Argument.Name name : args.keySet()) { 118 logger.debug("argument[" + i++ + "]: {}='{}'", 119 name.toXmlString(), args.get(name)); 120 } 121 } 122 } 123 verb.process(ctx); 124 } else { 111 if (!remaining.isEmpty()) { 125 112 logger.debug("received request with illegal arguments"); 126 113 for (String key : remaining) { … … 136 123 } 137 124 138 if (ctx.hasErrors()) { 125 if (!ctx.hasErrors()) { 126 if (logger.isDebugEnabled()) { 127 logger.debug("processing verb '{}'", verb.getName()); 128 Map<Argument.Name, String> args = 129 ctx.getUnparsedArguments(); 130 if (!args.isEmpty()) { 131 int i = 0; 132 for (Argument.Name name : args.keySet()) { 133 logger.debug("argument[" + i++ + "]: {}='{}'", 134 name.toXmlString(), args.get(name)); 135 } 136 } 137 } 138 verb.process(ctx); 139 } else { 139 140 OAIOutputStream out = ctx.getOutputStream(); 140 141 for (VerbContext.Error error : ctx.getErrors()) { -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIRepository.java
r358 r359 51 51 public interface Record { 52 52 53 public String get Id();53 public String getLocalId(); 54 54 55 55 public Date getDatestamp(); … … 79 79 public List<MetadataFormat> getSupportedMetadataFormats(); 80 80 81 public String getSampleRecord Id();81 public String getSampleRecordLocalId(); 82 82 83 83 // FIXME: define class for describing sets 84 84 public List<Object> getSetDescs(); 85 85 86 public boolean checkLocalId(String id);86 public boolean validateLocalId(String localId); 87 87 88 88 // XXX: OAIRepositoryException? 89 public Record getRecord(String id) throws OAIException;89 public Record getRecord(String localId) throws OAIException; 90 90 91 91 } // interface OAIRepository -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIRepositoryAdapter.java
r358 r359 88 88 89 89 public String getSampleRecordId() { 90 return makeRecordId(repository.getSampleRecordId());90 return createRecordId(repository.getSampleRecordLocalId()); 91 91 } 92 92 93 public String makeRecordId(String recordId) { 94 return "oai:" + repository.getId() + ":" + recordId; 93 public String createRecordId(String recordId) { 94 StringBuilder sb = new StringBuilder("oai:"); 95 sb.append(repository.getId()); 96 sb.append(":"); 97 sb.append(recordId); 98 return sb.toString(); 95 99 } 96 100 97 public String getLocalId(String identifier) {101 public String parseLocalId(String identifier) { 98 102 if (identifier == null) { 99 103 throw new NullPointerException("identifier == null"); … … 107 111 if (identifier.regionMatches(pos1 + 1, id, 0, id.length())) { 108 112 String localId = identifier.substring(pos2 + 1); 109 if (repository. checkLocalId(localId)) {113 if (repository.validateLocalId(localId)) { 110 114 return localId; 111 115 } … … 130 134 } 131 135 132 public Record getRecord(String identifier) throws OAIException { 133 String localId = getLocalId(identifier); 134 if (localId != null) { 135 OAIRepository.Record record = repository.getRecord(localId); 136 if (record != null) { 137 return record; 138 } 139 } 140 return null; 136 public Record getRecord(String localId) throws OAIException { 137 return repository.getRecord(localId); 141 138 } 142 139 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/VerbContext.java
r350 r359 22 22 public boolean hasArgument(Argument.Name name); 23 23 24 public String get Argument(Argument.Name name);24 public String getUnparsedArgument(Argument.Name name); 25 25 26 public Map<Argument.Name, String> getArguments(); 26 public Object getParsedArgument(Argument.Name name); 27 28 public Map<Argument.Name, String> getUnparsedArguments(); 29 30 public String getContextPath(); 27 31 28 32 public String getRequestURI(); -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/OAIOutputStreamImpl.java
r342 r359 46 46 writer = writerFactory.get().createXMLStreamWriter(stream, "utf-8"); 47 47 writer.writeStartDocument("utf-8", "1.0"); 48 49 StringBuilder data = new StringBuilder(); 50 data.append("type=\"text/xsl\" href=\""); 51 data.append(ctx.getContextPath()); 52 data.append("/oai2.xsl\""); 53 writer.writeProcessingInstruction("xml-stylesheet", 54 data.toString()); 55 48 56 writer.setDefaultNamespace(NS_OAI); 49 57 writer.writeStartElement("OAI-PMH"); … … 63 71 if (ctx.getVerb() != null) { 64 72 writer.writeAttribute("verb", ctx.getVerb()); 65 Map<Argument.Name, String> args = ctx.get Arguments();73 Map<Argument.Name, String> args = ctx.getUnparsedArguments(); 66 74 for (Argument.Name key : args.keySet()) { 67 75 writer.writeAttribute(key.toXmlString(), args.get(key)); … … 123 131 } 124 132 writer.writeStartElement(namespaceURI, localName); 133 boolean schemaDeclWritten = false; 125 134 for (NamespaceDecl decl : decls) { 126 135 writer.writeNamespace(decl.getPrefix(), decl.getNamespaceURI()); 127 136 if (decl.hasSchemaLocation()) { 137 /* From an XML point of view, the XSI-namespace is still in 138 * scope and this is not needed, but all other provides 139 * show this behavior. 140 */ 141 if (!schemaDeclWritten) { 142 writer.writeNamespace("xsi", 143 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); 144 schemaDeclWritten = true; 145 } 128 146 writer.writeAttribute( 129 147 XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI, -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/VerbContextImpl.java
r350 r359 42 42 } 43 43 } // class ErrorImpl 44 private class ArgumentValueImpl { 45 private String value; 46 private Object parsedValue; 47 48 public ArgumentValueImpl(String value, Object parsedValue) { 49 this.value = value; 50 this.parsedValue = parsedValue != null ? parsedValue : value; 51 } 52 53 public String getValue() { 54 return value; 55 } 56 57 public Object getParsedValue() { 58 return parsedValue; 59 } 60 } // class ArgumrntValueImpl 44 61 private final HttpServletRequest request; 45 62 private final HttpServletResponse response; 46 63 private OAIRepositoryAdapter repository; 47 64 private String verb; 48 private Map<Argument.Name, String> arguments;65 private Map<Argument.Name, ArgumentValueImpl> arguments; 49 66 private List<Error> errors; 50 67 … … 94 111 } 95 112 96 public void setArgument(Argument.Name name, String value ) {113 public void setArgument(Argument.Name name, String value, Object parsedValue) { 97 114 if ((name == null) || (value == null)) { 98 115 throw new NullPointerException("name == null || value == null"); 99 116 } 100 117 if (arguments == null) { 101 arguments = new HashMap<Argument.Name, String>();102 } 103 arguments.put(name, value);118 arguments = new HashMap<Argument.Name, ArgumentValueImpl>(); 119 } 120 arguments.put(name, new ArgumentValueImpl(value, parsedValue)); 104 121 } 105 122 … … 124 141 125 142 @Override 126 public String getArgument(Argument.Name name) { 127 String value = null; 143 public String getUnparsedArgument(Argument.Name name) { 128 144 if (arguments != null) { 129 value = arguments.get(name); 130 } 131 return value; 132 } 133 134 @Override 135 public Map<Argument.Name, String> getArguments() { 145 ArgumentValueImpl value = arguments.get(name); 146 if (value != null) { 147 return value.getValue(); 148 } 149 } 150 return null; 151 } 152 153 @Override 154 public Object getParsedArgument(Argument.Name name) { 155 if (arguments != null) { 156 ArgumentValueImpl value = arguments.get(name); 157 if (value != null) { 158 return value.getParsedValue(); 159 } 160 } 161 return null; 162 } 163 164 @Override 165 public Map<Argument.Name, String> getUnparsedArguments() { 136 166 if (arguments == null) { 137 167 return Collections.emptyMap(); 138 168 } 139 return Collections.unmodifiableMap(arguments); 169 Map<Argument.Name, String> result = 170 new HashMap<Argument.Name, String>(arguments.size()); 171 for (Argument.Name key : arguments.keySet()) { 172 ArgumentValueImpl value = arguments.get(key); 173 result.put(key, value.getValue()); 174 } 175 return result; 140 176 } 141 177 … … 146 182 } 147 183 errors.add(new ErrorImpl(code, message)); 184 } 185 186 @Override 187 public String getContextPath() { 188 return request.getContextPath(); 148 189 } 149 190 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Argument.java
r358 r359 35 35 "[\\w\\.!~\\*'\\(\\);/\\?:&=\\+\\$,%]+", 36 36 Pattern.CASE_INSENSITIVE); 37 private static final Pattern metadataPrefixRegEx = 38 Pattern.compile("[\\w\\.!~\\*'\\(\\)]+", Pattern.CASE_INSENSITIVE); 39 private static final Pattern dateRegEx = 40 Pattern.compile("\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?"); 41 37 42 private final Name name; 38 43 private final boolean required; … … 55 60 } 56 61 57 public boolean validateArgument(String value) {62 public boolean checkArgument(String value) { 58 63 switch (name) { 64 case FROM: 65 /* FALL_THROUGH */ 66 case UNTIL: 67 return dateRegEx.matcher(value).matches(); 59 68 case IDENTIFIER: 60 69 return identifierRegEx.matcher(value).matches(); 70 case METADATAPREFIX: 71 return metadataPrefixRegEx.matcher(value).matches(); 72 case SET: 73 return true; 74 case RESUMPTIONTOKEN: 75 return true; 61 76 default: 62 // XXX: implement validation 63 return true; 64 } 77 throw new InternalError("invalid argument name"); 78 } // switch 65 79 } 66 80 -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/GetRecordVerb.java
r342 r359 14 14 private static final List<Argument> s_arguments = 15 15 Arrays.asList(new Argument(Name.IDENTIFIER, true), 16 new Argument(Name.FROM, false), 16 17 new Argument(Name.METADATAPREFIX, true)); 17 18 … … 30 31 logger.debug("process GET-RECORD"); 31 32 33 String from = ctx.getUnparsedArgument(Name.FROM); 34 System.err.println("FROM: \"" + from + "\""); 35 32 36 // XXX: testing only ... 33 37 OAIOutputStream out = ctx.getOutputStream(); … … 36 40 37 41 out.writeStartElement("header"); 38 out.writeStartElement("identifier");39 out.writeCharacters(ctx.getArgument(Name.IDENTIFIER));40 out.writeEndElement();42 // out.writeStartElement("identifier"); 43 // out.writeCharacters(ctx.getArgument(Name.IDENTIFIER)); 44 // out.writeEndElement(); 41 45 out.writeStartElement("datestamp"); 42 46 out.writeDateAsCharacters(new Date()); -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/IdentifyVerb.java
r345 r359 13 13 public class IdentifyVerb extends Verb { 14 14 private static List<NamespaceDecl> descsNsDecls = Arrays.asList( 15 new NamespaceDecl(MetadataConstants.NS_OAI_DC, null,15 new NamespaceDecl(MetadataConstants.NS_OAI_DC, "oai_dc", 16 16 MetadataConstants.NS_OAI_DC_SCHEMA_LOCATION), 17 new NamespaceDecl(MetadataConstants.NS_DC, "dc")17 new NamespaceDecl(MetadataConstants.NS_DC, null) 18 18 ); 19 19 private static List<NamespaceDecl> identifierNsDecls = Arrays.asList( … … 59 59 60 60 out.writeStartElement("earliestDatestamp"); 61 // FIXME: consider granularity62 61 out.writeCharacters(repository.getEarliestTimestamp()); 63 out.writeEndElement(); // protocolVersionelement62 out.writeEndElement(); // earliestDatestamp element 64 63 65 64 out.writeStartElement("deletedRecord"); -
VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/ListMetadataFormatsVerb.java
r358 r359 35 35 List<MetadataFormat> formats = null; 36 36 if (ctx.hasArgument(Name.IDENTIFIER)) { 37 String identifier = ctx.getArgument(Name.IDENTIFIER);38 Record record = repository.getRecord( identifier);37 String localId = (String) ctx.getParsedArgument(Name.IDENTIFIER); 38 Record record = repository.getRecord(localId); 39 39 if (record != null) { 40 40 formats = record.getSupportedMetadataFormats();
Note: See TracChangeset
for help on using the changeset viewer.