====== Constructs in the component model ====== They are associated or derived from one or several annotations in the code The definitions changed from the version designed in Prague ([[projects:econet:materials:old_annotations|previous version]]) *Support for multiple sources was added via arrays *Some annotations were split between targets in order to reduce ambiguity ===== Component - Class Relation ===== /** * One or more Java classes can be assigned to a single component. Such an * assignment is specified by this annotation. */ @Target(ElementType.TYPE) public @interface InComponent { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing component * Names which the annotated class is assigned to. If a single * source declares the class to participate in several components, * its entry should be a comma-separated list of component name */ String[] componentName(); } ===== Entry points ===== /** * This class is the first instantiated and is responsible (its constructor) for * the instantiation and initialization of the component’s content. */ @Target(ElementType.TYPE) // Should be just a class public @interface InitClass { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing component * Names for which the annotated class provides the initialization. * If a single source declares the class to participate in several * components, its entry should be a comma-separated list of * component name */ String[] componentName(); } /** * The component content is instantiated and initialized by a method ( it can be * a constructor, a static method or an initialization method to be called after * the default constructor). */ @Target( { ElementType.CONSTRUCTOR, ElementType.METHOD }) public @interface InitMethod { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing component * Names for which the annotated method provides the initialization. * */ String[] componentName(); } ===== Interfaces ===== ==== Provided ==== /** * In Java sources, a provided interface might be in a form of a class * attribute. The attribute stores a reference to a class implementing the * provided interface. * */ @Target(ElementType.FIELD) public @interface Provided { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing the name * of the interface represented by this field */ String[] modelIfaceName(); } /** * All methods of the specified Java interface (which the annotated class has to * implement) are marked as a part of the provided interface of the component * */ @Target(ElementType.TYPE) public @interface ProvidedIf { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing the name * of the component interface represented by this type */ String[] modelIfaceName(); /** * @return the array (one entry per annotation source) containing the name * of the java interface which is defining one component Interface * If a single source declares to participate in several components, * its entry should be a comma-separated list of java interface * names (for instance {"ActionListener,WindowListener"} */ String[] javaIfaceName() default { "" }; } /** * The method is a part of the provided interface of the component * */ @Target(ElementType.METHOD) public @interface ProvidedMethod { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing the name * of the component interface which the annotated method is part of. * If a single source declares to the method participate in several * interfaces, its entry should be a comma-separated list of * interface names */ String[] modelIfaceName(); } ==== Required ==== /** * In Java sources, a required interface is present in a form of a class * attribute. The attribute stores a reference to another component, whose * provided interface is bound to this required interfaces. Therefore, the * target of the annotation for required interface is an attribute of a Java * class */ @Target(ElementType.FIELD) public @interface Required { /** * @return the array of sources for this annotation */ String[] annotationSrc(); /** * @return the array (one entry per annotation source) containing the name * of the interface represented by this field */ String[] modelIfaceName(); } ===== Business elements ===== /** * all the instances of such type are important for a component behaviour. */ @Target(ElementType.TYPE) public @interface BusinessType { /** * @return the array of sources for this annotation */ String[] annotationSrc(); } /** * Marks particular Java class attributes as important for business logic. */ @Target(ElementType.FIELD) public @interface BusinessField { /** * @return the array of sources for this annotation */ String[] annotationSrc(); } /** * Marks particular method parameter as important for business logic. * */ @Target(ElementType.PARAMETER) public @interface BusinessParameter { /** * @return the array of sources for this annotation */ String[] annotationSrc(); }