domingo, abril 18, 2010

Some signatures examples

En la última entrada dedicada a AOP (podeis verla aquí ) analizamos de manera teórica las características básicas del lenguaje de definición de pointcuts. A continuación realizaremos una serie de ejemplos que intentarán clarificar los conceptos teóricos vistos en anteriores entradas.

  • Signaturas de tipos
Table 1.2. Ejemplos de signaturas de tipos
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
AstVisitorEl tipo AstVisitorSólo el tipo AstVisitor concuerda (ni tipos base ni derivados)
*AstVisitorCualquier tipo cuyo nombre termine en AstVisitorPor ejemplo, HighlightingAstVisitor o SemanticAstVisitor concuerdan con el patrón
java.*.DateEl tipo Date en cualquier subpaquete directo del paquete javajava.util.Date o java.sql.Date son ejemplos de tipos concordantes
javax..*Cualquier tipo en el paquete javax y en sus subpaquetes (tanto directos como indirectos)Cualquier tipo en el paquete javax.security así como cualquiera de sus subpaquetes indirectos como javax.security.auth.login
javax..*ModelTodos los tipos en el paquete javax (subpaquetes directos e indirectos) cuyo nombre termine en Model, y todos los subtipos de estos.TableModelTreeModel y sus subtipos como DefaultTreeModel oDefaultTableModel.



  • Signaturas de tipos: anotaciones
Table 1.3. Ejemplos de signaturas de tipos: anotaciones
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
@Secured UserEl tipo User anotado con la anotación Secured@Secured class User{. . .}
@Entity *Cualquier tipo anotado con la anotación Entity@Entity class Section {. . .},@Entity class Report {. . .}
@Transactional* Manager+El tipo Manager y cualquiera de sus clases derivadas que estén anotados con una anotación cuyo nombre comience por Transactional@TransactionalDefault class Manager{},@TransactionalOracle class OracleManager extends Manager{}




  • Signaturas de tipos: generics
Table 1.4. Ejemplos de signaturas de tipos: generics
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
Map El tipo Map cuyo primer argumento genérico está fijado a Integer y el segundo aStringEn este caso únicamente concordará el tipo Map
*Cualquier tipo genérico cuyo único argumento genérico sea de tipo UserCollection,List, . . .
CollectionEl tipo Collection con un parámetro de tipo User o derivadoCollectionCollection, . . .
CollectionEl tipo Collection, cuyo parámetro será uno de los tipos base de UserCollectionCollection, asumiendo que, User extiende o implementa, directa o indirectamente, Serializable y BaseUser


  • Combinando pointcuts: operadores
Table 1.5. Signaturas de tipo: operadores
Patrón de la signaturaDescripciónEjemplos de tipos concordantes
!CollectionCualquier tipo excepto CollectionUser,ModelList (aunque sea subclase de Collection)
Set || MapLos tipos Set o MapLos tipos Set y Map únicamente
!@TransactionalCualquier tipo que se encuentre anotado por la anotación Transactionalclass NonTransactionalManager{}
@Serializable @Encrypted *Cualquier tipo que se encuentre anotado por las dos anotaciones@Serializable @Encrypted class UserCredentials{}
(@Serializable || @Encrypted) *Cualquier tipo que esté anotado por alguna de las dos anotaciones@Serializable class User {}


  • Signaturas de métodos y constructores
Table 1.6. Signaturas de métodos
Patrón de la signaturaDescripciónEjemplos de métodos concordantes
public void User.set*(*)Cualquier método público de la clase User cuyo nombre comience por set, cuyo tipo de retorno sea void, y que espere un único argumentoclass User{ public void setName(String name){} }
public void User.*()Cualquier método público de la clase User cuyo tipo de retorno sea void y que no espere argumentosclass User { public void updateInfo(){}}
public * User.*()Cualquier método público de la clase User que no espera argumentos y retorna cualquier tipoclass User{ public UserInfo getUserInfo(){}}
public * User.*(..)Cualquier método público de la clase User que retorna cualquier tipo, y espera cualquier número y tipo de argumentos (incluido cero)class User{ public UserInfo getUserInfo(){},public Date updatesBetween(Date first,Date last){}}
* *.*(..) o * * (..)Cualquier método independientemente de su tipo, del tipo de retorno, de su nombre y de los argumentos que espereCualquier método del sistema
!public * User.*(..)Cualquier método que no sea público (privado,protegido o paquete)class User {protected getUserInfo(){}}
* * (..) throws Recognition ExceptionCualquier método que declare que puede lanzar una excepción de tipoRecognitionExceptionclass AntlRBasedParser { public void parser(String file) throws RecognitionException}
* User+.*(..)Cualquier método en la clase User y sus subclasesclass UserDetails extends User {}
User UserService.*(..)Cualquier método del tipo UserService cuyo tipo de retorno sea User. Si alguna de las subclases sobrescribe el tipo de retorno con un subtipo de User (mediante el tipo de retorno covariante introducido en Java 5) también será seleccionado.class UserService{public User retrieveUser(String name){}} class DetailUserService extends UserService{public DetailedUser retrieveUser(String name){}}

La signatura en el caso de los constructores difiere de la signatura de métodos en los siguientes aspectos:
  • Los constructores no tienen tipo de retorno por lo que no se permite utilizar el valor de retorno en la especificación de un pointcut de este tipo.
  • Dado que los nombres de los constructores no pueden ser libres (tienen que utilizar el mismo nombre de la clase), la parte de la signatura destinada al nombre será sustituida con la palabra new.
  • Por último, puesto que los constructores no pueden ser estáticos, no se podrá utilizar la palabra reservada static
  • Signaturas de campos
Table 1.7. Signaturas de campos de clase
Patrón de la signaturaDescripciónEjemplos de campos concordantes
private String User.usernameCampo privado (tanto campo de una instancia como estático) de la clase Userclass User { private String username;}
* User.*Cualquier campo de la clase User independiente de sus calificadores, tipo y nombre.class User{private String username;protected int credits;private UserDetails details;}
* User+.*Cualquier campo de la clase User y todas sus subclases, independientemente de sus calificadores, tipo y nombre.El ejemplo de la fila anterior o class SpecificUser extends User {private String address;}


No hay comentarios: