# Struts 2 Convention plugin
This plugin allows to use _convention over configuration_ approach instead of configuring everything using `struts.xml`.
You will find more details in [documentation](https://struts.apache.org/plugins/convention/).

## Installation
Just drop this plugin JAR into `WEB-INF/lib` folder or add it as a Maven dependency.

## Design

### Action with no annotations (all the default handlings)

Action name is class name.

Action package is based on the either any Namespace annotations on the class or Java package the
action class is defined in or the Java package name and the root Java package, which is determined
based on the package locators or the action package list. In either case, a root package is
identified and the namespace is the packages below the root up to and including the package that
contains the action class.

Action method is execute in all cases.

Results are built first from the Result annotations at the class level. Next, they are built from
the resources available in the web application and in the classpath based on the result location,
namespace of the action and action name (not anything to do with the code element names). Results
are found for common result codes including, success, error, input, failure, etc. If a specific
result doesn't exist using the result code then just the action namespace and action name are used to
locate results. If there are still no results found, than a redirect is added back to the index
action for the namespace, if one exists.

### Action with Action(s) annotations

If the annotation is located on any method other than execute, than the action configuration built
from the annotation is in addition to the action configuration built using the default. Unless there
is an annotation that contains no value, in which case, the method that annotation is defined for
becomes the default action method. If the annotation is defined on the execute method, regardless of
the value of the annotation, no default configuration is built for the class.

If multiple annotations have no value, an error should occur.
If multiple annotations have the same value, an error should occur.

Action name is taken from the annotation value. If the value is empty, the default action name
is used.

Action package is taken from the annotation value. If the annotation value doesn't start with a slash
character, the default action namespace is used.

Action method is always the method that the annotation is defined on.
Results are built first from the array of Results on the Action annotation. Next, they are built
from the class level Result annotations. Lastly, all default results are created. All Results already
created during this process should not be overridden later in the process.
