Actually I realized if I keep the commits separate and generate a patch set instead of squashing then I can preserve authorship. These patches, which follow patch 0001, fix the spacing and allow non-public classes. Thanks again for testing, debugging, and reporting. On Wed, Oct 21, 2020 at 9:54 AM John Herrlin wrote: > > ian martins writes: > > >> > >> What do you think about having a configurable list where the user can > >> add =org-babel-java--import-maybe=? In my current use case I could then > >> add RxJava imports to that list and the imports could be removed from > >> the source code block. > > > > > > I think this can already be done. imports can be added to the headers, > and > > babel allows file-wide headers, so you could add a =#+HEADER: :import > > rx.Observable= line to the file and all source blocks would get it. it's > > slightly different in that =org-babel-java--import-maybe= skips imports > > that it thinks aren't needed. also if there are any non-java source > blocks > > in the same file, these imports could be added to them which would be > bad, > > so when mixing multiple languages in the same file this wouldn't be an > > option. > > Thanks for pointing that out! It work just fine! > > > > > NIT > >> Some spacing when writing =public static...= > >> > > > > Thanks for fixing the spacing. I don't think I can give you credit for > the > > patch, though, without leaving it out until ob-java is accepted. > > I dont need any credits, the important part is the result! > > I have made a couple of more runs and I cant find anything that doesnt > work! > > > > > On Wed, Oct 21, 2020 at 1:59 AM John Herrlin wrote: > > > >> > >> I did and it looks really good. The difference in this example: > >> > >> #+BEGIN_SRC java > >> import rx.Observable; > >> > >> Observable.range(5, 3) > >> .subscribe((Integer i) -> { System.out.println("Got: " + > i); }, > >> (Throwable t) -> { t.printStackTrace();}, > >> () -> { System.out.println("Ending > >> stream"); }); > >> #+END_SRC > >> > >> from the ones I posted yesterday is tremendous! > >> > >> I am not very experienced with Emacs lisp but I think it's pretty easy > >> to understand how things works and follow the code. The comments are > >> also of good help. I really appreciate the work you have done! > >> > >> > >> What do you think about having a configurable list where the user can > >> add =org-babel-java--import-maybe=? In my current use case I could then > >> add RxJava imports to that list and the imports could be removed from > >> the source code block. > >> > >> > >> NIT > >> > >> Some spacing when writing =public static...= > >> > >> #+BEGIN_SRC diff > >> diff --git a/lisp/ob-java.el b/lisp/ob-java.el > >> index 94c3f69cf..4f3904871 100644 > >> --- a/lisp/ob-java.el > >> +++ b/lisp/ob-java.el > >> @@ -220,7 +220,7 @@ RESULT-FILE is the temp file to write the > result." > >> (org-babel-java--move-past org-babel-java--class-re) > >> (insert "\n public static void main(String[] args) { > >> System.out.print(\"success\"); > >> -}\n\n")) > >> + }\n\n")) > >> > >> ;; special handling to return value > >> (when (eq result-type 'value) > >> #+END_SRC > >> > >> > >> > >> ian martins writes: > >> > >> > Thanks for testing, and thanks for pointing that out. I will fix it so > >> that > >> > `public` is optional. > >> > > >> > btw, in your example you didn't have to specify `:classname` since you > >> > defined the class name in the source block. > >> > > >> > btw2, did you notice that you can C-c C-c on source blocks that don't > >> have > >> > main methods and it'll compile without error? > >> > > >> > On Tue, Oct 20, 2020 at 3:17 PM John Herrlin > wrote: > >> > > >> >> > >> >> Hey, > >> >> > >> >> Did some debugging and found out that my class didn't contained > =public= > >> >> and the patch requires it to be. > >> >> > >> >> This works fine: > >> >> > >> >> #+HEADER: :classname Main > >> >> #+HEADER: :dir src > >> >> #+HEADER: :cmdline -classpath ./rxjava-1.3.8.jar:. > >> >> #+HEADER: :cmpflag -classpath ./rxjava-1.3.8.jar > >> >> #+BEGIN_SRC java :results output code > >> >> import rx.Observable; > >> >> public class Main { > >> >> public static void main(String[] args) { > >> >> Observable.range(5, 5) > >> >> .subscribe(System.out::println); > >> >> } > >> >> } > >> >> #+END_SRC > >> >> > >> >> > >> >> > >> >> > >> >> ian martins writes: > >> >> > >> >> > I noticed that the tests didn't run with "make test." This updates > the > >> >> > patch so that they can. I didn't add java to the list of default > >> >> languages > >> >> > because the java tests are slow. > >> >> > > >> >> > On Mon, Oct 5, 2020 at 9:23 AM ian martins wrote: > >> >> > > >> >> >> I wrote those examples in an org file so I could test as I wrote > >> them, > >> >> and > >> >> >> then exported it to make it more readable, but the export > resulted in > >> >> >> source block headers being lost. Here is the same without export: > >> >> >> ---- > >> >> >> * Changes > >> >> >> > >> >> >> - support for functional mode (~:results value~) > >> >> >> - accept variables > >> >> >> - don't require package, class, and main definitions > >> >> >> - write source and result tempfiles to > >> ~org-babel-temporary-directory~, > >> >> >> but respects the ~:dir~ header > >> >> >> - work with tramp > >> >> >> > >> >> >> * Examples > >> >> >> ** Example 1 > >> >> >> This outputs "hello." If class and main definitions aren't given > the > >> >> >> code block will be wrapped in generic ones. > >> >> >> > >> >> >> #+begin_src java :results output silent > >> >> >> System.out.print("hello"); > >> >> >> #+end_src > >> >> >> > >> >> >> This is exactly equivalent: > >> >> >> > >> >> >> #+begin_src java :results output silent > >> >> >> public class Main { > >> >> >> public static void main(String[] args) { > >> >> >> System.out.print("hello"); > >> >> >> } > >> >> >> } > >> >> >> #+end_src > >> >> >> > >> >> >> ** Example 2 > >> >> >> This also outputs "hello." > >> >> >> > >> >> >> #+begin_src java :results value silent > >> >> >> return "hello"; > >> >> >> #+end_src > >> >> >> > >> >> >> ** Example 3 > >> >> >> This generates the class "Example" in the package "org.orgmode" in > >> the > >> >> >> current directory. > >> >> >> > >> >> >> #+begin_src java :results output silent :classname > >> org.orgmode.Example > >> >> >> :dir . > >> >> >> System.out.print("hello, org-mode"); > >> >> >> #+end_src > >> >> >> > >> >> >> ** Example 4 > >> >> >> The "Hey" class defines a static method but no main. C-c C-c on > the > >> >> >> "Hey" source block will write "./org/orgmode/Hey.java" and compile > >> it. > >> >> >> > >> >> >> The "Main" class calls the "Hey" class. C-c C-c on the "Main" > source > >> >> >> block will write "./org/orgmode/Main.java" and compile and run it. > >> >> >> > >> >> >> #+begin_src java :results output silent :dir . > >> >> >> package org.orgmode; > >> >> >> > >> >> >> public class Hey { > >> >> >> public static String say() { > >> >> >> return "hey"; > >> >> >> } > >> >> >> } > >> >> >> #+end_src > >> >> >> > >> >> >> #+begin_src java :results output silent :dir . > >> >> >> package org.orgmode; > >> >> >> > >> >> >> public class Main { > >> >> >> public static void main(String[] args) { > >> >> >> System.out.print(Hey.say()); > >> >> >> } > >> >> >> } > >> >> >> #+end_src > >> >> >> > >> >> >> Instead of C-c C-c, we could have added tangle headers and written > >> the > >> >> >> source files out by tangling. > >> >> >> > >> >> >> ** Example 5 > >> >> >> This prints the variable from the header > >> >> >> > >> >> >> #+begin_src java :var msg="hello, org-mode" :results output silent > >> >> >> System.out.print(msg); > >> >> >> #+end_src > >> >> >> > >> >> >> ** Example 6 > >> >> >> This prints "hello, org-mode." The table is provided to the method > >> as a > >> >> >> list of lists. > >> >> >> > >> >> >> #+name: table > >> >> >> | message | hello, org-mode | > >> >> >> > >> >> >> #+begin_src java :var tbl=table :results output silent > >> >> >> System.out.print(tbl.get(0).get(1)); > >> >> >> #+end_src > >> >> >> > >> >> >> ** Example 7 > >> >> >> This example returns a list. > >> >> >> > >> >> >> Note that you're allowed to specify imports without defining the > >> class > >> >> >> or main methods. > >> >> >> > >> >> >> #+begin_src java :results value :exports both > >> >> >> import java.util.Arrays; > >> >> >> > >> >> >> return Arrays.asList("message", "hello, org-mode"); > >> >> >> #+end_src > >> >> >> > >> >> >> #+RESULTS: > >> >> >> | message | hello, org-mode | > >> >> >> > >> >> >> On Mon, Oct 5, 2020 at 8:35 AM ian martins wrote: > >> >> >> > >> >> >>> 1 Changes > >> >> >>> ========= > >> >> >>> > >> >> >>> - support for functional mode (`:results value') > >> >> >>> - accept variables > >> >> >>> - don't require package, class, and main definitions > >> >> >>> - write source and result tempfiles to > >> >> >>> `org-babel-temporary-directory', but respects the `:dir' > header > >> >> >>> - work with tramp > >> >> >>> > >> >> >>> > >> >> >>> 2 Examples > >> >> >>> ========== > >> >> >>> Some examples follow. See the tests for more examples. I'll > write > >> >> >>> proper docs after review. > >> >> >>> > >> >> >>> 2.1 Example 1 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This outputs "hello." If class and main definitions aren't > given > >> the > >> >> >>> code block will be wrapped in generic ones. > >> >> >>> > >> >> >>> ,---- > >> >> >>> | System.out.print("hello"); > >> >> >>> `---- > >> >> >>> > >> >> >>> This is exactly equivalent: > >> >> >>> > >> >> >>> ,---- > >> >> >>> | public class Main { > >> >> >>> | public static void main(String[] args) { > >> >> >>> | System.out.print("hello"); > >> >> >>> | } > >> >> >>> | } > >> >> >>> `---- > >> >> >>> > >> >> >>> > >> >> >>> 2.2 Example 2 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This also outputs "hello." > >> >> >>> > >> >> >>> ,---- > >> >> >>> | return "hello"; > >> >> >>> `---- > >> >> >>> > >> >> >>> > >> >> >>> 2.3 Example 3 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This generates the class "Example" in the package > "org.orgmode" in > >> >> the > >> >> >>> current directory. > >> >> >>> > >> >> >>> ,---- > >> >> >>> | System.out.print("hello, org-mode"); > >> >> >>> `---- > >> >> >>> > >> >> >>> > >> >> >>> 2.4 Example 4 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> The "Hey" class defines a static method but no main. C-c C-c on > >> the > >> >> >>> "Hey" source block will write "./org/orgmode/Hey.java" and > compile > >> >> it. > >> >> >>> > >> >> >>> The "Main" class calls the "Hey" class. C-c C-c on the "Main" > >> source > >> >> >>> block will write "./org/orgmode/Main.java" and compile and run > it. > >> >> >>> > >> >> >>> ,---- > >> >> >>> | package org.orgmode; > >> >> >>> | > >> >> >>> | public class Hey { > >> >> >>> | public static String say() { > >> >> >>> | return "hey"; > >> >> >>> | } > >> >> >>> | } > >> >> >>> `---- > >> >> >>> > >> >> >>> ,---- > >> >> >>> | package org.orgmode; > >> >> >>> | > >> >> >>> | public class Main { > >> >> >>> | public static void main(String[] args) { > >> >> >>> | System.out.print(Hey.say()); > >> >> >>> | } > >> >> >>> | } > >> >> >>> `---- > >> >> >>> > >> >> >>> Instead of C-c C-c, we could have added tangle headers and > written > >> >> the > >> >> >>> source files out by tangling. > >> >> >>> > >> >> >>> > >> >> >>> 2.5 Example 5 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This prints the variable from the header > >> >> >>> > >> >> >>> ,---- > >> >> >>> | System.out.print(msg); > >> >> >>> `---- > >> >> >>> > >> >> >>> > >> >> >>> 2.6 Example 6 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This prints "hello, org-mode." The table is provided to the > >> method as > >> >> >>> a list of lists. > >> >> >>> > >> >> >>> message hello, org-mode > >> >> >>> > >> >> >>> ,---- > >> >> >>> | System.out.print(tbl.get(0).get(1)); > >> >> >>> `---- > >> >> >>> > >> >> >>> > >> >> >>> 2.7 Example 7 > >> >> >>> ~~~~~~~~~~~~~ > >> >> >>> > >> >> >>> This example returns a list. > >> >> >>> > >> >> >>> Note that you're allowed to specify imports without defining > the > >> >> class > >> >> >>> or main methods. > >> >> >>> > >> >> >>> ,---- > >> >> >>> | import java.util.Arrays; > >> >> >>> | > >> >> >>> | return Arrays.asList("message", "hello, org-mode"); > >> >> >>> `---- > >> >> >>> > >> >> >>> message hello, org-mode > >> >> >>> > >> >> >> > >> >> > >> >