You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Mladen Ivanov Kralev (Jira)" <ji...@apache.org> on 2020/01/27 12:15:00 UTC

[jira] [Updated] (FELIX-6216) Refreshing bundle that logs Cyrillic text will produce unreadable text

     [ https://issues.apache.org/jira/browse/FELIX-6216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Mladen Ivanov Kralev updated FELIX-6216:
----------------------------------------
    Description: 
*Prerequisites*

I have the following setup 
 * 0 ACTIVE org.eclipse.osgi_3.13.300.v20190218-1622
 * 1 ACTIVE org.eclipse.equinox.simpleconfigurator_1.3.200.v20181101-1115
 * 2 ACTIVE org.example.greeter_1.0.0.0000-0001
 * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
 * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
 * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001
 * 6 ACTIVE org.apache.felix.gogo.shell_1.1.0.v20180713-1646
 * 7 ACTIVE org.apache.felix.gogo.runtime_1.1.0.v20180713-1646
 * 8 ACTIVE org.apache.felix.gogo.command_1.0.2.v20170914-1324
 * 9 ACTIVE org.eclipse.equinox.console_1.3.200.v20181115-0906

The idea here is that org.example.greeter_1.0.0.0000-0001 bundle will take messages from:
 * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
 * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
 * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001

and log them.

The message from ACTIVE org.example.greeter.bg_1.0.0.0000-0001 is "Здравей OSGi world"

What I observed is that when starting this configuration of bundles: we have messages like:

bg: Здравей OSGi world
 en: Hello OSGi world
 fr: Bonjour OSGi world

If we stop the bundle 2 and then start it again we will see a log like:
 bg: ╟фЁртхщ OSGi world
 en: Hello OSGi world
 fr: Bonjour OSGi world

I did a little debugging. I don't know the whole architecture, but... 

*Note the Marker class is: org.apache.felix.gogo.runtime.threadio.Marker.*

1. In first initialization of org.apache.felix.gogo.runtime.threadio.ThreadIOImpl one for first logging.
 final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
 final ThreadPrintStream *out *= new ThreadPrintStream(this, System.out, false);

Both of these will produce streams using different encodings

The reasoning behind is that:
 1.java.lang.System.java will be used in defaultMarker and the default encoding issetOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); -> on my machine the default is -> cp866
 2.ThreadPrintStream will internally call PrintStream which calls OutputStreamWriter(OutputStream out) which calls se = StreamEncoder.forOutputStreamWriter(out, this, (String)null); which sets the deafult streams encoding to "file.encoding" -> on my machine -> "Cp1251"

Execution flow:
 1. Default Marker will have IBM866 encoding. This will be used when greeter is internally printing. The logic is per thread. Lets called it Thread1
 2. After Felix runtime bundle initialization, one of the input commands sets new encoding, (pipe-gosh --login --noshutdown) is setting new encoding
 setting new Marker() which have "file.encoding" -> "Cp1251". This will be used Thread2
 3. Stop the greeter bundle. This leads to deactivating the current Maker for Thread1 and setting current Marker as the previous Maker
 4. Start the greeter bundle. This leads to check if the current Marker is activated? Find the latest enabled Maker which gets Marker from point (2) which
 has different file encoding.
 Note that the chain of the Makers is (1)Default Maker(IBM866) -> (2)Marker(Cp1251)(Latest)

5 This leads to unreadable results in the console.

As a solution, I did set both of the encodings, "file.encoding" and "sun.stdout.encoding" to the same encoding. This leads to 

final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
 final ThreadPrintStream out = new ThreadPrintStream(this, System.out, false);

to have the same encoding, therefore, stopping and starting the bundle will use markers with the same encoding.

I do believe that we could create the defaultMarker = new Marker(System.in, System.out, System.err, null); initialization depending on the file encoding property, and therefore the encodings of all of the Markers will have same encoding.

Please, if more information is needed, I will be glad to help :)

 

 

  was:
*Prerequisites*

I have the following setup 
 * 0 ACTIVE org.eclipse.osgi_3.13.300.v20190218-1622
 * 1 ACTIVE org.eclipse.equinox.simpleconfigurator_1.3.200.v20181101-1115
 * 2 ACTIVE org.example.greeter_1.0.0.0000-0001
 * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
 * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
 * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001
 * 6 ACTIVE org.apache.felix.gogo.shell_1.1.0.v20180713-1646
 * 7 ACTIVE org.apache.felix.gogo.runtime_1.1.0.v20180713-1646
 * 8 ACTIVE org.apache.felix.gogo.command_1.0.2.v20170914-1324
 * 9 ACTIVE org.eclipse.equinox.console_1.3.200.v20181115-0906

The idea here is that org.example.greeter_1.0.0.0000-0001 bundle will take messages from:
 * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
 * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
 * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001

and log them.

The message from ACTIVE org.example.greeter.bg_1.0.0.0000-0001 is "Здравей OSGi world"

What I observed is that when starting this configuration of bundles: we have messages like:

bg: Здравей OSGi world
en: Hello OSGi world
fr: Bonjour OSGi world

If we stop the bundle 2 and then start it again we will see a log like:
bg: ╟фЁртхщ OSGi world
en: Hello OSGi world
fr: Bonjour OSGi world

I did a little debugging. I don't know the whole architecture, but... 

1. In first initialization of org.apache.felix.gogo.runtime.threadio.ThreadIOImpl one for first logging.
final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
final ThreadPrintStream *out *= new ThreadPrintStream(this, System.out, false);

Both of these will produce streams using different encodings

The reasoning behind is that:
1.java.lang.System.java will be used in defaultMarker and the default encoding issetOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); -> on my machine the default is -> cp866
2.ThreadPrintStream will internally call PrintStream which calls OutputStreamWriter(OutputStream out) which calls se = StreamEncoder.forOutputStreamWriter(out, this, (String)null); which sets the deafult streams encoding to "file.encoding" -> on my machine -> "Cp1251"

Execution flow:
1. Default Marker will have IBM866 encoding. This will be used when greeter is internally printing. The logic is per thread. Lets called it Thread1
2. After Felix runtime bundle initialization, one of the input commands sets new encoding, (pipe-gosh --login --noshutdown) is setting new encoding
setting new Marker() which have "file.encoding" -> "Cp1251". This will be used Thread2
3. Stop the greeter bundle. This leads to deactivating the current Maker for Thread1 and setting current Marker as the previous Maker
4. Start the greeter bundle. This leads to check if the current Marker is activated? Find the latest enabled Maker which gets Marker from point (2) which
has different file encoding.
Note that the chain of the Makers is (1)Default Maker(IBM866) -> (2)Marker(Cp1251)(Latest)

5 This leads to unreadable results in the console.

As a solution, I did set both of the encodings to the same encoding. Ths leads to 

final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
final ThreadPrintStream out = new ThreadPrintStream(this, System.out, false);

to have the same encoding, therefore, stopping and starting the bundle will use markers with the same encoding

 

 


> Refreshing bundle that logs Cyrillic text will produce unreadable text
> ----------------------------------------------------------------------
>
>                 Key: FELIX-6216
>                 URL: https://issues.apache.org/jira/browse/FELIX-6216
>             Project: Felix
>          Issue Type: Bug
>          Components: Gogo Runtime
>    Affects Versions: gogo.runtime-1.1.0
>            Reporter: Mladen Ivanov Kralev
>            Priority: Minor
>
> *Prerequisites*
> I have the following setup 
>  * 0 ACTIVE org.eclipse.osgi_3.13.300.v20190218-1622
>  * 1 ACTIVE org.eclipse.equinox.simpleconfigurator_1.3.200.v20181101-1115
>  * 2 ACTIVE org.example.greeter_1.0.0.0000-0001
>  * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
>  * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
>  * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001
>  * 6 ACTIVE org.apache.felix.gogo.shell_1.1.0.v20180713-1646
>  * 7 ACTIVE org.apache.felix.gogo.runtime_1.1.0.v20180713-1646
>  * 8 ACTIVE org.apache.felix.gogo.command_1.0.2.v20170914-1324
>  * 9 ACTIVE org.eclipse.equinox.console_1.3.200.v20181115-0906
> The idea here is that org.example.greeter_1.0.0.0000-0001 bundle will take messages from:
>  * 3 ACTIVE org.example.greeter.en_1.0.0.0000-0001
>  * 4 ACTIVE org.example.greeter.fr_1.0.0.0000-0001
>  * 5 ACTIVE org.example.greeter.bg_1.0.0.0000-0001
> and log them.
> The message from ACTIVE org.example.greeter.bg_1.0.0.0000-0001 is "Здравей OSGi world"
> What I observed is that when starting this configuration of bundles: we have messages like:
> bg: Здравей OSGi world
>  en: Hello OSGi world
>  fr: Bonjour OSGi world
> If we stop the bundle 2 and then start it again we will see a log like:
>  bg: ╟фЁртхщ OSGi world
>  en: Hello OSGi world
>  fr: Bonjour OSGi world
> I did a little debugging. I don't know the whole architecture, but... 
> *Note the Marker class is: org.apache.felix.gogo.runtime.threadio.Marker.*
> 1. In first initialization of org.apache.felix.gogo.runtime.threadio.ThreadIOImpl one for first logging.
>  final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
>  final ThreadPrintStream *out *= new ThreadPrintStream(this, System.out, false);
> Both of these will produce streams using different encodings
> The reasoning behind is that:
>  1.java.lang.System.java will be used in defaultMarker and the default encoding issetOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding"))); -> on my machine the default is -> cp866
>  2.ThreadPrintStream will internally call PrintStream which calls OutputStreamWriter(OutputStream out) which calls se = StreamEncoder.forOutputStreamWriter(out, this, (String)null); which sets the deafult streams encoding to "file.encoding" -> on my machine -> "Cp1251"
> Execution flow:
>  1. Default Marker will have IBM866 encoding. This will be used when greeter is internally printing. The logic is per thread. Lets called it Thread1
>  2. After Felix runtime bundle initialization, one of the input commands sets new encoding, (pipe-gosh --login --noshutdown) is setting new encoding
>  setting new Marker() which have "file.encoding" -> "Cp1251". This will be used Thread2
>  3. Stop the greeter bundle. This leads to deactivating the current Maker for Thread1 and setting current Marker as the previous Maker
>  4. Start the greeter bundle. This leads to check if the current Marker is activated? Find the latest enabled Maker which gets Marker from point (2) which
>  has different file encoding.
>  Note that the chain of the Makers is (1)Default Maker(IBM866) -> (2)Marker(Cp1251)(Latest)
> 5 This leads to unreadable results in the console.
> As a solution, I did set both of the encodings, "file.encoding" and "sun.stdout.encoding" to the same encoding. This leads to 
> final Marker defaultMarker = new Marker(System.in, System.out, System.err, null);
>  final ThreadPrintStream out = new ThreadPrintStream(this, System.out, false);
> to have the same encoding, therefore, stopping and starting the bundle will use markers with the same encoding.
> I do believe that we could create the defaultMarker = new Marker(System.in, System.out, System.err, null); initialization depending on the file encoding property, and therefore the encodings of all of the Markers will have same encoding.
> Please, if more information is needed, I will be glad to help :)
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.4#803005)