Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Header anchor extension fails on android #71

Closed
scottTomaszewski opened this issue Nov 4, 2016 · 14 comments
Closed

Header anchor extension fails on android #71

scottTomaszewski opened this issue Nov 4, 2016 · 14 comments

Comments

@scottTomaszewski
Copy link

When running the renderer on android, I get an IllegalArgumentException:

java.lang.IllegalArgumentException: Unsupported flags: 256
    at java.util.regex.Pattern.<init>(Pattern.java:1320)
    at java.util.regex.Pattern.compile(Pattern.java:971)
    at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:14)
    at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:13)
    at org.commonmark.ext.heading.anchor.IdGenerator$Builder.build(IdGenerator.java:106)
    at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.<init>(HeadingIdAttributeProvider.java:20)
    at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.create(HeadingIdAttributeProvider.java:24)
    at org.commonmark.ext.heading.anchor.HeadingAnchorExtension$1.create(HeadingAnchorExtension.java:61)
    at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:199)
    at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:188)
    at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:62)
    at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:69)

Here is the code I am using to run the renderer

String md = "# markdown"
List<Extension> extensions = Arrays.asList(
        TablesExtension.create(),
        StrikethroughExtension.create(),
        AutolinkExtension.create(),
        HeadingAnchorExtension.create(),
        InsExtension.create());
Parser parser = Parser.builder().extensions(extensions).build();
HtmlRenderer renderer = HtmlRenderer.builder().extensions(extensions).build();
Node document = parser.parse(md);
renderer.render(document);

And here is the relevant section of my gradle config

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.0"

    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 25
        jackOptions {
            enabled true
        }
        ...
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    ...
}

dependencies {
    ...
    ext.commonmark = "0.7.1"
    compile "com.atlassian.commonmark:commonmark:$commonmark"
    compile "com.atlassian.commonmark:commonmark-ext-gfm-tables:$commonmark"
    compile "com.atlassian.commonmark:commonmark-ext-autolink:$commonmark"
    compile "com.atlassian.commonmark:commonmark-ext-gfm-strikethrough:$commonmark"
    compile "com.atlassian.commonmark:commonmark-ext-heading-anchor:$commonmark"
    compile "com.atlassian.commonmark:commonmark-ext-ins:$commonmark"
}

This looks very similar to this issue. Any help would be great, thanks!

@scottTomaszewski
Copy link
Author

The UNICODE_CHARACTER_CLASS flag was added in java 7 which is being used in the IdGenerator class.

@robinst
Copy link
Collaborator

robinst commented Nov 6, 2016

Thanks! Yeah, looks like it :/. I'll have a look at fixing this tomorrow! And adding that extension to the Android test project as well, which would have caught this problem earlier.

robinst added a commit that referenced this issue Nov 8, 2016
This way, we also catch Android incompatibilities in extension code.
robinst added a commit that referenced this issue Nov 8, 2016
This way, we also catch Android incompatibilities in extension code.
@robinst
Copy link
Collaborator

robinst commented Nov 8, 2016

Weird, I've added the extensions to the Android test project and had a successful build using the current code: https://travis-ci.org/atlassian/commonmark-java/builds/174119393

Have to investigate more. Do you know if this might depend on the build configuration or something? The one we're using is here: https://github.com/atlassian/commonmark-java/blob/extensions-in-android-tests/commonmark-android-test/app/build.gradle

@scottTomaszewski
Copy link
Author

I've run locally and I get the same error:

SToma-MBA-OSX-(2):commonmark-android-test scott.tomaszewski$ ./gradlew :app:clean :app:connectedSnapshotDebugAndroidTest
:app:clean
:app:preBuild UP-TO-DATE
:app:preSnapshotDebugBuild UP-TO-DATE
:app:checkSnapshotDebugManifest
:app:prepareSnapshotDebugDependencies
:app:compileSnapshotDebugAidl
:app:compileSnapshotDebugRenderscript
:app:generateSnapshotDebugBuildConfig
:app:generateSnapshotDebugAssets UP-TO-DATE
:app:mergeSnapshotDebugAssets
:app:generateSnapshotDebugResValues UP-TO-DATE
:app:generateSnapshotDebugResources
:app:mergeSnapshotDebugResources
:app:processSnapshotDebugManifest
:app:processSnapshotDebugResources
:app:generateSnapshotDebugSources
:app:compileSnapshotDebugJavaWithJavac
:app:compileSnapshotDebugNdk UP-TO-DATE
:app:compileSnapshotDebugSources
:app:transformClassesWithDexForSnapshotDebug
:app:mergeSnapshotDebugJniLibFolders
:app:transformNative_libsWithMergeJniLibsForSnapshotDebug
:app:processSnapshotDebugJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForSnapshotDebug
:app:validateDebugSigning
:app:packageSnapshotDebug
:app:zipalignSnapshotDebug
:app:assembleSnapshotDebug
:app:preSnapshotDebugAndroidTestBuild UP-TO-DATE
:app:preMavenDebugAndroidTestBuild UP-TO-DATE
:app:prepareComAndroidSupportTestExposedInstrumentationApiPublish041Library
:app:prepareComAndroidSupportTestRules041Library
:app:prepareComAndroidSupportTestRunner041Library
:app:prepareSnapshotDebugAndroidTestDependencies
:app:compileSnapshotDebugAndroidTestAidl
:app:processSnapshotDebugAndroidTestManifest
:app:compileSnapshotDebugAndroidTestRenderscript
:app:generateSnapshotDebugAndroidTestBuildConfig
:app:generateSnapshotDebugAndroidTestAssets UP-TO-DATE
:app:mergeSnapshotDebugAndroidTestAssets
:app:generateSnapshotDebugAndroidTestResValues UP-TO-DATE
:app:generateSnapshotDebugAndroidTestResources
:app:mergeSnapshotDebugAndroidTestResources
:app:processSnapshotDebugAndroidTestResources
:app:generateSnapshotDebugAndroidTestSources
:app:compileSnapshotDebugAndroidTestJavaWithJavac
:app:compileSnapshotDebugAndroidTestNdk UP-TO-DATE
:app:compileSnapshotDebugAndroidTestSources
:app:transformClassesWithDexForSnapshotDebugAndroidTest
:app:mergeSnapshotDebugAndroidTestJniLibFolders
:app:transformNative_libsWithMergeJniLibsForSnapshotDebugAndroidTest
:app:processSnapshotDebugAndroidTestJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForSnapshotDebugAndroidTest
:app:packageSnapshotDebugAndroidTest
:app:assembleSnapshotDebugAndroidTest
:app:connectedSnapshotDebugAndroidTest

com.atlassian.commonmark.android.test.AndroidSupportTest > headingAnchorExtensionTest[test(AVD) - 6.0] FAILED 
    java.lang.IllegalArgumentException: Unsupported flags: 256
    at java.util.regex.Pattern.<init>(Pattern.java:390)
:app:connectedSnapshotDebugAndroidTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:connectedSnapshotDebugAndroidTest'.
> There were failing tests. See the report at: file:///Users/scott.tomaszewski/code/commonmark-java/commonmark-android-test/app/build/reports/androidTests/connected/flavors/SNAPSHOT/index.html

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 41.165 secs

I also tried running on two physical devices and got the same thing. I should mention that the above was run on an android 23 emulator because the v15 image failed to download and I already had a v23 image. I will continue to consider this.

@scottTomaszewski
Copy link
Author

I just ran on an API 17 emulator and it passed.

@robinst
Copy link
Collaborator

robinst commented Nov 10, 2016

That's weird.. I wonder if they just ignored unknown flags before, but then became stricter? Can you try if changing this line to this works?:

 private final Pattern allowedCharacters = Pattern.compile("[\\w\\-_]+(?U)");

@scottTomaszewski
Copy link
Author

scottTomaszewski commented Nov 12, 2016

Made the change, but I get test failures:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.commonmark.ext.heading.anchor.HeadingAnchorConfigurationTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.116 sec
Running org.commonmark.ext.heading.anchor.HeadingAnchorTest
Tests run: 13, Failures: 4, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec <<< FAILURE!

Results :

Failed tests:   testSupplementalDiacriticalMarks(org.commonmark.ext.heading.anchor.HeadingAnchorTest): expected:<<h1 id="a[᷀]">a᷀</h1>
  testNonAsciiCharacterHeading(org.commonmark.ext.heading.anchor.HeadingAnchorTest): expected:<<h1 id="b[ä]r">bär</h1>
  testUndertieUnicodeDisplayed(org.commonmark.ext.heading.anchor.HeadingAnchorTest): expected:<<h1 id="undertie-[‿]">undertie ‿</h1>
  testCombiningDiaeresis(org.commonmark.ext.heading.anchor.HeadingAnchorTest): expected:<<h1 id="product[ͭͫ]">Productͭͫ</h1>

Tests run: 17, Failures: 4, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] commonmark-java parent ............................. SUCCESS [  3.954 s]
[INFO] commonmark-java test utilities ..................... SUCCESS [  7.681 s]
[INFO] commonmark-java core ............................... SUCCESS [  7.450 s]
[INFO] commonmark-java extension for autolinking .......... SUCCESS [  0.720 s]
[INFO] commonmark-java extension for strikethrough ........ SUCCESS [  0.671 s]
[INFO] commonmark-java extension for tables ............... SUCCESS [  0.795 s]
[INFO] commonmark-java extension for adding id attributes to h tags FAILURE [  0.645 s]
[INFO] commonmark-java extension for <ins> (underline) .... SKIPPED
[INFO] commonmark-java extension for YAML front matter .... SKIPPED
[INFO] commonmark-java integration tests .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 33.768 s
[INFO] Finished at: 2016-11-12T11:26:00-05:00
[INFO] Final Memory: 29M/269M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.9:test (default-test) on project commonmark-ext-heading-anchor: There are test failures.
[ERROR] 
[ERROR] Please refer to /Users/scott.tomaszewski/code/commonmark-java/commonmark-ext-heading-anchor/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :commonmark-ext-heading-anchor

Looks like the embedded flag expression isnt picked up. Sad day.

I did build the extension without tests and added the dependency. It crashes with the following:

11-12 11:46:29.430 20684-20684/com.grok.notes.debug E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.grok.notes.debug, PID: 20684
                                                                      java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 11
                                                                      [\w\-_]+(?U)
                                                                                 ^
                                                                          at java.util.regex.Pattern.compileImpl(Native Method)
                                                                          at java.util.regex.Pattern.compile(Pattern.java:1340)
                                                                          at java.util.regex.Pattern.<init>(Pattern.java:1324)
                                                                          at java.util.regex.Pattern.compile(Pattern.java:946)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:14)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:13)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator$Builder.build(IdGenerator.java:107)
                                                                          at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.<init>(HeadingIdAttributeProvider.java:20)
                                                                          at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.create(HeadingIdAttributeProvider.java:24)
                                                                          at org.commonmark.ext.heading.anchor.HeadingAnchorExtension$1.create(HeadingAnchorExtension.java:61)
                                                                          at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:199)
                                                                          at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:188)
                                                                          at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:62)
                                                                          at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:69)
                                                                          at com.grok.notes.preview.PreviewCommonmarkFragment.updateContents(PreviewCommonmarkFragment.java:28)
                                                                          at com.grok.notes.preview.PreviewFragment.onViewCreated(PreviewFragment.java:70)
                                                                          at com.grok.notes.preview.WebviewPreviewFragment.onViewCreated(WebviewPreviewFragment.java:67)
                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1010)
                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
                                                                          at android.app.BackStackRecord.run(BackStackRecord.java:815)
                                                                          at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
                                                                          at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
                                                                          at android.os.Handler.handleCallback(Handler.java:751)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

@robinst
Copy link
Collaborator

robinst commented Nov 14, 2016

The sad part is that Android always uses them anyway, according to the docs: https://developer.android.com/reference/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS

This flag has no effect on Android, unicode character classes are always used.

Can you see if this works?:

private final Pattern allowedCharacters = Pattern.compile("[\\p{Alpha}\\p{gc=Mn}\\p{gc=Me}\\p{gc=Mc}\\p{Digit}\\p{gc=Pc}\\p{IsJoin_Control}\\-_]+");

(Thanks for your help with this!)

@scottTomaszewski
Copy link
Author

Still have one test failure:

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running org.commonmark.ext.heading.anchor.HeadingAnchorConfigurationTest
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.139 sec
Running org.commonmark.ext.heading.anchor.HeadingAnchorTest
Tests run: 13, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.023 sec <<< FAILURE!

Results :

Failed tests:   testNonAsciiCharacterHeading(org.commonmark.ext.heading.anchor.HeadingAnchorTest): expected:<<h1 id="b[ä]r">bär</h1>

Tests run: 17, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] commonmark-java parent ............................. SUCCESS [  2.114 s]
[INFO] commonmark-java test utilities ..................... SUCCESS [  4.368 s]
[INFO] commonmark-java core ............................... SUCCESS [  6.424 s]
[INFO] commonmark-java extension for autolinking .......... SUCCESS [  0.785 s]
[INFO] commonmark-java extension for strikethrough ........ SUCCESS [  0.749 s]
[INFO] commonmark-java extension for tables ............... SUCCESS [  0.879 s]
[INFO] commonmark-java extension for adding id attributes to h tags FAILURE [  0.614 s]
[INFO] commonmark-java extension for <ins> (underline) .... SKIPPED
[INFO] commonmark-java extension for YAML front matter .... SKIPPED
[INFO] commonmark-java integration tests .................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 19.278 s
[INFO] Finished at: 2016-11-14T09:12:15-05:00
[INFO] Final Memory: 30M/315M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.9:test (default-test) on project commonmark-ext-heading-anchor: There are test failures.
[ERROR] 
[ERROR] Please refer to /Users/scott.tomaszewski/code/commonmark-java/commonmark-ext-heading-anchor/target/surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :commonmark-ext-heading-anchor

Android also seems to dislike it:

11-14 09:39:19.359 28264-28264/com.grok.notes.debug E/AndroidRuntime: FATAL EXCEPTION: main
                                                                      Process: com.grok.notes.debug, PID: 28264
                                                                      java.util.regex.PatternSyntaxException: U_ILLEGAL_ARGUMENT_ERROR
                                                                      [\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}\-_]+
                                                                          at java.util.regex.Pattern.compileImpl(Native Method)
                                                                          at java.util.regex.Pattern.compile(Pattern.java:1340)
                                                                          at java.util.regex.Pattern.<init>(Pattern.java:1324)
                                                                          at java.util.regex.Pattern.compile(Pattern.java:946)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:14)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator.<init>(IdGenerator.java:13)
                                                                          at org.commonmark.ext.heading.anchor.IdGenerator$Builder.build(IdGenerator.java:107)
                                                                          at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.<init>(HeadingIdAttributeProvider.java:20)
                                                                          at org.commonmark.ext.heading.anchor.internal.HeadingIdAttributeProvider.create(HeadingIdAttributeProvider.java:24)
                                                                          at org.commonmark.ext.heading.anchor.HeadingAnchorExtension$1.create(HeadingAnchorExtension.java:61)
                                                                          at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:199)
                                                                          at org.commonmark.renderer.html.HtmlRenderer$RendererContext.<init>(HtmlRenderer.java:188)
                                                                          at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:62)
                                                                          at org.commonmark.renderer.html.HtmlRenderer.render(HtmlRenderer.java:69)
                                                                          at com.grok.notes.preview.PreviewCommonmarkFragment.updateContents(PreviewCommonmarkFragment.java:28)
                                                                          at com.grok.notes.preview.PreviewFragment.onViewCreated(PreviewFragment.java:70)
                                                                          at com.grok.notes.preview.WebviewPreviewFragment.onViewCreated(WebviewPreviewFragment.java:67)
                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1010)
                                                                          at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1171)
                                                                          at android.app.BackStackRecord.run(BackStackRecord.java:815)
                                                                          at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1578)
                                                                          at android.app.FragmentManagerImpl$1.run(FragmentManager.java:483)
                                                                          at android.os.Handler.handleCallback(Handler.java:751)
                                                                          at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                          at android.os.Looper.loop(Looper.java:154)
                                                                          at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                          at java.lang.reflect.Method.invoke(Native Method)
                                                                          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

@scottTomaszewski
Copy link
Author

I made a terrible, fragile, hacky, sheild-your-eyes solution that works...

private final Pattern allowedCharacters = System.getProperty("java.vendor.url").equals("http://www.android.com/")
                                                  ? Pattern.compile("[\\w\\-_]+")
                                                  : Pattern.compile("[\\w\\-_]+", Pattern.UNICODE_CHARACTER_CLASS);

According to the docs, here is a list of System properties that should always be available. I suppose you could pick your favorite amongst these. It specifically says

The following properties are always provided by the Dalvik VM

but we already know that Dalvik is being replaced by ART. Regardless, anything on android API 21+ should be on ART. My test was on API 25 and it passes so I think it should be okay from that perspective. Obviously its far from ideal as a long-term solution, but its a backup plan I guess.

@robinst
Copy link
Collaborator

robinst commented Nov 29, 2016

Thanks for the suggestion. I didn't want to hardcode that test, but I've gone with something very similar: #72

Let me know if that fixes the problem for you, and I'll merge and release in the next few days.

robinst added a commit that referenced this issue Nov 29, 2016
ext-heading-anchor: Recover from IllegalArgumentException on Android (#71)
@robinst
Copy link
Collaborator

robinst commented Nov 29, 2016

I've merged the change, let me know if we need to do any follow-up. I'll add another comment here when this is released.

@robinst
Copy link
Collaborator

robinst commented Dec 9, 2016

Released in version 0.8.0 now 🎉! Thanks for all the help @scottTomaszewski.

@scottTomaszewski
Copy link
Author

scottTomaszewski commented Dec 9, 2016 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants