Advertisement
aironman

how to modify an attribute of an annotation at runtime

Oct 29th, 2013
126
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @javax.servlet.sip.annotation.SipServlet
  2. public class HelloSipWorld extends SipServlet {
  3.    
  4.     /**
  5.      *
  6.      */
  7.     private static final long   serialVersionUID                = -9090594133332625693L;
  8.    
  9.     private static Log          logger                          = LogFactory.getLog(HelloSipWorld.class);
  10.    
  11.     private static String       newAppNameFromCallServiceString = "";
  12.    
  13.     static {
  14.         System.out.println("INIT static HelloSipWorld. Vamos a escanear las anotaciones que tiene el fichero com.kurento.kmf.sip.package-info.java ");
  15.         System.out.println("El proposito es poder coger el atributo name de la anotacion @CallService y aplicarselo al name de la anotacion @SipApplication.");
  16.         try {
  17.             Annotation[]  listaDeclaredAnnotations = HelloSipWorld.class.getPackage().getDeclaredAnnotations();
  18.             for (Annotation a:listaDeclaredAnnotations) {
  19.                 System.out.println("ANOTACIONES DECLARADAS: " + a.toString()); 
  20.             }
  21.            
  22.            
  23.             //las anotaciones que hay en el mismo paquete donde esta alojado HelloSipWorld
  24.             //annotations located in the same package than HelloSipWorld
  25.             Annotation[] arrayAnotations = HelloSipWorld.class.getPackage().getAnnotations();
  26.             for(Annotation a:arrayAnotations) {
  27.                 System.out.println("ANOTACIONES: " + a.toString());
  28.             }
  29.            
  30.             Class<?> pClass = Class.forName("com.kurento.kmf.sip.package-info");
  31.             System.out.println("pClass: " + pClass.toString());
  32.             Field field = Class.class.getDeclaredField("annotations");
  33.             field.setAccessible(true);
  34.            
  35.             //este es el mapa de anotaciones que tiene una determinada clase, en este caso, la clase package-info.java
  36.             Map<Class<? extends Annotation>, Annotation> annotationsMap = (Map<Class<? extends Annotation>, Annotation>) field.get(pClass);
  37.             System.out.println("LISTA DE ANOTACIONES: " + annotationsMap.toString());
  38.            
  39.            
  40.             for (Annotation anotattion : arrayAnotations) {
  41.            
  42.                 if (anotattion instanceof CallService) {
  43.                     System.out.println("Procesando anotacion CallService...");
  44.                     final CallService oldCallService = (CallService) HelloSipWorld.class.getPackage().getAnnotation(CallService.class);
  45.                     System.out.println("Por defecto la anotacion CallService tiene como name = " + oldCallService.name());
  46.                    
  47.                     //asigno a la variable temporal el name de la etiqueta CallService para poder asignarselo luego cuando procese la anotacion SipApplication
  48.                     newAppNameFromCallServiceString = oldCallService.name();
  49.                     System.out.println("Asignado nombre de la etiqueta CallService a la variable temporal. newAppNameFromCallServiceString: "
  50.                             + newAppNameFromCallServiceString);
  51.                     System.out.println("Se acabó de procesar la anotacion CallService...");
  52.                 }
  53.                
  54.                 if (anotattion instanceof SipApplication) {
  55.                     System.out.println("Procesando anotacion SipApplication...");
  56.                     final SipApplication oldSipApplicationAnotation = (SipApplication) annotationsMap.get(SipApplication.class);
  57.                     System.out.println("valor de oldSipApplicationAnotation: " + oldSipApplicationAnotation + " name: " + oldSipApplicationAnotation.name()); ;
  58.                     Annotation newSipApplicationAnnotation = new SipApplication() {
  59.                        
  60.                         @Override
  61.                         public Class<? extends Annotation> annotationType() {
  62.                             return oldSipApplicationAnotation.annotationType();
  63.                         }
  64.                        
  65.                         @Override
  66.                         public String description() {
  67.                             // TODO Auto-generated method stub
  68.                             return oldSipApplicationAnotation.description();
  69.                         }
  70.                        
  71.                         @Override
  72.                         public String displayName() {
  73.                             // TODO Auto-generated method stub
  74.                             return oldSipApplicationAnotation.displayName();
  75.                         }
  76.                        
  77.                         @Override
  78.                         public boolean distributable() {
  79.                             // TODO Auto-generated method stub
  80.                             return oldSipApplicationAnotation.distributable();
  81.                         }
  82.                        
  83.                         @Override
  84.                         public String largeIcon() {
  85.                             // TODO Auto-generated method stub
  86.                             return oldSipApplicationAnotation.largeIcon();
  87.                         }
  88.                        
  89.                         @Override
  90.                         public String smallIcon() {
  91.                             // TODO Auto-generated method stub
  92.                             return oldSipApplicationAnotation.smallIcon();
  93.                         }
  94.                        
  95.                         @Override
  96.                         public String mainServlet() {
  97.                             // TODO Auto-generated method stub
  98.                             return oldSipApplicationAnotation.mainServlet();
  99.                         }
  100.                        
  101.                         @Override
  102.                         public String name() {
  103.                            
  104.                             return newAppNameFromCallServiceString;
  105.                         }
  106.                        
  107.                         @Override
  108.                         public int proxyTimeout() {
  109.                             // TODO Auto-generated method stub
  110.                             return oldSipApplicationAnotation.proxyTimeout();
  111.                         }
  112.                        
  113.                         @Override
  114.                         public int sessionTimeout() {
  115.                             // TODO Auto-generated method stub
  116.                             return oldSipApplicationAnotation.sessionTimeout();
  117.                         }
  118.                     };
  119.                     //modificamos el mapa de las anotaciones que tiene anotadas la clase que estoy escaneando. en este caso, package-info.java
  120.                     annotationsMap.put(SipApplication.class, newSipApplicationAnnotation);
  121.                     //asi no!
  122.                     //final SipApplication modifiedSipApplicationAnotation = (SipApplication) HelloSipWorld.class.getAnnotation(SipApplication.class);
  123.                     final SipApplication modifiedSipApplicationAnotation = (SipApplication) annotationsMap.get(SipApplication.class);
  124.                     //esto en teoria provoca el cambio dentro del mapa annotationsMap, pq modifiedSipApplicationAnotation esta dentro del mapa y al llamar a name() le obligo a que coja el nuevo nombre!
  125.                     System.out.println("nombre de modifiedSipApplicationAnotation: "  + modifiedSipApplicationAnotation.name());
  126.                     System.out.println("Se acabó procesar la anotacion SipApplication...");
  127.                    
  128.                 }
  129.             }
  130.            
  131.         } catch (Exception xcp) {
  132.             xcp.printStackTrace();
  133.         }
  134.         System.out.println("END static HelloSipWorld...");
  135.     }
  136. ....
  137. //rest of methods of HelloSipWorld
  138. }//end of HelloSipWorld
  139.  
  140.  
  141. package-info.java file
  142.  
  143. /**
  144.  *
  145.  * Provides the way to instantiated a class that extends SipServlet without using a sip.xml
  146.  *  
  147.  * @author Alonso Isidoro Roman (aroman@naevatec.com)
  148.  * @version 1.0.0
  149.  */
  150. //La idea es poder coger el name de esta anotacion CallService y asignarsela a piñon al name de la anotacion SipApplication
  151. @CallService(name ="My first kurento app")
  152. @SipApplication(name = "default-name-sip-app", description = "default description of the SipApplication", displayName = "default-displayName")
  153. package com.kurento.kmf.sip;
  154.  
  155. import javax.servlet.sip.annotation.SipApplication;
  156. import com.kurento.kmf.sip.annotation.CallService;
  157. //Important, this file is on the same package that HelloSipWorld.java
Advertisement
Advertisement
Advertisement
RAW Paste Data Copied
Advertisement