Changeset 359


Ignore:
Timestamp:
04/16/10 13:58:42 (14 years ago)
Author:
oschonef
Message:
  • further work
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  
    1010
    1111class VirtualColletionRegistryOAIRepository implements OAIRepository {
    12         private static class RecordImpl implements Record {
     12        private class RecordImpl implements Record {
    1313                private final VirtualCollection vc;
    1414
     
    1818               
    1919                @Override
    20                 public String getId() {
     20                public String getLocalId() {
    2121                        return Long.toString(vc.getId());
    2222                }
     
    102102
    103103        @Override
    104         public String getSampleRecordId() {
     104        public String getSampleRecordLocalId() {
    105105                return "23";
    106106        }
     
    112112
    113113        @Override
    114         public boolean checkLocalId(String id) {
     114        public boolean validateLocalId(String id) {
    115115                return convertStringToId(id) != -1;
    116116        }
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIProvider.java

    r358 r359  
    8989                                                                         arg.getNameAsString() + "'");
    9090                                        } 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 {
    9494                                                        ctx.addError(OAIErrorCode.BAD_ARGUMENT,
    9595                                                                                 "Value of argument '" +
     
    109109                        }  // for
    110110
    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()) {
    125112                                logger.debug("received request with illegal arguments");
    126113                                for (String key : remaining) {
     
    136123                }
    137124
    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 {
    139140                        OAIOutputStream out = ctx.getOutputStream();
    140141                        for (VerbContext.Error error : ctx.getErrors()) {
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIRepository.java

    r358 r359  
    5151        public interface Record {
    5252
    53                 public String getId();
     53                public String getLocalId();
    5454
    5555                public Date getDatestamp();
     
    7979        public List<MetadataFormat> getSupportedMetadataFormats();
    8080
    81         public String getSampleRecordId();
     81        public String getSampleRecordLocalId();
    8282
    8383        // FIXME: define class for describing sets
    8484        public List<Object> getSetDescs();
    8585
    86         public boolean checkLocalId(String id);
     86        public boolean validateLocalId(String localId);
    8787
    8888        // XXX: OAIRepositoryException?
    89         public Record getRecord(String id) throws OAIException;
     89        public Record getRecord(String localId) throws OAIException;
    9090       
    9191} // interface OAIRepository
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/OAIRepositoryAdapter.java

    r358 r359  
    8888
    8989        public String getSampleRecordId() {
    90                 return makeRecordId(repository.getSampleRecordId());
     90                return createRecordId(repository.getSampleRecordLocalId());
    9191        }
    9292
    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();
    9599        }
    96100
    97         public String getLocalId(String identifier) {
     101        public String parseLocalId(String identifier) {
    98102                if (identifier == null) {
    99103                        throw new NullPointerException("identifier == null");
     
    107111                                if (identifier.regionMatches(pos1 + 1, id, 0, id.length())) {
    108112                                        String localId = identifier.substring(pos2 + 1);
    109                                         if (repository.checkLocalId(localId)) {
     113                                        if (repository.validateLocalId(localId)) {
    110114                                                return localId;
    111115                                        }
     
    130134        }
    131135
    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);
    141138        }
    142139       
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/VerbContext.java

    r350 r359  
    2222        public boolean hasArgument(Argument.Name name);
    2323
    24         public String getArgument(Argument.Name name);
     24        public String getUnparsedArgument(Argument.Name name);
    2525
    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();
    2731
    2832        public String getRequestURI();
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/OAIOutputStreamImpl.java

    r342 r359  
    4646                        writer = writerFactory.get().createXMLStreamWriter(stream, "utf-8");
    4747                        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
    4856                        writer.setDefaultNamespace(NS_OAI);
    4957                        writer.writeStartElement("OAI-PMH");
     
    6371                        if (ctx.getVerb() != null) {
    6472                                writer.writeAttribute("verb", ctx.getVerb());
    65                                 Map<Argument.Name, String> args = ctx.getArguments();
     73                                Map<Argument.Name, String> args = ctx.getUnparsedArguments();
    6674                                for (Argument.Name key : args.keySet()) {
    6775                                        writer.writeAttribute(key.toXmlString(), args.get(key));
     
    123131                        }
    124132                        writer.writeStartElement(namespaceURI, localName);
     133                        boolean schemaDeclWritten = false;
    125134                        for (NamespaceDecl decl : decls) {
    126135                                writer.writeNamespace(decl.getPrefix(), decl.getNamespaceURI());
    127136                                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                                        }
    128146                                        writer.writeAttribute(
    129147                                                        XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI,
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/impl/VerbContextImpl.java

    r350 r359  
    4242                }
    4343        } // 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
    4461        private final HttpServletRequest request;
    4562        private final HttpServletResponse response;
    4663        private OAIRepositoryAdapter repository;
    4764        private String verb;
    48         private Map<Argument.Name, String> arguments;
     65        private Map<Argument.Name, ArgumentValueImpl> arguments;
    4966        private List<Error> errors;
    5067
     
    94111        }
    95112
    96         public void setArgument(Argument.Name name, String value) {
     113        public void setArgument(Argument.Name name, String value, Object parsedValue) {
    97114                if ((name == null) || (value == null)) {
    98115                        throw new NullPointerException("name == null || value == null");
    99116                }
    100117                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));
    104121        }
    105122
     
    124141
    125142        @Override
    126         public String getArgument(Argument.Name name) {
    127                 String value = null;
     143        public String getUnparsedArgument(Argument.Name name) {
    128144                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() {
    136166                if (arguments == null) {
    137167                        return Collections.emptyMap();
    138168                }
    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;
    140176        }
    141177
     
    146182                }
    147183                errors.add(new ErrorImpl(code, message));
     184        }
     185
     186        @Override
     187        public String getContextPath() {
     188                return request.getContextPath();
    148189        }
    149190
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/Argument.java

    r358 r359  
    3535                            "[\\w\\.!~\\*'\\(\\);/\\?:&=\\+\\$,%]+",
    3636                            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       
    3742        private final Name name;
    3843        private final boolean required;
     
    5560        }
    5661
    57         public boolean validateArgument(String value) {
     62        public boolean checkArgument(String value) {
    5863                switch (name) {
     64                case FROM:
     65                        /* FALL_THROUGH */
     66                case UNTIL:
     67                        return dateRegEx.matcher(value).matches();
    5968                case IDENTIFIER:
    6069                        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;
    6176                default:
    62                         // XXX: implement validation
    63                         return true;
    64                 }
     77                        throw new InternalError("invalid argument name");
     78                } // switch
    6579        }
    6680
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/GetRecordVerb.java

    r342 r359  
    1414        private static final List<Argument> s_arguments =
    1515                Arrays.asList(new Argument(Name.IDENTIFIER, true),
     16                                        new Argument(Name.FROM, false),
    1617                                          new Argument(Name.METADATAPREFIX, true));
    1718
     
    3031                logger.debug("process GET-RECORD");
    3132               
     33                String from = ctx.getUnparsedArgument(Name.FROM);
     34                System.err.println("FROM: \"" + from + "\"");
     35
    3236                // XXX: testing only ...
    3337                OAIOutputStream out = ctx.getOutputStream();
     
    3640               
    3741                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();
    4145                out.writeStartElement("datestamp");
    4246                out.writeDateAsCharacters(new Date());
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/IdentifyVerb.java

    r345 r359  
    1313public class IdentifyVerb extends Verb {
    1414        private static List<NamespaceDecl> descsNsDecls = Arrays.asList(
    15                         new NamespaceDecl(MetadataConstants.NS_OAI_DC, null,
     15                        new NamespaceDecl(MetadataConstants.NS_OAI_DC, "oai_dc",
    1616                              MetadataConstants.NS_OAI_DC_SCHEMA_LOCATION),
    17             new NamespaceDecl(MetadataConstants.NS_DC, "dc")
     17            new NamespaceDecl(MetadataConstants.NS_DC, null)
    1818        );
    1919        private static List<NamespaceDecl> identifierNsDecls = Arrays.asList(
     
    5959
    6060                out.writeStartElement("earliestDatestamp");
    61                 // FIXME: consider granularity
    6261                out.writeCharacters(repository.getEarliestTimestamp());
    63                 out.writeEndElement(); // protocolVersion element
     62                out.writeEndElement(); // earliestDatestamp element
    6463
    6564                out.writeStartElement("deletedRecord");
  • VirtualCollectionRegistry/trunk/VirtualCollectionRegistry/src/main/java/eu/clarin/cmdi/virtualcollectionregistry/oai/verb/ListMetadataFormatsVerb.java

    r358 r359  
    3535                List<MetadataFormat> formats = null;
    3636                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);
    3939                        if (record != null) {
    4040                                formats = record.getSupportedMetadataFormats();
Note: See TracChangeset for help on using the changeset viewer.