- Timestamp:
- 11/17/15 17:14:53 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
SRUServer/trunk/src/main/java/eu/clarin/sru/server/SRURequestImpl.java
r6818 r6821 21 21 import java.util.Collections; 22 22 import java.util.Enumeration; 23 import java.util.HashMap; 23 24 import java.util.List; 25 import java.util.Map; 24 26 25 27 import javax.servlet.http.HttpServletRequest; … … 83 85 private SRURecordXmlEscaping recordXmlEscaping; 84 86 private SRURecordPacking recordPacking; 85 private CQLNode query; 86 private String queryType; 87 private SRUQuery<?> query; 87 88 private int startRecord = DEFAULT_START_RECORD; 88 89 private int maximumRecords = -1; … … 104 105 HTTP_ACCEPT, 105 106 RESPONSE_TYPE, 106 QUERY,107 QUERY_TYPE,107 // QUERY, 108 // QUERY_TYPE, 108 109 START_RECORD, 109 110 MAXIMUM_RECORDS, … … 147 148 case RESPONSE_TYPE: 148 149 return PARAM_RESPONSE_TYPE; 149 case QUERY:150 return PARAM_QUERY;151 case QUERY_TYPE:152 return PARAM_QUERY_TYPE;150 // case QUERY: 151 // return PARAM_QUERY; 152 // case QUERY_TYPE: 153 // return PARAM_QUERY_TYPE; 153 154 case START_RECORD: 154 155 return PARAM_START_RECORD; … … 168 169 case RECORD_PACKING: 169 170 /* 170 * FIXME: make this better 171 * 'recordPacking' only exists in SRU 2.0; the old variant is 172 * handled by the case for RECORD_XML_ESCAPING 171 173 */ 172 174 if (version == SRUVersion.VERSION_2_0) { 173 175 return PARAM_RECORD_PACKING; 174 176 } else { 175 throw new InternalError("should not happen");177 return null; 176 178 } 177 179 case RECORD_SCHEMA: … … 231 233 new ParameterInfo(Parameter.RESPONSE_TYPE, false, 232 234 SRUVersion.VERSION_2_0, SRUVersion.VERSION_2_0), 233 new ParameterInfo(Parameter.QUERY, true,234 SRUVersion.VERSION_1_1, SRUVersion.VERSION_2_0),235 new ParameterInfo(Parameter.QUERY_TYPE, true,236 SRUVersion.VERSION_2_0, SRUVersion.VERSION_2_0),235 // new ParameterInfo(Parameter.QUERY, true, 236 // SRUVersion.VERSION_1_1, SRUVersion.VERSION_2_0), 237 // new ParameterInfo(Parameter.QUERY_TYPE, true, 238 // SRUVersion.VERSION_2_0, SRUVersion.VERSION_2_0), 237 239 new ParameterInfo(Parameter.START_RECORD, false, 238 240 SRUVersion.VERSION_1_1, SRUVersion.VERSION_2_0), … … 290 292 logger.debug("handling request as SRU 2.0, because no '{}' " + 291 293 "parameter was found in the request", PARAM_VERSION); 292 if (getParameter(PARAM_QUERY, false, false) != null) { 293 logger.debug("found parameter '{}' therefore " + 294 if ((getParameter(PARAM_QUERY, false, false) != null) || 295 (getParameter(PARAM_QUERY_TYPE, false, false) != null)) { 296 logger.debug("found parameter '{}' or '{}' therefore " + 294 297 "assuming '{}' operation", 295 PARAM_QUERY, SRUOperation.SEARCH_RETRIEVE); 298 PARAM_QUERY, PARAM_QUERY_TYPE, 299 SRUOperation.SEARCH_RETRIEVE); 296 300 operation = SRUOperation.SEARCH_RETRIEVE; 297 301 } else if (getParameter(PARAM_SCAN_CLAUSE, false, false) != null) { … … 429 433 for (ParameterInfo parameter : parameter_set) { 430 434 final String name = parameter.getName(version); 435 if (name == null) { 436 /* 437 * this parameter is not supported in the SRU version that 438 * was used for the request 439 */ 440 continue; 441 } 431 442 final String value = getParameter(name, true, true); 432 443 if (value != null) { … … 472 483 "\" is not supported."); 473 484 } 474 break;475 case QUERY:476 query = parseCQLParameter(name, value);477 break;478 case QUERY_TYPE:479 queryType = parseQueryTypeParameter(name, value);480 485 break; 481 486 case START_RECORD: … … 517 522 break; 518 523 case SCAN_CLAUSE: 519 scanClause = parse CQLParameter(name, value);524 scanClause = parseScanQueryParameter(name, value); 520 525 break; 521 526 case RESPONSE_POSITION: … … 566 571 567 572 /* 573 * handle query and queryType 574 */ 575 if (operation == SRUOperation.SEARCH_RETRIEVE) { 576 /* 577 * determine queryType 578 */ 579 String queryType = null; 580 if (version == SRUVersion.VERSION_2_0) { 581 parameterNames.remove(PARAM_QUERY_TYPE); 582 String value = getParameter(PARAM_QUERY_TYPE, true, true); 583 if (value == null) { 584 queryType = SRUConstants.SRU_QUERY_TYPE_CQL; 585 } else { 586 boolean badCharacters = false; 587 for (int i = 0; i < value.length(); i++) { 588 final char ch = value.charAt(i); 589 if (!((ch >= 'a' && ch <= 'z') || 590 (ch >= 'A' && ch <= 'Z') || 591 (ch >= '0' && ch <= '9') || 592 ((i > 0) && ((ch == '-') || ch == '_')))) { 593 addDiagnostic(SRUConstants.SRU_UNSUPPORTED_PARAMETER_VALUE, 594 PARAM_QUERY_TYPE, "Value contains illegal characters."); 595 badCharacters = true; 596 break; 597 } 598 } 599 if (!badCharacters) { 600 queryType = value; 601 } 602 } 603 } else { 604 // SRU 1.1 and SRU 1.2 only support CQL 605 queryType = SRUConstants.SRU_QUERY_TYPE_CQL; 606 } 607 608 609 if (queryType != null) { 610 logger.debug("looking for query parser for query type '{}'", 611 queryType); 612 final SRUQueryParser<?> queryParser = 613 config.findQueryParser(queryType); 614 if (queryParser != null) { 615 /* 616 * gather query parameters (as required by QueryParser 617 * implementation 618 */ 619 final Map<String, String> queryParameters = 620 new HashMap<String, String>(); 621 List<String> missingParameter = null; 622 for (String name : queryParser.getQueryParameterNames()) { 623 parameterNames.remove(name); 624 final String value = getParameter(name, true, false); 625 if (value != null) { 626 queryParameters.put(name, value); 627 } else { 628 if (missingParameter == null) { 629 missingParameter = new ArrayList<String>(); 630 } 631 missingParameter.add(name); 632 } 633 } 634 635 if (missingParameter == null) { 636 logger.debug("parsing query with parser for " + 637 "type '{}' and parameters {}", 638 queryParser.getQueryType(), 639 queryParameters); 640 query = queryParser.parseQuery(version, 641 queryParameters, this); 642 } else { 643 logger.debug("parameters {} missing, cannot parse query", 644 missingParameter); 645 for (String name : missingParameter) { 646 addDiagnostic( 647 SRUConstants.SRU_MANDATORY_PARAMETER_NOT_SUPPLIED, 648 name, "Mandatory parameter '" + name + 649 "' is missing or empty. " + 650 "Required to perform query " + 651 "of query type '" + 652 queryType + "'."); 653 } 654 } 655 } else { 656 logger.debug("no parser for query type '{}' found", queryType); 657 addDiagnostic(SRUConstants.SRU_CANNOT_PROCESS_QUERY_REASON_UNKNOWN, null, 658 "Cannot find query parser for query type '" + queryType + "'."); 659 } 660 } else { 661 logger.debug("cannot determine query type"); 662 addDiagnostic(SRUConstants.SRU_CANNOT_PROCESS_QUERY_REASON_UNKNOWN, null, 663 "Cannot determine query type."); 664 } 665 } 666 667 668 /* 568 669 * check if any parameters where not consumed and 569 670 * add appropriate warnings … … 702 803 703 804 @Override 704 public CQLNodegetQuery() {805 public SRUQuery<?> getQuery() { 705 806 return query; 807 } 808 809 810 @Override 811 public boolean isQueryType(String queryType) { 812 if ((queryType != null) && (query != null)) { 813 return query.getQueryType().equals(queryType); 814 } 815 return false; 816 } 817 818 819 @Override 820 public String getQueryType() { 821 if (query != null) { 822 return query.getQueryType(); 823 } 824 return null; 706 825 } 707 826 … … 892 1011 if (diagnosticIfEmpty) { 893 1012 addDiagnostic(SRUConstants.SRU_UNSUPPORTED_PARAMETER_VALUE, 894 name, "An empty parameter \"" + PARAM_OPERATION+1013 name, "An empty parameter \"" + name + 895 1014 "\" is not supported."); 896 1015 } … … 935 1054 936 1055 937 private String parseQueryTypeParameter(String param, String value) {938 if (value != null) {939 for (int i = 0; i < value.length(); i++) {940 final char ch = value.charAt(i);941 if (!((ch >= 'a' && ch <= 'z') ||942 (ch >= 'A' && ch <= 'Z') ||943 (ch >= '0' && ch <= '9') ||944 ((i > 0) && ((ch == '-') || ch == '_')))) {945 addDiagnostic(SRUConstants.SRU_UNSUPPORTED_PARAMETER_VALUE,946 param, "Value contains illegal characters.");947 }948 }949 }950 return value;951 }952 953 954 1056 private int parseNumberedParameter(String param, String value, 955 1057 int minValue) { … … 972 1074 973 1075 974 private CQLNode parse CQLParameter(String param, String value) {1076 private CQLNode parseScanQueryParameter(String param, String value) { 975 1077 CQLNode result = null; 976 1078
Note: See TracChangeset
for help on using the changeset viewer.