View Javadoc

1   package es.caib.signatura.impl;
2   
3   import java.io.InputStream;
4   import java.security.Provider;
5   import java.security.Security;
6   
7   /**
8    * @author e43155798r
9    * Clase factory para obtener referencias a objetos que implementen la interfaz CertificateProvider.
10   */
11  public class CertificateProviderFactory {
12  	
13  	private static ClassLoaderFactory factory;
14  	
15  	/**
16  	 * Constructor vacío.
17  	 */
18  	public CertificateProviderFactory() {}
19  	
20  	/**
21  	 * Devuelve un objeto de la clase solicitada por parámetro.
22  	 * @param classname
23  	 * @return
24  	 */
25  	public static CertificateProvider getCertificateProvider(String classname) throws CertificateProviderException {
26  		
27  		System.out.println("CertificateProviderFactory.getCertificateProvider()");
28  		
29  		init();
30  		
31  		CertificateProvider p = null;
32  		
33  		try {
34  			
35  			p = (CertificateProvider)factory.getFactory().getMasterClassLoader().loadClass(classname).newInstance();
36  			
37  		} catch (Exception e) {
38  			
39  			throw new CertificateProviderException(e);
40  			
41  		}
42  		
43  		System.out.println("FIN CertificateProviderFactory.getCertificateProvider()");
44  		
45  		return p;
46  		
47  	}
48  	
49  	
50  	/**
51  	 * 
52  	 */
53  	private static void init() {
54  		
55  		System.out.println("CertificateProviderFactory.init()");
56  		
57  		CAIBSecurityManager.register();	
58  	    
59  		try {	
60  		
61  			if (factory == null) {
62  			    factory = ClassLoaderFactory.getFactory ();
63  			}
64  			
65  			/*
66  			 * Cargamos dinámicamente los security providers
67  			 * de BouncyCastle y de LunaPCI
68  			 */
69  			
70  			if (Security.getProvider("BC") == null) {
71  				ClassLoader c = factory.getFactory().getMasterClassLoader();			  
72  				Provider p = (Provider) factory.getFactory().getMasterClassLoader().loadClass("org.bouncycastle.jce.provider.BouncyCastleProvider").newInstance();
73  				Security.addProvider(p);
74  			}
75  			
76  			// Sólo intentamos cargar los providers de Luna si tenemos
77  			// disponible el JAR para Luna en la instalación del API de firma
78  			InputStream inputStream = factory.getMasterClassLoader().getResourceAsStream("es/caib/signatura/provider/impl/lunaPCI/LunaPCISigner.class");
79  			if (inputStream != null) {
80  								
81  				if (Security.getProvider("LunaJCE") == null) {
82  					ClassLoader c = factory.getFactory().getMasterClassLoader();			  
83  					Provider p = (Provider) factory.getFactory().getMasterClassLoader().loadClass("com.chrysalisits.cryptox.LunaJCEProvider").newInstance();
84  					Security.addProvider(p);
85  				}
86  				
87  				if (Security.getProvider("LunaJCA") == null) {
88  					ClassLoader c = factory.getFactory().getMasterClassLoader();			  
89  					Provider p = (Provider) factory.getFactory().getMasterClassLoader().loadClass("com.chrysalisits.crypto.LunaJCAProvider").newInstance();
90  					Security.addProvider(p);
91  				}
92  			
93  			}
94  			
95  		} catch(Exception e) {
96  			
97  			throw new RuntimeException (e); 
98  			
99  		}
100 		
101 		System.out.println("FIN CertificateProviderFactory.init()");
102 		
103 	}
104 
105 }