View Javadoc

1   package net.sf.jldapbeans.lang;
2   
3   import java.io.FileInputStream;
4   import java.io.IOException;
5   import java.io.InputStream;
6   import java.net.URL;
7   import java.util.Enumeration;
8   
9   import org.apache.commons.digester.Digester;
10  import org.apache.commons.digester.Rule;
11  import org.apache.commons.logging.Log;
12  import org.apache.commons.logging.LogFactory;
13  import org.xml.sax.Attributes;
14  import org.xml.sax.SAXException;
15  
16  /***
17   * Holds a singleton instance of the bean repositories loaded from the
18   * classpath.
19   * <p>
20   * <tt>BeanRepositoryFactory</tt> looks for any resource named <tt>jldapbeans-repository.xml</tt>
21   * inside the <tt>META-INF</tt> folder using the application thread's <tt>ClassLoader</tt>. 
22   *
23   * @author <a href="mailto:alonsoft@users.sf.net">A. Alonso Domínguez</a>
24   * @version 1.0 $ Revision 12-nov-2005 :: alonso $
25   */
26  public final class BeanRepositoryFactory {
27  	private static final Log log = LogFactory.getLog(BeanRepositoryFactory.class);
28  	
29  	private static class LdapBeanRule extends Rule {
30  
31  		public void begin(String namespace, String name, Attributes attrs) {
32  			BeanRepositoryImpl repository = (BeanRepositoryImpl) digester.peek();
33  			String objectClass = attrs.getValue("objectClass");
34  			String className = attrs.getValue("classname");
35  			repository.setObjectClass(objectClass, className);
36  		}
37  		
38  	}
39  	
40  	/*** The singleton <tt>BeanRepository</tt> instance. */
41  	private static BeanRepositoryImpl m_singletonRepository;
42  	
43  	private static final String REPOSITORY_FILE = "META-INF/jldapbeans-repository.xml";
44  	
45  	private static BeanRepositoryImpl loadXMLResource(InputStream resource)
46  	throws IOException, SAXException {		
47  		Digester digester = new Digester();
48  		digester.addRule("jldapbeans-repository/ldap-bean", new LdapBeanRule());
49  		digester.push(new BeanRepositoryImpl());
50  		return (BeanRepositoryImpl) digester.parse(resource);
51  	}
52  	
53  	private static BeanRepositoryImpl createBeanRepository(ClassLoader cl) {
54  		BeanRepositoryImpl result = new BeanRepositoryImpl();
55  		log.debug("Starting loading LDAP Beans repositories");
56  		try {
57  			Enumeration<URL> e = cl.getResources(REPOSITORY_FILE);
58  			if(!e.hasMoreElements()) 
59  				log.warn("No LDAP Beans repositories found");
60  			while(e.hasMoreElements()) {
61  				URL url = e.nextElement();
62  				String filename = url.toString().substring("file:".length());
63  				
64  				log.trace("Loading repository file [" + filename + "]");
65  				InputStream in = new FileInputStream(filename);
66  				try {
67  					BeanRepositoryImpl internal = loadXMLResource(in);
68  					result.include(internal);
69  				}
70  				catch(SAXException se) {
71  					log.error("Error parsing repository file [" + url + "]", se);
72  				}
73  			}
74  			log.info("LDAP Beans repositories successfully loaded.");
75  		}
76  		catch(Exception e) {
77  			log.fatal("Unexpected error loading LDAP Beans repositories", e);
78  		}
79  		return result;
80  	}
81  	
82  	/***
83  	 * Obtains the @link net.sf.jldapbeans.lang.BeanRepository for the application's
84  	 * main thread.
85  	 * 
86  	 * @return The singleton <tt>BeanRepository</tt> instance or a new one if it has not been
87  	 *         already loaded.
88  	 */
89  	public static BeanRepository getRepository() {
90  		ClassLoader cl = Thread.currentThread().getContextClassLoader();
91  		if(cl == null) cl = ClassLoader.getSystemClassLoader();
92  		
93  		if(m_singletonRepository == null)
94  			m_singletonRepository = createBeanRepository(cl);
95  		return m_singletonRepository;
96  	}
97  	
98  	/*** Private constructor for prevent instantiation */
99  	private BeanRepositoryFactory() { }
100 	
101 }