Original spec added (#69)
diff --git a/pom.xml b/pom.xml
index 311602d..e2520fd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.eclipse.ee4j</groupId>
<artifactId>project</artifactId>
- <version>1.0.5</version>
+ <version>1.0.6</version>
</parent>
<groupId>jakarta.annotation</groupId>
diff --git a/spec/src/main/asciidoc/annotations-spec.adoc b/spec/src/main/asciidoc/annotations-spec.adoc
index 2c417eb..fea5dd1 100644
--- a/spec/src/main/asciidoc/annotations-spec.adoc
+++ b/spec/src/main/asciidoc/annotations-spec.adoc
@@ -26,3 +26,7 @@
// == Scope
:sectnums:
include::scope.adoc[]
+
+// == Spec
+:sectnums:
+include::spec.adoc[]
diff --git a/spec/src/main/asciidoc/images/annotations-10.png b/spec/src/main/asciidoc/images/annotations-10.png
new file mode 100644
index 0000000..191893b
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-10.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-3.png b/spec/src/main/asciidoc/images/annotations-3.png
new file mode 100644
index 0000000..ae10fab
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-3.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-4.png b/spec/src/main/asciidoc/images/annotations-4.png
new file mode 100644
index 0000000..191893b
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-4.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-5.png b/spec/src/main/asciidoc/images/annotations-5.png
new file mode 100644
index 0000000..ef59b76
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-5.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-6.png b/spec/src/main/asciidoc/images/annotations-6.png
new file mode 100644
index 0000000..ae10fab
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-6.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-7.png b/spec/src/main/asciidoc/images/annotations-7.png
new file mode 100644
index 0000000..191893b
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-7.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-8.png b/spec/src/main/asciidoc/images/annotations-8.png
new file mode 100644
index 0000000..ef59b76
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-8.png
Binary files differ
diff --git a/spec/src/main/asciidoc/images/annotations-9.png b/spec/src/main/asciidoc/images/annotations-9.png
new file mode 100644
index 0000000..ae10fab
--- /dev/null
+++ b/spec/src/main/asciidoc/images/annotations-9.png
Binary files differ
diff --git a/spec/src/main/asciidoc/spec.adoc b/spec/src/main/asciidoc/spec.adoc
new file mode 100644
index 0000000..1fe3753
--- /dev/null
+++ b/spec/src/main/asciidoc/spec.adoc
@@ -0,0 +1,1921 @@
+== Jakarta Annotations Specification, Version 1.3
+
+Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved.
+
+Oracle and Java are registered trademarks of Oracle and/or its
+affiliates. Other names may be trademarks of their respective owners.
+
+===
+
+image:annotations-3.png[image]
+
+Introduction
+
+image:annotations-4.png[image]
+
+With the addition of JSR 175 (A Metadata
+Facility for the JavaTM Programming Language) in the Java platform we
+envision that various technologies will use annotations to enable a
+declarative style of programming. It would be unfortunate if these
+technologies each independently defined their own annotations for common
+concepts. It would be valuable to have consistency within the Java EE
+and Java SE component technologies, but it will also be valuable to
+allow consistency between Java EE and Java SE.
+
+It is the intention of this specification to
+define a small set of common annotations that will be available for use
+within other specifications. It is hoped that this will help to avoid
+unnecessary redundancy or duplication between annotations defined in
+different Java Specification Requests (JSR). This would allow us to have
+the common annotations all in one place and let the technologies refer
+to this specification rather than have them specified in multiple
+specifications. This way all technologies can use the same version of
+the annotations and there will be consistency in the annotations used
+across the platforms.
+
+===
+
+image:annotations-5.png[image]
+
+Goals
+
+Define annotations for use in Java EE: This
+JSR will define annotations for use within component technologies in
+Java EE as well as the platform as a whole.
+
+Define annotations for use in future revisions
+of Java SE: This JSR will define annotations for use in JSRs targeted
+for Java SE as well as future revisions of Java SE.
+
+
+
+===
+
+image:annotations-5.png[image]
+
+Non-Goals
+
+Support for Java versions prior to J2SE 5.0
+
+Annotations were introduced in J2SE 5.0. It
+is not possible to do annotation processing in versions prior to J2SE
+5.0. It is not a goal of this specification to define a way of doing
+annotation processing of any kind for versions prior to J2SE 5.0.
+
+===
+
+image:annotations-5.png[image]
+
+Compatibility
+
+The annotations defined in this specification
+may be included individually as needed in products that make use of
+them. Other Java specifications will require support for subsets of
+these annotations. Products that support these Java specifications must
+include the required annotations.
+
+===
+
+image:annotations-5.png[image]
+
+Conventions
+
+The keywords ‘MUST’, ‘MUST NOT’, ‘REQUIRED’,
+‘SHALL’, ‘SHALL NOT’, ‘SHOULD’, ‘SHOULD NOT’, ‘RECOMMENDED’, ‘MAY’ AND
+‘OPTIONAL’ in this document are to be interpreted as described in RFC
+2119.
+
+
+
+Java code is formatted as shown below in
+figure 1.1:
+
+Figure 1.1 Example Java code
+
+package com.wombat.hello;
+
+public class Hello \{
+
+ public static void main(String[] args) \{
+
+ System.out.println("Hello world");
+
+ }
+
+}
+
+===
+
+image:annotations-5.png[image]
+
+Expert Group Members
+
+The following expert group members
+participated in JSR 250:
+
+Cedric Beust (individual)
+
+Bill Burke (JBoss)
+
+Wayne Carr (Intel)
+
+Robert Clevenger (Oracle)
+
+Evan Ireland (Sybase)
+
+Woo Jin Kim (Tmax Soft)
+
+Gavin King (JBoss)
+
+Rajiv Mordani (Oracle Corporation,
+Specification lead)
+
+Ted Neward (individual)
+
+Anurag Parashar (Pramati technologies)
+
+Michael Santos (individual)
+
+Hani Suleiman (Ironflare AB)
+
+Seth White (BEA)
+
+===
+
+image:annotations-5.png[image]
+
+Acknowledgements
+
+In addition to the expert group listed above,
+Linda DeMichiel, Ron Monzillo, Lance Andersen and Bill Shannon all of
+whom work at Oracle Corporation have provided input to this
+specification.
+
+
+
+===
+
+===
+
+image:annotations-6.png[image]
+
+Annotations
+
+image:annotations-7.png[image]
+
+This chapter describes the standard
+annotations, some guidelines for annotation inheritance and the usage of
+these annotations where possible.
+
+===
+
+image:annotations-8.png[image]
+
+General Guidelines for Inheritance of Annotations
+
+The interplay of annotations and inheritance
+in the Java language is potentially a source of complexity for
+developers. Developers will rely on some implicit assumptions when
+figuring out how annotations compose with other language features. At
+the same time, annotation semantics are defined by individual
+specifications, hence the potential for inconsistencies to arise. For
+instance, consider the following example:
+
+
+
+public class Base \{
+
+ @TransactionAttribute(REQUIRES_NEW)
+
+ public void foo \{...}
+
+}
+
+@Stateless
+
+public class Derived extends Base \{
+
+ @TransactionAttribute(NEVER)
+
+ public void foo \{...}
+
+}
+
+
+
+In keeping with the concept of method
+overriding, most developers will assume that in the _Derived_ class, the
+effective _TransactionAttribute_ annotation for method _foo_ is
+_TransactionAttribute(NEVER)_ . On the other hand, it might have been
+possible for the specification governing the semantics of the
+_TransactionAttribute_ annotations type to require that the effective
+_TransactionAttribute_ to be the most restrictive one in the whole
+inheritance tree, that is, in the example above
+_TransactionAttribute(REQUIRES_NEW)_ . A motivation for these semantics
+might have been that the _foo_ method in the _Derived_ class may call
+_super.foo()_ , resulting in the execution of some code that needs a
+transaction to be in place. Such a choice on the part of the
+specification for _TransactionAttribute_ would have contradicted a
+developer’s intuition on how method overriding works.
+
+In order to keep the resulting complexity in
+control, below are some guidelines recommended for how annotations
+defined in the different specifications should interact with
+inheritance:
+
+ Class-level annotations only affect the
+class they annotate and its members, that is, its methods and fields.
+They never affect a member declared by a superclass, even if it is not
+hidden or overridden by the class in question.
+
+In addition to affecting the annotated class,
+class-level annotations may act as a shorthand for member-level
+annotations. If a member carries a specific member-level annotation, any
+annotations of the same type implied by a class-level annotation are
+ignored. In other words, explicit member-level annotations have priority
+over member-level annotations implied by a class-level annotation. For
+example, a _TransactionAttribute(REQUIRED)_ annotation on a class
+implies that all the public methods in the class that it is applied on
+are annotated with _TransactionAttribute(REQUIRED)_ . However if there
+is a _TransactionAttribute(NEVER)_ annotation on a particular method,
+then the _TransactionAttribute(NEVER)_ applies for that particular
+method and not _TransactionAttribute(REQUIRED)_ .
+
+The interfaces implemented by a class never
+contribute annotations to the class itself or any of its members.
+
+Members inherited from a superclass and which
+are not hidden or overridden maintain the annotations they had in the
+class that declared them, including member-level annotations implied by
+class-level ones.
+
+Member-level annotations on a hidden or
+overridden member are always ignored.
+
+This set of guidelines guarantees that the
+effects of an annotation are local to the class on, or inside, which it
+appears. In order to find the effective annotation for a class member, a
+developer has to track down its last non-hidden and non-overridden
+declaration and examine it. If the sought-for annotation is not found
+there, then (s)he will have to examine the enclosing class declaration.
+If even this step fails to provide an annotation, no other source file
+will be consulted.
+
+Below are some examples that explain how the
+guidelines defined above will be applied to the _TransactionAttribute_
+annotation.
+
+
+
+@TransactionAttribute(REQUIRED)
+
+class Base \{
+
+ @TransactionAttribute(NEVER)
+
+ public void foo() \{...}
+
+ public void bar() \{...}
+
+}
+
+
+
+@Stateless
+
+class ABean extends Base \{
+
+ public void foo() \{...}
+
+}
+
+
+
+@Stateless
+
+public class BBean extends Base \{
+
+ @TransactionAttribute(REQUIRES_NEW)
+
+ public void foo() \{...}
+
+}
+
+
+
+@Stateless
+
+@TransactionAttribute(REQUIRES_NEW)
+
+public class CBean extends Base \{
+
+ public void foo() \{...}
+
+ public void bar() \{...}
+
+}
+
+
+
+@Stateless
+
+@TransactionAttribute(REQUIRES_NEW)
+
+public class DBean extends Base \{
+
+ public void bar() \{...}
+
+}
+
+
+
+@Stateless
+
+@TransactionAttribute(REQUIRES_NEW)
+
+public class EBean extends Base \{
+
+}
+
+
+
+The table below shows the effective
+_TransactionAttribute_ annotation in each of the cases above by applying
+the guidelines specified for annotations and inheritance:
+
+
+
+
+
+===
+
+Methods in derived classes
+
+Effective TransactionAttribute value
+
+ _foo() in ABean_
+
+ _TransactionAttribute(REQUIRED). (Default
+TransactionAttribute as defined by the EJB specification)._
+
+ _bar() in ABean_
+
+ _TransactionAttribute(REQUIRED)_
+
+ _foo() in BBean_
+
+ _TransactionAttribute(REQUIRES_NEW)_
+
+ _bar() in BBean_
+
+ _TransactionAttribute(REQUIRED)_
+
+ _foo() in CBean_
+
+ _TransactionAttribute(REQUIRES_NEW)_
+
+ _bar() in CBean_
+
+ _TransactionAttribute(REQUIRES_NEW)_
+
+ _foo() in DBean_
+
+ _TransactionAttribute(NEVER) (from the Base
+class)_
+
+ _bar() in DBean_
+
+ _TransactionAttribute(REQUIRES_NEW)_
+
+ _foo() in EBean_
+
+ _TransactionAttribute(NEVER) (From Base
+class)_
+
+ __
+
+ _bar() in EBean_
+
+ _TransactionAttribute(REQUIRED)(from Base
+class)_
+
+For more details about the
+_TransactionAttribute_ annotation, see the _EJB 3 Core Contracts_
+specification.
+
+All annotations defined in this specification
+follow the guidelines defined above unless explicitly stated otherwise.
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.Generated
+
+The _Generated_ annotation is used to mark
+source code that has been generated. It can be specified on a class,
+method, or field. It can also be used to differentiate user-written code
+from generated code in a single file.
+
+The _value_ element MUST have the name of the
+code generator. The recommended convention is to use the fully qualified
+name of the code generator. For example: _com.company.package.classname_
+.
+
+The _date_ element is used to indicate the
+date the source was generated. The _date_ element MUST follow the ISO
+8601 standard. For example the _date_ element could have the following
+value:
+
+ _2001-07-04T12:08:56.235-0700_
+
+which represents 2001-07-04 12:08:56 local
+time in the U.S. Pacific time zone.
+
+The _comments_ element is a place holder for
+any comments that the code generator may want to include in the
+generated code.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{ANNOTATION_TYPE, CONSTRUCTOR,
+FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE})
+
+@Retention(SOURCE)
+
+public @interface Generated \{
+
+ String[] value();
+
+ String date() default "";
+
+ String comments() default "";
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+Name of the code generator
+
+
+
+ _date_
+
+Date source was generated. MUST follow ISO
+8601 standard
+
+""
+
+ _comments_
+
+placeholder for comments that the generator
+may want to include in the generated code
+
+""
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+
+
+@Generated("com.sun.xml.rpc.AProcessor")
+
+public interface StockQuoteService extends
+java.rmi.Remote \{
+
+ this.context = context;
+
+}
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.Resource
+
+The _Resource_ annotation is used to declare
+a reference to a resource. It can be specified on a class, method, or
+field. When the annotation is applied on a field or method, the
+container will inject an instance of the requested resource into the
+application when the application is initialized. If the annotation is
+applied to a class, the annotation declares a resource that the
+application will look up at runtime. Even though this annotation is not
+marked _Inherited_ , all superclasses MUST be examined to discover all
+uses of this annotation. All such annotation instances specify resources
+that are needed by the application. Note that this annotation may appear
+on private fields and methods of superclasses. Injection of the declared
+resources needs to happen in these cases as well, even if a method with
+such an annotation is overridden by a subclass.
+
+The _name_ element is the JNDI name of the
+resource. When the _Resource_ annotation is applied on a field, the
+default value of the _name_ element is the field name qualified by the
+class name. When applied on a method, the default is the JavaBeans
+property name corresponding to the method qualified by the class name.
+When applied on a class, there is no default and the name MUST be
+specified.
+
+The _type_ element defines the Java type of
+the resource. When the _Resource_ annotation is applied on a field, the
+default value of the _type_ element is the type of the field. When
+applied on a method, the default is the type of the JavaBeans property.
+When applied on a class, there is no default and the type MUST be
+specified. When used, the type MUST be assignment compatible.
+
+The _authenticationType_ element is used to
+indicate the authentication type to use for the resource. It can take
+one of two values defined as an _Enum_ : _CONTAINER_ or _APPLICATION_ .
+This element may be specified for resources representing a connection
+factory of any supported type and MUST NOT be specified for resources of
+other types.
+
+The _shareable_ element is used to indicate
+whether a resource can be shared between this component and other
+components. This element may be specified for resources representing a
+connection factory of any supported type or ORB object instances and
+MUST NOT be specified for resources of other types.
+
+The _mappedName_ element is a
+product-specific name that this resource should be mapped to. The
+_mappedName_ element provides for mapping the resource reference
+specified by the _Resource_ annotation to the name of a resource known
+to the application server. The mapped name could be of any form.
+Application servers are not required to support any particular form or
+type of mapped name, nor the ability to use mapped names. The mapped
+name is product dependent and often installation dependent. No use of
+mapped name is portable.
+
+The _description_ element is the description
+of the resource. The description is expected to be in the default
+language of the system on which the application is deployed. The
+description can be presented to help in choosing the correct resource.
+
+The _lookup_ element specifies the JNDI name
+of a resource that the resource being defined will be bound to. The type
+of the referenced resource must be compatible with that of the resource
+being defined.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{TYPE, METHOD, FIELD})
+
+@Retention(RUNTIME)
+
+@Repeatable(Resources.class)
+
+public @interface Resource \{
+
+ public enum AuthenticationType \{
+
+ CONTAINER,
+
+ APPLICATION
+
+ }
+
+ String name() default "";
+
+ Class<?> type() default Object.class;
+
+ AuthenticationType authenticationType()
+default AuthenticationType.CONTAINER;
+
+ boolean shareable() default true;
+
+ String mappedName() default "";
+
+ String description() default "";
+
+ String lookup() default "";
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _name_
+
+The JNDI name of the resource
+
+ _""_
+
+ _type_
+
+The Java type of the resource
+
+ _Object.class_
+
+ _authenticationType_
+
+The authentication type to use for the
+resource
+
+ _CONTAINER_
+
+ _shareable_
+
+Indicates whether the resource can be shared.
+
+ _true_
+
+ _mappedName_
+
+A product-specific name that the resource
+should map to.
+
+ _""_
+
+ _description_
+
+Description of the resource.
+
+ _""_
+
+ _lookup_
+
+the JNDI name of a resource that the resource
+being defined will be bound to
+
+ _""_
+
+=== Field based injection:
+
+To access a resource a developer declares a
+field and annotates it as being a resource reference. If the name and
+type elements are missing from the annotation they will be inferred by
+looking at the field declaration itself. It is an error if the type
+specified by the _Resource_ annotation and the type of the field are
+incompatible.
+
+For example:
+
+
+
+@Resource
+
+private DataSource myDB;
+
+In the example above the effective name is
+_com.example.class/myDB_ and the effective type is
+_javax.sql.DataSource.class_ .
+
+
+
+@Resource(name="customerDB")
+
+private DataSource myDB;
+
+In the example above the name is _customerDB_
+and the effective type is _javax.sql.DataSource.class_ .
+
+=== Setter based injection:
+
+To access a resource a developer declares a
+setter method and annotates it as being a resource reference. The name
+and type of resource may be inferred by inspecting the method
+declaration if necessary. The name of the resource, if not declared, is
+the name of the JavaBeans property as determined from the name of the
+setter method. The setter method MUST follow the standard JavaBeans
+convention—the name starts with “ _set_ ”; the return type is _void_ ;
+and there is only one parameter. Additionally, the type of the parameter
+MUST be compatible with the _type_ element of the _Resource_ annotation,
+if specified.
+
+For example:
+
+
+
+@Resource
+
+private void setMyDB(DataSource ds) \{
+
+ myDB = ds;
+
+}
+
+private DataSource myDB;
+
+In the example above the effective name is
+_com.example.class/myDB_ and the type is _javax.sql.DataSource.class_ .
+
+
+
+@Resource(name="customerDB")
+
+private void setMyDB(DataSource ds) \{
+
+ myDB = ds;
+
+}
+
+private DataSource myDB;
+
+
+
+In the example above the name is _customerDB_
+and the type is _javax.sql.DataSource.class_ .
+
+The table below shows the mapping from Java
+type to the equivalent resource type in the Java EE 5 (and later)
+deployment descriptors:
+
+
+
+===
+
+[width="100%",cols="50%,50%",options="header",]
+|===
+|Java Type
+|Equivalent Resource type
+|java.lang.String
+|env-entry
+
+|java.lang.Character
+|env-entry
+
+|java.lang.Integer
+|env-entry
+
+|java.lang.Boolean
+|env-entry
+
+|java.lang.Double
+|env-entry
+
+|java.lang.Byte
+|env-entry
+
+|java.lang.Short
+|env-entry
+
+|java.lang.Long
+|env-entry
+
+|java.lang.Float
+|env-entry
+
+|javax.xml.rpc.Service
+|service-ref
+
+|javax.xml.ws.Service
+|service-ref
+
+|javax.jws.WebService
+|service-ref
+
+|javax.sql.DataSource
+|resource-ref
+
+|javax.jms.ConnectionFactory
+|resource-ref
+
+|javax.jms.QueueConnectionFactory
+|resource-ref
+
+|javax.jms.TopicConnectionFactory
+|resource-ref
+
+|javax.mail.Session
+|resource-ref
+
+|java.net.URL
+|resource-ref
+
+|javax.resource.cci.ConnectionFactory
+|resource-ref
+
+|org.omg.CORBA_2_3.ORB
+|resource-ref
+
+|any other connection factory defined by a
+resource adapter |resource-ref
+
+|javax.jms.Queue
+|message-destination-ref
+
+|javax.jms.Topic
+|message-destination-ref
+
+|javax.resource.cci.InteractionSpec
+|resource-env-ref
+
+|javax.transaction.UserTransaction
+|resource-env-ref
+
+|Everything else
+|resource-env-ref
+|===
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.Resources
+
+The _Resource_ annotation is used to declare
+a reference to a resource. The _Resources_ annotation acts as a
+container for multiple resource declarations.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{TYPE})
+
+@Retention(RUNTIME)
+
+public @interface Resources \{
+
+ Resource[] value;
+
+}
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+Container for defining multiple resources.
+
+
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@Resources (\{
+
+ @Resource(name="myDB"
+type=javax.sql.DataSource),
+
+ @Resource(name="myMQ"
+type=javax.jms.ConnectionFactory)
+
+})
+
+public class CalculatorBean \{
+
+ //...
+
+}
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.PostConstruct
+
+The _PostConstruct_ annotation is used on a
+method that needs to be executed after dependency injection is done to
+perform any initialization. This method MUST be invoked before the class
+is put into service. This annotation MUST be supported on all classes
+that support dependency injection. The method annotated with
+_PostConstruct_ MUST be invoked even if the class does not request any
+resources to be injected. Only one method in a given class can be
+annotated with this annotation. The method on which the _PostConstruct_
+annotation is applied MUST fulfill all of the following requirements,
+except in cases where these requirements have been relaxed by another
+specification. See in particular the _Interceptors_ specification.
+
+- The method MUST NOT have any para meters.
+
+- The return type of the method MUST be
+_void_ .
+
+- The method MUST NOT throw a checked
+exception.
+
+- The method on which _PostConstruct_ is
+applied MAY be _public_ , _protected_ , package private or _private_ .
+
+- The method MUST NOT be static except for
+the application client.
+
+- In general, the method MUST NOT be final.
+However, other specifications are permitted to relax this requirement on
+a per-component basis.
+
+- If the method throws an unchecked exception
+the class MUST NOT be put into service.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(METHOD)
+
+@Retention(RUNTIME)
+
+public @interface PostConstruct \{
+
+}
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@Resource
+
+private void setMyDB(DataSource ds) \{
+
+ myDB = ds;
+
+}
+
+
+
+@PostConstruct
+
+private void initialize() \{
+
+ //Initialize the connection object from the
+DataSource
+
+ connection = myDB.getConnection();
+
+}
+
+
+
+private DataSource myDB;
+
+private Connection connection;
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.PreDestroy
+
+The _PreDestroy_ annotation is used on a
+method as a callback notification to signal that the instance is in the
+process of being removed by the container. The method annotated with
+_PreDestroy_ is typically used to release resources that the instance
+has been holding. This annotation MUST be supported by all container
+managed objects that support _PostConstruct_ except the application
+client. The method on which the _PreDestroy_ annotation is applied MUST
+fulfill all of the following requirements, except in cases where these
+requirements have been relaxed by another specification. See in
+particular the _Interceptors_ specification.
+
+
+
+- The method MUST NOT have any para meters.
+
+- The return type of the method MUST be
+_void_ .
+
+- The method MUST NOT throw a checked
+exception.
+
+- The method on which _PreDestroy_ is applied
+MAY be _public_ , _protected_ , package private or _private_ .
+
+- The method MUST NOT be static.
+
+- In general, the method MUST NOT be final.
+However, other specifications are permitted to relax this requirement on
+a per-component basis.
+
+- If the method throws an unchecked exception
+it is ignored.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(METHOD)
+
+@Retention(RUNTIME)
+
+public @interface PreDestroy \{
+
+}
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+
+
+@Resource
+
+private void setMyDB(DataSource ds) \{
+
+ myDB = ds;
+
+}
+
+
+
+@PostConstruct
+
+private void initialize() \{
+
+ //Initialize the connection object from the
+DataSource
+
+ connection = myDB.getConnection();
+
+}
+
+@PreDestroy
+
+private void cleanup() \{
+
+ //Close the connection to the DataSource.
+
+ connection.close();
+
+}
+
+
+
+private DataSource myDB;
+
+private Connection connection;
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.Priority
+
+The _Priority_ annotation can be applied to
+classes or parameters to indicate in what order they should be used. The
+effect of using the _Priority_ annotation in any particular instance is
+defined by other specifications that define the use of a specific class.
+
+For example, the _Interceptors_ specification
+defines the use of priorities on interceptors to control the order in
+which interceptors are called.
+
+Priority values should generally be
+non-negative, with negative values reserved for special meanings such as
+“undefined” or “not specified”. A specification that defines use of the
+_Priority_ annotation may define the range of allowed priorities and any
+priority values with special meaning.
+
+
+
+package javax.annotation;
+
+import java.lang.annotation.*;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+
+
+@Target(\{TYPE, PARAMETER})
+
+@Retention(RUNTIME)
+
+@Documented
+
+public @interface Priority \{
+
+ /**
+
+ * The priority value.
+
+ */
+
+ int value();
+
+}
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.security.RunAs
+
+The _RunAs_ annotation defines the security
+role of the application during execution in a Java EE container. It can
+be specified on a class. This allows developers to execute an
+application under a particular role. The role MUST map to the user /
+group information in the container’s security realm. The _value_ element
+in the annotation is the name of a security role.
+
+
+
+package javax.annotation.security;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(TYPE)
+
+@Retention(RUNTIME)
+
+public @interface RunAs \{
+
+ String value();
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+Security role of the application during
+execution in a Java EE container
+
+
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@RunAs("Admin")
+
+public class Calculator \{
+
+ //....
+
+}
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.security.RolesAllowed
+
+The _RolesAllowed_ annotation specifies the
+security roles permitted to access method(s) in an application. The
+value element of the _RolesAllowed_ annotation is a list of security
+role names.
+
+The _RolesAllowed_ annotation can be
+specified on a class or on method(s). Specifying it at a class level
+means that it applies to all the methods in the class. Specifying it on
+a method means that it is applicable to that method only. If applied at
+both the class and method level, the method value overrides the class
+value.
+
+
+
+package javax.annotation.security;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{TYPE,METHOD})
+
+@Retention(RUNTIME)
+
+public @interface RolesAllowed \{
+
+ String[] value();
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+List of roles permitted to access methods in
+the application
+
+
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@RolesAllowed("Users")
+
+public class Calculator \{
+
+ @RolesAllowed("Administrator")
+
+ public void setNewRate(int rate) \{
+
+ //...
+
+}
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.security.PermitAll
+
+The _PermitAll_ annotation specifies that all
+security roles are allowed to invoke the specified method(s), that is,
+that the specified method(s) are “unchecked”. It can be specified on a
+class or on methods. Specifying it on the class means that it applies to
+all methods of the class. If specified at the method level, it only
+affects that method.
+
+
+
+package javax.annotation.security;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{TYPE,METHOD})
+
+@Retention(RUNTIME)
+
+public @interface PermitAll \{
+
+}
+
+The following example shows the usage of the
+annotation defined above:
+
+import javax.annotation.security.*;
+
+@RolesAllowed("Users")
+
+public class Calculator \{
+
+ @RolesAllowed("Administrator")
+
+ public void setNewRate(int rate) \{
+
+ //...
+
+ }
+
+ @PermitAll
+
+ public long convertCurrency(long amount) \{
+
+ //...
+
+ }
+
+}
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.security.DenyAll
+
+The _DenyAll_ annotation specifies that no
+security roles are allowed to invoke the specified method(s), that is,
+that the method(s) are to be excluded from execution in the Java EE
+container.
+
+
+
+package javax.annotation.security;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(\{TYPE, METHOD})
+
+@Retention(RUNTIME)
+
+public @interface DenyAll \{
+
+}
+
+The following example shows the usage of the
+annotation defined above:
+
+import javax.annotation.security.*;
+
+@RolesAllowed("Users")
+
+public class Calculator \{
+
+ @RolesAllowed("Administrator")
+
+ public void setNewRate(int rate) \{
+
+ //...
+
+ }
+
+ @DenyAll
+
+ public long convertCurrency(long amount) \{
+
+ //...
+
+ }
+
+}
+
+===
+
+image:annotations-8.png[image]
+
+PermitAll, DenyAll and RolesAllowed interactions
+
+The _PermitAll_ , _DenyAll_ and
+_RolesAllowed_ annotations all define which security roles are allowed
+to access the methods on which they are applied. This section describes
+how these annotations interact and which usages of these annotations are
+valid.
+
+If the _PermitAll_ , _DenyAll_ and
+_RolesAllowed_ annotations are applied on methods of a class, then the
+method level annotations take precedence (at the corresponding methods)
+over any class level annotations of type _PermitAll_ , _DenyAll_ and
+_RolesAllowed_ .
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.security.DeclareRoles
+
+The _DeclareRoles_ annotation is used to
+specify security roles used by the application. It can be specified on a
+class. It typically would be used to define roles that could be tested
+(i.e., by calling _isUserInRole_ ) from within the methods of the
+annotated class. It could also be used to declare roles that are not
+implicitly declared as the result of their use in a _RolesAllowed_
+annotation on the class or a method of the class.
+
+
+
+package javax.annotation.security;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(TYPE)
+
+@Retention(RUNTIME)
+
+public @interface DeclareRoles\{
+
+ String[] value();
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+List of security roles specified by the
+application
+
+
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@DeclareRoles("BusinessAdmin")
+
+public class Calculator \{
+
+ public void convertCurrency() \{
+
+ if(x.isUserInRole("BusinessAdmin")) \{
+
+ //....
+
+ }
+
+ }
+
+ //...
+
+}
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.sql.DataSourceDefinition
+
+The _DataSourceDefinition_ annotation is used
+to define a container _DataSource_ to be registered with JNDI. The
+_DataSource_ may be configured by setting the annotation elements for
+commonly-used _DataSource_ properties. Additional standard and
+vendor-specific properties may be specified using the _properties_
+element. The data source will be registered under the name specified in
+the _name_ element. It may be defined to be in any valid Java EE
+namespace, which will determine the accessibility of the data source
+from other components. A JDBC driver implementation class of the
+appropriate type, either _DataSource_ , _ConnectionPoolDataSource_ , or
+_XADataSource_ , must be indicated by the _className_ element. The
+driver class is not required to be available at deployment but must be
+available at runtime prior to any attempt to access the _DataSource_ .
+
+ _DataSource_ properties should not be
+specified more than once. If the _url_ annotation element contains a
+_DataSource_ property that was also specified using the corresponding
+annotation element or was specified in the _properties_ annotation
+element, the precedence order is undefined and implementation specific.
+
+Vendors are not required to support
+_properties_ that do not normally apply to a specific data source type.
+For example, specifying the _transactional_ property to be _true_ but
+supplying a value for _className_ that implements a data source class
+other than _XADataSource_ may not be supported.
+
+Vendor-specific properties may be combined
+with or used to override standard data source properties defined using
+this annotation.
+
+ _DataSource_ properties that are specified
+and are not supported in a given configuration or cannot be mapped to a
+vendor-specific configuration property may be ignored.
+
+Although the annotation allows you to specify
+a password, it is recommended not to embed passwords in production code.
+The _password_ element in the annotation is provided as a convenience
+for ease of development.
+
+
+
+package javax.annotation.sql;
+
+import java.lang.annotation.Target;
+
+import java.lang.annotation.Retention;
+
+import java.lang.annotation.ElementType;
+
+import java.lang.annotation.RetentionPolicy;
+
+@Target(\{ElementType.TYPE})
+
+@Retention(RetentionPolicy.RUNTIME)
+
+@Repeatable(DataSourceDefinitions.class)
+
+public @interface DataSourceDefinition \{
+
+ String name();
+
+ String className();
+
+ String description() default "";
+
+ String url() default "";
+
+ String user() default "";
+
+ String password() default "";
+
+ String databaseName() default "";
+
+ int portNumber() default -1;
+
+ String serverName() default "localhost";
+
+ int isolationLevel() default -1;
+
+ boolean transactional() default true;
+
+ int initialPoolSize() default -1;
+
+ int maxPoolSize() default -1;
+
+ int minPoolSize() default -1;
+
+ int maxIdleTime() default -1;
+
+ int maxStatements() default -1;
+
+ String[] properties() default \{};
+
+ int loginTimeout() default 0;
+
+}
+
+
+
+===
+
+[width="100%",cols="34%,33%,33%",options="header",]
+|===
+|Element
+|Description
+|Default
+| _name_ |JNDI
+name by which the data source will be registered
+|
+
+| _className_
+|DataSource implementation class name
+|
+
+| _description_
+|Description of the data source
+|""
+
+| _url_ |A JDBC
+URL. If the url annotation element contains a DataSource property that
+was also specified using the corresponding annotation element, the
+precedence order is undefined and implementation specific.
+|""
+
+| _user_ |User
+name for connection authentications |""
+
+| _password_
+|Password for connection authentications
+|""
+
+| _databaseName_
+|Name of a database on a server
+|""
+
+| _portNumber_
+|Port number where a server is listening for
+requests |""
+
+| _serverName_
+|Database server name
+|"localhost"
+
+| _isolationLevel_
+|Isolation level for connections.
+|-1 (vendor specific)
+
+| _transactional_
+|Indicates whether a connection is
+transactional or not |true
+
+| _initialPoolSize_
+|Number of connections that should be created
+when a connection pool is initialized |-1
+(vendor specific)
+
+| _maxPoolSize_
+|Maximum number of connections that should be
+concurrently allocated for a connection pool
+|-1 (vendor specific)
+
+| _minPoolSize_
+|Minimum number of connections that should be
+allocated for a connection pool |-1 (vendor
+specific)
+
+| _maxIdleTime_
+|The number of seconds that a physical
+connection should remain unused in the pool before the connection is
+closed for a connection pool |-1 (vendor
+specific)
+
+| _maxStatements_
+|The total number of statements that a
+connection pool should keep open. A value of 0 indicates that the
+caching of statements is disabled for a connection pool
+|-1 (vendor specific)
+
+| _properties_
+|Used to specify vendor-specific properties
+and less commonly used _DataSource_ properties. If a _DataSource_
+property is specified in the properties element and the annotation
+element for the property is also specified, the annotation element value
+takes precedence. |\{}
+
+| _loginTimeout_
+|The maximum time in seconds that this data
+source will wait while attempting to connect to a database. A value of 0
+specifies that the timeout is the default system timeout if there is
+one, otherwise it specifies that there is no timeout
+|0
+|===
+
+
+
+Examples:
+
+
+
+@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+
+ className="com.foobar.MyDataSource",
+
+ portNumber=6689,
+
+ serverName="myserver.com",
+
+ user="lance",
+
+ password="secret")
+
+
+
+Using a URL:
+
+
+
+@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+
+
+className="org.apache.derby.jdbc.ClientDataSource",
+
+ url="jdbc:derby://localhost:1527/myDB",
+
+ user="lance",
+
+ password="secret")
+
+
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.sql.DataSourceDefinitions
+
+The _DataSourceDefinition_ annotation is used
+to declare a container _DataSource_ . The _DataSourceDefinitions_
+annotation acts as a container for multiple data source declarations.
+
+
+
+package javax.annotation.sql;
+
+import java.lang.annotation.Target;
+
+import java.lang.annotation.Retention;
+
+import java.lang.annotation.ElementType;
+
+import java.lang.annotation.RetentionPolicy;
+
+@Target(\{ElementType.TYPE})
+
+@Retention(RetentionPolicy.RUNTIME)
+
+public @interface DataSourceDefinitions \{
+
+ DataSourceDefinition[] value ();
+
+}
+
+
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+Container for defining multiple data sources.
+
+
+
+
+
+The following example shows the usage of the
+annotation defined above:
+
+@DataSourceDefinitions (\{
+
+@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+
+ className="com.foobar.MyDataSource",
+
+ portNumber=6689,
+
+ serverName="myserver.com",
+
+ user="lance",
+
+ password="secret")
+
+@DataSourceDefinition(name="java:global/MyApp/MyDataSource",
+
+
+className="org.apache.derby.jdbc.ClientDataSource",
+
+ url="jdbc:derby://localhost:1527/myDB",
+
+ user="lance",
+
+ password="secret")
+
+})
+
+public class CalculatorBean \{
+
+ //...
+
+}
+
+===
+
+image:annotations-8.png[image]
+
+javax.annotation.ManagedBean
+
+The _ManagedBean_ annotation is used to
+declare a Managed Bean as specified in the _Managed Beans_
+specification. Managed Beans are container-managed objects that support
+a small set of basic services such as resource injection, lifecycle
+callbacks and interceptors. A Managed Bean may optionally have a name, a
+_String_ specified via the _value_ element.
+
+
+
+package javax.annotation;
+
+import static
+java.lang.annotation.ElementType.*;
+
+import static
+java.lang.annotation.RetentionPolicy.*;
+
+@Target(TYPE)
+
+@Retention(RUNTIME)
+
+public @interface ManagedBean \{
+
+ boolean value() default "";
+
+}
+
+}
+
+===
+
+Element
+
+Description
+
+Default
+
+ _value_
+
+Name of the Managed Bean
+
+""
+
+
+
+
+
+Examples:
+
+@ManagedBean("cart")
+
+public class ShoppingCart \{
+
+...
+
+
+
+}
+
+===
+
+===
+
+image:annotations-9.png[image]
+
+References
+
+image:annotations-10.png[image]
+
+JSR 175: A Metadata Facility for the Java
+Programming Language. http://jcp.org/en/jsr/detail?id=175
+
+Java Platform, Enterprise Edition, v7 (Java
+EE). http://jcp.org/en/jsr/detail?id=342
+
+Java 2 Platform, Standard Edition, v5.0
+(J2SE). http://java.sun.com/j2se
+
+Enterprise JavaBeans, v3.2 (EJB).
+http://jcp.org/en/jsr/detail?id=345
+
+Interceptors, 1.2.
+http://jcp.org/en/jsr/detail?id=318
+
+Managed Beans.
+http://jcp.org/en/jsr/detail?id=316
+
+RFC 2119.
+http://www.faqs.org/rfcs/rfc2119.html