de.japkit.metaannotations.Constructor Maven / Gradle / Ivy
Show all versions of japkit-annotations Show documentation
package de.japkit.metaannotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import javax.lang.model.element.Modifier;
/**
* Annotation to add a method to a generated class.
*
* @author stefan
*
*/
@Target(ElementType.CONSTRUCTOR)
public @interface Constructor {
/**
* When the annotated annotation wants to override annotation values of the
* Method annotation, it must use this prefix.
*
* @return
*/
String _prefix() default "";
/**
* An expression to determine the source object for generating this element.
* The source element is available as "src" in expressions and is used in
* matchers and other rules. If the src expression is not set, the src
* element of the parent element is used (usually the enclosing element).
*
* If this expression results in an Iterable, each object provided by the
* Iterator is use as source object. That is, the element is generated
* multiple times, once for each object given by the iterator.
*
* @return
*/
String src() default "";
/**
* As an alternative to the src expression, a function can be called to determine the source object.
*
* @return
*/
Class>[] srcFun() default {};
/**
* A filter expression to be applied to src in case it is a collection. Must be boolean.
* The variable name for the current collection element to be filtered is "src".
* @return
*/
String srcFilter() default "";
/**
* As an alternative to srcFilter, one or more boolean functions can be called.
* Only if the conjunction of their results is true, the rule is applied for the considered element of the src collection.
*
* @return
*/
Class>[] srcFilterFun() default {};
/**
* An expression to be applied to the result of the expression or function(s) in case it is a collection. It's applied to each element.
* The variable name for the current collection element is "src". Collect is applied after filtering.
*
* @return
*/
String srcCollect() default "";
/**
* As an alternative or additionally to the collect expression, one or more functions can be called.
* In case of more than one function, they are called in a "fluent" style. That is each one is applied to the result of the previous one.
* The first function is always applied to the result of the collect expression or to the current collection element if collect expression is empty.
*
* @return
*/
Class>[] srcCollectFun() default {};
/**
* If true, and src is a collection, it is transformed to a LinkedHashSet to remove duplicates while preserving order.
*
* @return
*/
boolean srcToSet() default false;
/**
* If src is a collection, and srcGroupBy and / or srcGroupByFun are set, the collection elements are grouped as a map, where
* the keys are the results of applying srcGroupBy and / or srcGroupByFun to the collection elements and the values are lists
* of collection elements with same key. SrcGroupBy is an expression and srcGroupByFun is a list of functions.
* They are applied in a fluent style (like src.srcGroupBy().srcGroupByFun[0]().srcGroupByFun[1]()...).
*
* @return the expression to derive the key from a collection element. The collection element is provided as "src".
*/
String srcGroupBy() default "";
/**
* If src is a collection, and srcGroupBy and / or srcGroupByFun are set, the collection elements are grouped as a map, where
* the keys are the results of applying srcGroupBy and / or srcGroupByFun to the collection elements and the values are lists
* of collection elements with same key. SrcGroupBy is an expression and srcGroupByFun is a list of functions.
* They are applied in a fluent style (like src.srcGroupBy().srcGroupByFun[0]().srcGroupByFun[1]()...).
*
* @return function(s) to derive the key from a collection element. The collection element is provided as "src".
*/
Class>[] srcGroupByFun() default {};
/**
*
* @return the language of the src expression. Defaults to Java EL.
*/
String srcLang() default "";
/**
* By default, the current source object has the name "src" on the value stack.
* If this annotation value is set, the source object will additionally provided under the given name.
*
* @return the name of the source variable
*/
String srcVar() default "";
/**
* EL Variables within the scope of the method.
*
* @return
*/
Var[] vars() default {};
/**
* By default, this rule is active.
* To switch it on or of case by case, a boolean expression can be used here.
*
* @return
*/
String cond() default "";
/**
* The expression language for the cond expression.
* @return
*/
String condLang() default "";
/**
* As an alternative to the cond expression, a boolean function can be called.
*
* @return
*/
Class>[] condFun() default {};
/**
*
* @return the modifiers of the method
*/
Modifier[] modifiers() default {};
/**
* How to map annotations of the source element (???) to the method
*
*
* @return the annotation mappings
*/
Annotation[] annotations() default {};
/**
*
* @return the parameters of the method
*/
Param[] parameters() default {};
/**
* Classes to imported for the method body. Allows to use short class names
* in the body expr. The imports are only added if they don't conflict with
* others. Otherwise, it's an error. TODO: Instead of an error , we could
* replace the short name in the body by the fqn.
*
* @return
*/
Class>[] imports() default {};
/**
* If the body shall contain some repetitive code, this expression can be
* used. It determines how often to repeat bodyExpr. The iteration variable
* is provided as "src" on the value stack (and thus hides the source object given by the src annotation value).
*
* A typical example is to iterate over the properties of the class, to
* generate methods like toString or equals / hashcode.
*
*
* @return
*/
String bodyIterator() default "";
/**
*
* @return the language of the body iterator expression. Default is Java EL.
*/
String bodyIteratorLang() default "";
/**
*
* @return an expression to generate the body.
*/
String bodyCode() default "";
/**
* If there is at least one of the given cases, where all matcher match, the according expression is use instead of bodyExpr.
* If no case matches, the default is bodyExpr.
*
* @return
*/
Case[] bodyCases() default{};
/**
*
* @return if bodyIterator is set, this code is inserted between each
* iteration of bodyExpr.
*/
String bodySeparator() default "";
/**
* If true, a linebreak is inserted after the "before expression", the "body expression" and the "after expression".
* @return
*/
boolean bodyLinebreak() default true;
boolean bodyIndentAfterLinebreak() default false;
/**
*
* @return an expression for the code to be generated before the repetitive
* bodyCode. Only rendered, if the iterator expression is set and
* does not result in an empty iterator.
*/
String bodyBeforeIteratorCode() default "";
/**
*
* @return an expression for the code to be generated after the repetitive
* bodyCode. Only rendered, if the iterator expression is set and
* does not result in an empty iterator.
*/
String bodyAfterIteratorCode() default "";
/**
*
* @return an expression for the code to be generated if the iterator
* expression is set but does result in an empty iterator.
*/
String bodyEmptyIteratorExpr() default "";
/**
*
* @return the language of the body expression. Default is Java EL.
*/
String bodyLang() default "";
/**
*
* @return names of the fragments to surround the generated code body.
*/
String[] surroundingFragments() default{};
/**
*
* @return names of the fragments to be inserted before the generated code body.
*/
String[] beforeFragments() default{};
/**
*
* @return names of the fragments to be inserted before the generated code body.
*/
String[] afterFragments() default{};
/**
*
* @return true means to copy the JavaDoc comment from the rule source element
*/
boolean commentFromSrc() default false;
/**
*
* @return an expression to create the JavaDoc comment
*/
String commentExpr() default "";
/**
*
* @return the expression language for commentExpr
*/
String commentLang() default "";
/**
* If dependent members are created, the generated field by default becomes the src element for the according rules.
* If the original src shall be used instead, set this AV to false.
* @return
*/
boolean genElementIsSrcForDependentRules() default true;
}