Function: org-babel-expand-body:java
org-babel-expand-body:java is a byte-compiled function defined in
ob-java.el.gz.
Signature
(org-babel-expand-body:java BODY PARAMS)
Documentation
Expand BODY with PARAMS.
BODY could be a few statements, or could include a full class definition specifying package, imports, and class. Because we allow this flexibility in what the source block can contain, it is simplest to expand the code block from the inside out.
Source Code
;; Defined in /usr/src/emacs/lisp/org/ob-java.el.gz
(defun org-babel-expand-body:java (body params)
"Expand BODY with PARAMS.
BODY could be a few statements, or could include a full class
definition specifying package, imports, and class. Because we
allow this flexibility in what the source block can contain, it
is simplest to expand the code block from the inside out."
(let* ((fullclassname (or (cdr (assq :classname params)) ; class and package
(org-babel-java-find-classname body)))
(classname (car (last (split-string fullclassname "\\.")))) ; just class name
(packagename (if (string-match-p "\\." fullclassname) ; just package name
(file-name-base fullclassname)))
(var-lines (org-babel-variable-assignments:java params))
(imports-val (assq :imports params))
(imports (if imports-val
(split-string (org-babel-read (cdr imports-val) nil) " ")
nil))
(prologue (cdr (assq :prologue params)))
(epilogue (cdr (assq :epilogue params))))
(with-temp-buffer
(when prologue (insert prologue "\n"))
(insert body)
(when epilogue (insert "\n" epilogue))
;; wrap main. If there are methods defined, but no main method
;; and no class, wrap everything in a generic main method.
(goto-char (point-min))
(when (and (not (re-search-forward org-babel-java--main-re nil t))
(not (re-search-forward org-babel-java--any-method-re nil t)))
(org-babel-java--move-past org-babel-java--package-re) ; if package is defined, move past it
(org-babel-java--move-past org-babel-java--imports-re) ; if imports are defined, move past them
(insert "public static void main(String[] args) {\n")
(indent-code-rigidly (point) (point-max) 4)
(goto-char (point-max))
(insert "\n}"))
;; wrap class. If there's no class, wrap everything in a
;; generic class.
(goto-char (point-min))
(when (not (re-search-forward org-babel-java--class-re nil t))
(org-babel-java--move-past org-babel-java--package-re) ; if package is defined, move past it
(org-babel-java--move-past org-babel-java--imports-re) ; if imports are defined, move past them
(insert (concat "\npublic class " (file-name-base classname) " {\n"))
(indent-code-rigidly (point) (point-max) 4)
(goto-char (point-max))
(insert "\n}"))
(goto-char (point-min))
;; insert variables from source block headers
(when var-lines
(goto-char (point-min))
(org-babel-java--move-past org-babel-java--class-re) ; move inside class
(insert (mapconcat 'identity var-lines "\n"))
(insert "\n"))
;; add imports from source block headers
(when imports
(goto-char (point-min))
(org-babel-java--move-past org-babel-java--package-re) ; if package is defined, move past it
(insert (mapconcat (lambda (package) (concat "import " package ";")) imports "\n") "\n"))
;; add package at the top
(goto-char (point-min))
(when (and packagename (not (re-search-forward org-babel-java--package-re nil t)))
(insert (concat "package " packagename ";\n")))
;; return expanded body
(buffer-string))))