[
https://issues.redhat.com/browse/DROOLS-4662?page=com.atlassian.jira.plug...
]
Mario Fusco edited comment on DROOLS-4662 at 12/18/19 10:53 AM:
----------------------------------------------------------------
I tried on master the following test case setting the file.enconding as you suggested but
it works for me
{code}
@Test
public void testI18NKieHelper() throws UnsupportedEncodingException {
String testString = "\u2200x. \u2203y. x < y";
String rules =
"rule \"foo\"\n" +
" when\n" +
" not String()\n" +
" then\n" +
" insert(\"" + testString +
"\");\n" +
" end\n";
KieServices kieServices = KieServices.Factory.get();
KieHelper kieHelper = new KieHelper();
Resource rulesResource =
kieServices.getResources().newByteArrayResource(rules.getBytes("UTF-8"),
"UTF-8");
rulesResource.setTargetPath("src/main/resources/rules.drl");
kieHelper.addResource(rulesResource);
KieBase kieBase = kieHelper.build();
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
String out = (String) kieSession.getObjects().iterator().next();
System.out.println(out);
assertEquals(out, testString);
}
{code}
and prints
∀x. ∃y. x < y
I also tried the opposite with this slightly modified test case
{code}
@Test
public void testI18NKieHelper() throws UnsupportedEncodingException {
String testString = new String("\u2200x. \u2203y. x < y".getBytes(
"latin1" ));
String rules =
"rule \"foo\"\n" +
" when\n" +
" not String()\n" +
" then\n" +
" insert(\"" + testString +
"\");\n" +
" end\n";
KieServices kieServices = KieServices.Factory.get();
KieHelper kieHelper = new KieHelper();
Resource rulesResource =
kieServices.getResources().newByteArrayResource(rules.getBytes("latin1"),
"latin1");
rulesResource.setTargetPath("src/main/resources/rules.drl");
kieHelper.addResource(rulesResource);
KieBase kieBase = kieHelper.build();
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
String out = (String) kieSession.getObjects().iterator().next();
System.out.println(out);
assertEquals(out, testString);
}
{code}
e.g. setting both the encoding of string and rule resource to latin1 and this also works
adn prints as expected
?x. ?y. x < y
As a final note consider that in all cases the KieHelper class is only intended for
internal use and it is not part of our API.
was (Author: mfusco):
I tried on master the following test case setting the file.enconding as you suggested but
it works for me
{code}
@Test
public void testI18NKieHelper() throws UnsupportedEncodingException {
String testString = "\u2200x. \u2203y. x < y";
String rules =
"rule \"foo\"\n" +
" when\n" +
" not String()\n" +
" then\n" +
" insert(\"" + testString +
"\");\n" +
" end\n";
KieServices kieServices = KieServices.Factory.get();
KieHelper kieHelper = new KieHelper();
Resource rulesResource =
kieServices.getResources().newByteArrayResource(rules.getBytes("UTF-8"),
"UTF-8");
rulesResource.setTargetPath("src/main/resources/rules.drl");
kieHelper.addResource(rulesResource);
KieBase kieBase = kieHelper.build();
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
String out = (String) kieSession.getObjects().iterator().next();
System.out.println(out);
assertEquals(out, testString);
}
{code}
and prints
∀x. ∃y. x < y
I also tried the opposite with this slightly modified test case
{code}
@Test
public void testI18NKieHelper() throws UnsupportedEncodingException {
String testString = new String("\u2200x. \u2203y. x < y".getBytes(
"latin1" ));
String rules =
"rule \"foo\"\n" +
" when\n" +
" not String()\n" +
" then\n" +
" insert(\"" + testString +
"\");\n" +
" end\n";
KieServices kieServices = KieServices.Factory.get();
KieHelper kieHelper = new KieHelper();
Resource rulesResource =
kieServices.getResources().newByteArrayResource(rules.getBytes("latin1"),
"latin1");
rulesResource.setTargetPath("src/main/resources/rules.drl");
kieHelper.addResource(rulesResource);
KieBase kieBase = kieHelper.build();
KieSession kieSession = kieBase.newKieSession();
kieSession.fireAllRules();
String out = (String) kieSession.getObjects().iterator().next();
System.out.println(out);
assertEquals(out, testString);
}
{code]
e.g. setting both the encoding of string and rule resource to latin1 and this also works
adn prints as expected
?x. ?y. x < y
As a final note consider that in all cases the KieHelper class is only intended for
internal use and it is not part of our API.
Resources added through KieHelper get interpreted using the default
character set
---------------------------------------------------------------------------------
Key: DROOLS-4662
URL:
https://issues.redhat.com/browse/DROOLS-4662
Project: Drools
Issue Type: Bug
Affects Versions: 7.10.0.Final, 7.20.0.Final, 7.28.0.Final
Environment: Windows. Can be reproduced on other OSes using
"-Dfile.encoding=latin1".
Reporter: Max Zerzouri
Assignee: Mario Fusco
Priority: Major
Attachments: Test.java
When a resource is added using {{KieHelper.addResource}}, any specified encoding is
ignored when it is added to the {{MemoryFileSystem}} by
{{KieFileSystemImpl.write(Resource)}} (effectively assuming the {{InputStream}} is already
encoded in UTF-8).
Additionally, when the resource is read again by {{AbstractKieModule.getResource}}, it
constructs a {{Resource}} object with no encoding specified, whereas it should probably
specify an encoding of UTF-8, since it seems that sources are considered to be UTF-8
already at least in the case of the {{MemoryKieModule}}.
I've attached a fairly minimal test case where the rules bytes are passed in UTF-8
with the encoding explicitly specified. This currently produces an error when the default
file encoding is not UTF-8 (eg, by passing {{-Dfile.encoding=latin1}} as a JVM argument,
or by using the default arguments on Windows).
--
This message was sent by Atlassian Jira
(v7.13.8#713008)