## Customization
The java2python compiler defers a significant amount of its processing to
handlers defined within configuration files. These configuration files,
directories, and modules are supplied to the `j2py` script on the command
line. See the [usage][] page for instructions on specifying additional configs.
The default configuration module is `java2python.config.default`. Refer to
[the source of that module][1] for details and additional descriptions.
### Usage
To change the behavior of some or all of these config items, create a Python
file, define in it the items you want, and specify that file when invoking
`j2py`.
For example, if you would like to change the comment prefix to `##`, you might
do this:
$ echo "indentPrefix = '##'" >> ./myconfig.py
Then run the script:
$ j2py SomeJavaSource.java -c ./myconfig.py
The config files are Python modules, so you can use the full power of Python
when writing them.
### Defaults
Many of the defaults are built using values imported from the
`java2python.mod.basic` module. Refer to the [source of that module][2] for
details. The `java2python.mod` subpackage contains other modules with
additional config handlers.
### A Note About Some of the Names: Prologue, Base, Head, and Epilogue
When a config point has `Prologue` in its name, it means that the item will be
responsible for generating code before the output. For example, method
prologue handlers generate decorators, while module prologue handlers generate
the shebang line.
When a config point has `Base` in the name, it means that the item will be
responsible for generating the base classes of a class, enum, or interface.
A config point with `Head` in the name means that the item will be responsible
for generating code for the section between the declaration and the body of the
item. For example:
class X(object):
""" this is a comment generated by classHeadHandlers """
Finally, when a config point contains `Epilogue`, it means that the item will
be responsible for generating code after the body of the item. The only
recognized epilogue config point is `moduleEpilogueHandlers`, which (by
default) generates a main script stanza if necessary.
### Override vs. Replace
Many of the config handlers in the default config module are lists or
dictionaries. It may be desirable for your project to supplement or modify
these instead of changing them completely. For example, you could add a module
prologue handler to the existing values. To do so, you would do something like this
in your config:
from java2python.config.default import modulePrologueHandlers
def myPrologue(module):
...
modulePrologueHandlers.append(myPrologue)
Values can be removed in a similar way:
from java2python.config.default import modulePrologueHandlers
from java2python.mod import basic
modulePrologueHandlers.remove(basic.shebangLine)
In other cases, you can simply redefine the config value altogether:
classHeadHandlers = [myCustomDocStringGenerator]
### Customization Points
The remainder of this page lists the recognized config points, their meaning,
and their default values.
#### indentPrefix
Leading indent character or characters. Four spaces are the default because
that is the recommendation of [PEP 8][].
Default: ` ` (four spaces)
#### commentPrefix
Prefix character or characters for comments. The hash+space is recommended by
[PEP 8][].
Default: `# ` (hash + space)
#### expressionVariableNamingHandler
When the compiler needs to make up a variable name (for example, to emulate
assignment expressions), it calls this handler to produce a new one.
Default: `basic.globalNameCounter`
#### modulePrologueHandlers
These values are strings or generators that yield strings for a module
prologue.
Default:
```
[basic.shebangLine,
basic.simpleDocString,
basic.maybeBsr,
basic.maybeSyncHelpers
]
```
#### moduleEpilogueHandlers
These generators yield lines for a module epilogue.
Default: `[basic.scriptMainStanza]`
#### moduleOutputHandlers
These generators yield (possibly modified) source strings for a module. The
default handler uses values defined elsewhere in the config, e.g.,
`moduleOutputSubs`.
Default: `[basic.outputSubs]`
#### modulePackageDeclarationHandler
This config item is called to handle package declarations. The default handler simply
turns those declarations into comments.
Default: `basic.commentedPackages`
#### moduleImportDeclarationHandler
This config item is called to handle import statements. The default handler
transforms the import statements into Python imports.
Default: `basic.simpleImports`
#### moduleOutputSubs
Mapping of input/output regular expressions used during the final pass of
source generation.
Default: refer to the [java2python.config.default][1] module.
#### classHeadHandlers
These generators yield doc values for the head of classes.
Default: `[basic.simpleDocString]`
#### classBaseHandlers
These generators yield the base types (as strings) for classes.
Default: `[basic.defaultBases]`
#### classPostWalkHandlers
These handlers are called with each class object after it has been completely
constructed.
Default: `[]`
#### interfaceBaseHandlers
These generators yield the base types (as strings) for interfaces.
Default: `[basic.defaultBases]`
#### interfaceHeadHandlers
These generators yield doc values for the head of interfaces.
Default: `[basic.simpleDocString, '__metaclass__ = ABCMeta']`
#### enumHeadHandlers
These generators yield doc values for the head of enums.
Default: `[basic.simpleDocString]`
#### enumValueHandler
This handler is responsible for creating enum values on classes after they've
been defined.
Default: `basic.enumConstStrings`
#### methodParamHandlers
This handler is responsible for constructing method parameters.
Default: `[basic.defaultParams]`
#### methodLockFunctionName
This is the name of the callable used to construct locks for an object with the
synchronized keyword.
Default: `'lock_for_object'`
#### methodHeadHandlers
These generators yield values for the head of classes.
Default: `[basic.simpleDocString]`
#### methodPrologueHandlers
These generators yield values for the module prologue.
Default:
```
[basic.maybeAbstractMethod,
basic.maybeClassMethod,
basic.maybeSynchronizedMethod,
basic.overloadedClassMethods,
]
```
#### astTransforms
The AST transformer uses these declarations to modify an AST before compiling
it to Python source.
Default: refer to the [java2python.config.default][1] module.
#### typeSubs
Many Java identifiers have a 1:1 relationship with Python identifiers, and this
mapping is used to convert them when found. Note that this mapping is now
unnecessary and will be folded into the `astTransforms` sequence in future
releases.
[1]: https://github.com/natural/java2python/blob/master/java2python/config/default.py
[2]: https://github.com/natural/java2python/blob/master/java2python/mod/basic.py
[PEP 8]: http://www.python.org/dev/peps/pep-0008/
[usage]: https://github.com/natural/java2python/tree/master/doc/usage.md