fix UTF-8 in CQL->RPN
This commit is contained in:
parent
5a35d608ea
commit
2bd1d28c21
6 changed files with 38 additions and 19 deletions
|
@ -1,5 +1,5 @@
|
||||||
group = org.xbib
|
group = org.xbib
|
||||||
name = z3950
|
name = z3950
|
||||||
version = 5.1.6
|
version = 5.1.7
|
||||||
|
|
||||||
org.gradle.warning.mode = ALL
|
org.gradle.warning.mode = ALL
|
||||||
|
|
|
@ -72,7 +72,7 @@ public class JDKZClient implements Client, Closeable {
|
||||||
lock.lock();
|
lock.lock();
|
||||||
SearchOperation searchOperation = new SearchOperation(berReader, berWriter,
|
SearchOperation searchOperation = new SearchOperation(berReader, berWriter,
|
||||||
builder.resultSetName, builder.databases, builder.host);
|
builder.resultSetName, builder.databases, builder.host);
|
||||||
boolean success = searchOperation.executeCQL(query, builder.wordListSupported);
|
boolean success = searchOperation.executeCQL(StandardCharsets.UTF_8, query, builder.wordListSupported);
|
||||||
if (!success) {
|
if (!success) {
|
||||||
logger.log(Level.WARNING, MessageFormat.format("search was not a success [{0}]", query));
|
logger.log(Level.WARNING, MessageFormat.format("search was not a success [{0}]", query));
|
||||||
} else {
|
} else {
|
||||||
|
@ -130,7 +130,7 @@ public class JDKZClient implements Client, Closeable {
|
||||||
lock.lock();
|
lock.lock();
|
||||||
SearchOperation searchOperation = new SearchOperation(berReader, berWriter,
|
SearchOperation searchOperation = new SearchOperation(berReader, berWriter,
|
||||||
builder.resultSetName, builder.databases, builder.host);
|
builder.resultSetName, builder.databases, builder.host);
|
||||||
searchOperation.executePQF(query, StandardCharsets.UTF_8);
|
searchOperation.executePQF(StandardCharsets.UTF_8, query);
|
||||||
if (!searchOperation.isSuccess()) {
|
if (!searchOperation.isSuccess()) {
|
||||||
logger.log(Level.WARNING, MessageFormat.format("search was not a success [{0}]", query));
|
logger.log(Level.WARNING, MessageFormat.format("search was not a success [{0}]", query));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -17,7 +17,7 @@ class LVIZClientTest {
|
||||||
|
|
||||||
@Disabled
|
@Disabled
|
||||||
@Test
|
@Test
|
||||||
void testLVI() {
|
void testPQF() {
|
||||||
String query = "@attr 1=4 @attr 4=6 \"Köln strafrecht\"";
|
String query = "@attr 1=4 @attr 4=6 \"Köln strafrecht\"";
|
||||||
int offset = 1;
|
int offset = 1;
|
||||||
int size = 10;
|
int size = 10;
|
||||||
|
|
|
@ -32,6 +32,9 @@ import org.xbib.z3950.common.v3.Operator;
|
||||||
import org.xbib.z3950.common.v3.RPNQuery;
|
import org.xbib.z3950.common.v3.RPNQuery;
|
||||||
import org.xbib.z3950.common.v3.RPNStructure;
|
import org.xbib.z3950.common.v3.RPNStructure;
|
||||||
import org.xbib.z3950.common.v3.RPNStructureRpnRpnOp;
|
import org.xbib.z3950.common.v3.RPNStructureRpnRpnOp;
|
||||||
|
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -46,9 +49,8 @@ import java.util.stream.Collectors;
|
||||||
*/
|
*/
|
||||||
public final class CQLRPNGenerator implements Visitor {
|
public final class CQLRPNGenerator implements Visitor {
|
||||||
|
|
||||||
/**
|
private final Charset charset;
|
||||||
* Context map.
|
|
||||||
*/
|
|
||||||
private final Map<String, Map<String, String>> contexts;
|
private final Map<String, Map<String, String>> contexts;
|
||||||
|
|
||||||
private final Stack<AttributeElement> attributeElements;
|
private final Stack<AttributeElement> attributeElements;
|
||||||
|
@ -60,10 +62,15 @@ public final class CQLRPNGenerator implements Visitor {
|
||||||
private final boolean wordListSupported;
|
private final boolean wordListSupported;
|
||||||
|
|
||||||
public CQLRPNGenerator() {
|
public CQLRPNGenerator() {
|
||||||
this(null, true);
|
this(StandardCharsets.ISO_8859_1, null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public CQLRPNGenerator(Collection<AttributeElement> attributeElements, boolean wordListSupported) {
|
public CQLRPNGenerator(Charset charset) {
|
||||||
|
this(charset, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CQLRPNGenerator(Charset charset, Collection<AttributeElement> attributeElements, boolean wordListSupported) {
|
||||||
|
this.charset = charset;
|
||||||
this.attributeElements = new Stack<>();
|
this.attributeElements = new Stack<>();
|
||||||
if (attributeElements != null) {
|
if (attributeElements != null) {
|
||||||
this.attributeElements.addAll(attributeElements);
|
this.attributeElements.addAll(attributeElements);
|
||||||
|
@ -266,7 +273,6 @@ public final class CQLRPNGenerator implements Visitor {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void visit(Term term) {
|
public void visit(Term term) {
|
||||||
// the value
|
|
||||||
ASN1OctetString s = transformTerm(term);
|
ASN1OctetString s = transformTerm(term);
|
||||||
result.push(s);
|
result.push(s);
|
||||||
}
|
}
|
||||||
|
@ -358,7 +364,7 @@ public final class CQLRPNGenerator implements Visitor {
|
||||||
}
|
}
|
||||||
push(attributeElements, createAttributeElement(attributeType, attributeValue));
|
push(attributeElements, createAttributeElement(attributeType, attributeValue));
|
||||||
|
|
||||||
return new ASN1OctetString(v);
|
return new ASN1OctetString(v, charset);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static AttributeElement createAttributeElement(Integer attributeType, Integer attributeValue) {
|
private static AttributeElement createAttributeElement(Integer attributeType, Integer attributeValue) {
|
||||||
|
|
|
@ -54,12 +54,12 @@ public class SearchOperation extends AbstractOperation<SearchResponse, SearchReq
|
||||||
this.status = false;
|
this.status = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean executePQF(String pqf, Charset charset) throws IOException {
|
public boolean executePQF(Charset charset, String pqf) throws IOException {
|
||||||
return execute(createRPNQueryFromPQF(pqf, charset));
|
return execute(createRPNQueryFromPQF(charset, pqf));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean executeCQL(String cql, boolean wordListSupported) throws IOException {
|
public boolean executeCQL(Charset charset, String cql, boolean wordListSupported) throws IOException {
|
||||||
return execute(createRPNQueryFromCQL(cql, wordListSupported));
|
return execute(createRPNQueryFromCQL(charset, cql, wordListSupported));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean execute(RPNQuery rpn) throws IOException {
|
public boolean execute(RPNQuery rpn) throws IOException {
|
||||||
|
@ -118,15 +118,15 @@ public class SearchOperation extends AbstractOperation<SearchResponse, SearchReq
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
private RPNQuery createRPNQueryFromCQL(String query, boolean wordListSupported) {
|
private RPNQuery createRPNQueryFromCQL(Charset charset, String query, boolean wordListSupported) {
|
||||||
CQLRPNGenerator generator = new CQLRPNGenerator(null, wordListSupported);
|
CQLRPNGenerator generator = new CQLRPNGenerator(charset, null, wordListSupported);
|
||||||
CQLParser parser = new CQLParser(query);
|
CQLParser parser = new CQLParser(query);
|
||||||
parser.parse();
|
parser.parse();
|
||||||
parser.getCQLQuery().accept(generator);
|
parser.getCQLQuery().accept(generator);
|
||||||
return generator.getQueryResult();
|
return generator.getQueryResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
private RPNQuery createRPNQueryFromPQF(String query, Charset charset) {
|
private RPNQuery createRPNQueryFromPQF(Charset charset, String query) {
|
||||||
PQFRPNGenerator generator = new PQFRPNGenerator(charset);
|
PQFRPNGenerator generator = new PQFRPNGenerator(charset);
|
||||||
PQFParser parser = new PQFParser(new StringReader(query));
|
PQFParser parser = new PQFParser(new StringReader(query));
|
||||||
parser.parse();
|
parser.parse();
|
||||||
|
|
|
@ -6,6 +6,8 @@ import org.xbib.asn1.ASN1Integer;
|
||||||
import org.xbib.cql.CQLParser;
|
import org.xbib.cql.CQLParser;
|
||||||
import org.xbib.z3950.common.v3.AttributeElement;
|
import org.xbib.z3950.common.v3.AttributeElement;
|
||||||
import org.xbib.z3950.common.v3.AttributeElementAttributeValue;
|
import org.xbib.z3950.common.v3.AttributeElementAttributeValue;
|
||||||
|
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
class CQL2RPNTest {
|
class CQL2RPNTest {
|
||||||
|
@ -41,7 +43,7 @@ class CQL2RPNTest {
|
||||||
String cql = "dc.title = \"a phrase\"";
|
String cql = "dc.title = \"a phrase\"";
|
||||||
CQLParser parser = new CQLParser(cql);
|
CQLParser parser = new CQLParser(cql);
|
||||||
parser.parse();
|
parser.parse();
|
||||||
CQLRPNGenerator generator = new CQLRPNGenerator(Collections.singleton(ae), true);
|
CQLRPNGenerator generator = new CQLRPNGenerator(StandardCharsets.UTF_8, Collections.singleton(ae), true);
|
||||||
parser.getCQLQuery().accept(generator);
|
parser.getCQLQuery().accept(generator);
|
||||||
String q = generator.getQueryResult().toString();
|
String q = generator.getQueryResult().toString();
|
||||||
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 7, attributeValue {numeric 4}}{attributeType 3, attributeValue {numeric 3}}{attributeType 4, attributeValue {numeric 1}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 1, attributeValue {numeric 4}}{attributeType 2, attributeValue {numeric 3}}}, term {general \"a phrase\"}}}}}", q);
|
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 7, attributeValue {numeric 4}}{attributeType 3, attributeValue {numeric 3}}{attributeType 4, attributeValue {numeric 1}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 1, attributeValue {numeric 4}}{attributeType 2, attributeValue {numeric 3}}}, term {general \"a phrase\"}}}}}", q);
|
||||||
|
@ -79,4 +81,15 @@ class CQL2RPNTest {
|
||||||
String q = generator.getQueryResult().toString();
|
String q = generator.getQueryResult().toString();
|
||||||
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 3, attributeValue {numeric 3}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 4, attributeValue {numeric 5}}{attributeType 1, attributeValue {numeric 31}}{attributeType 2, attributeValue {numeric 3}}}, term {general \"2023\"}}}}}", q);
|
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 3, attributeValue {numeric 3}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 4, attributeValue {numeric 5}}{attributeType 1, attributeValue {numeric 31}}{attributeType 2, attributeValue {numeric 3}}}, term {general \"2023\"}}}}}", q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUTF8() {
|
||||||
|
String cql = "bib.title = Köln";
|
||||||
|
CQLParser parser = new CQLParser(cql);
|
||||||
|
parser.parse();
|
||||||
|
CQLRPNGenerator generator = new CQLRPNGenerator(StandardCharsets.UTF_8);
|
||||||
|
parser.getCQLQuery().accept(generator);
|
||||||
|
String q = generator.getQueryResult().toString();
|
||||||
|
assertEquals("{attributeSetId 1.2.840.10003.3.1, rpn {op {attrTerm {attributes {{attributeType 3, attributeValue {numeric 3}}{attributeType 4, attributeValue {numeric 2}}{attributeType 5, attributeValue {numeric 100}}{attributeType 6, attributeValue {numeric 1}}{attributeType 1, attributeValue {numeric 4}}{attributeType 2, attributeValue {numeric 3}}}, term {general \"K\\703\\666ln\"}}}}}", q);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue