001: // Copyright (c) 2003-2007, Jodd Team (jodd.sf.net). All Rights Reserved.
002:
003: package jodd.bean;
004:
005: import java.util.HashMap;
006: import java.util.Map;
007:
008: import jodd.bean.loader.BeanLoader;
009: import jodd.bean.loader.MapBeanLoader;
010: import jodd.bean.loader.MultipartRequestBeanLoader;
011: import jodd.bean.loader.MultipartRequestWrapperBeanLoader;
012: import jodd.bean.loader.RequestBeanLoader;
013: import jodd.bean.loader.ResultSetBeanLoader;
014: import jodd.bean.loader.ServletContextBeanLoader;
015: import jodd.bean.loader.SessionBeanLoader;
016:
017: /**
018: * Manager for {@link BeanLoader} instances that populates java beans from various sources.
019: */
020: public class BeanLoaderManager {
021:
022: // ---------------------------------------------------------------- manager
023:
024: private static final Map<Class, BeanLoader> loaders = new HashMap<Class, BeanLoader>();
025:
026: static {
027: registerDefaults();
028: }
029:
030: /**
031: * Unregister all loaders.
032: */
033: public static void unregisterAll() {
034: loaders.clear();
035: }
036:
037: /**
038: * Registers default set of loaders.
039: * <p>
040: *
041: * Important note: class that doesn't come with JDK is first being examined
042: * for existence. Examination is done with <code>Class.forName()</code>
043: * If class exists, it will be registered. If not, it will be skipped.
044: *
045: * @see #register
046: */
047: public static void registerDefaults() {
048: register(java.util.Map.class, new MapBeanLoader());
049: register(java.sql.ResultSet.class, new ResultSetBeanLoader());
050: try {
051: Class.forName("javax.servlet.http.HttpServletRequest"); // check if exists
052: register(javax.servlet.http.HttpServletRequest.class,
053: new RequestBeanLoader());
054: Class.forName("javax.servlet.http.HttpSession");
055: register(javax.servlet.http.HttpSession.class,
056: new SessionBeanLoader());
057: Class.forName("javax.servlet.ServletContext");
058: register(javax.servlet.ServletContext.class,
059: new ServletContextBeanLoader());
060: register(jodd.servlet.upload.MultipartRequest.class,
061: new MultipartRequestBeanLoader());
062: register(jodd.servlet.upload.MultipartRequestWrapper.class,
063: new MultipartRequestWrapperBeanLoader());
064: } catch (ClassNotFoundException cnfex) {
065: // ignore
066: }
067: }
068:
069: /**
070: * Registers loader for an objects of specific type.
071: *
072: * @param type type of object that will be used by loader to populate bean.
073: * @param load loader object that populates a bean.
074: *
075: * @see #registerDefaults
076: */
077: public static void register(Class type, BeanLoader load) {
078: loaders.put(type, load);
079: }
080:
081: public static void unregister(Class type) {
082: loaders.remove(type);
083: }
084:
085: // ---------------------------------------------------------------- lookup
086:
087: /**
088: * Returns loader for the specific object type.
089: *
090: * @param type type of object that will be used by loader to populate bean.
091: *
092: * @return loader for objects of specific type, <code>null</code> if no loader found.
093: */
094: public static BeanLoader lookup(Class type) {
095: return loaders.get(type);
096: }
097:
098: /**
099: * Performs more throughly search for bean loader. It examines all available
100: * loaders and returns the first that matches the object type.
101: */
102: public static BeanLoader lookup(Object source) {
103: BeanLoader load = lookup(source.getClass());
104: if (load == null) { // class not found, scan for instanceof matching
105: for (Class key : loaders.keySet()) {
106: if (key.isInstance(source)) {
107: load = lookup(key);
108: break;
109: }
110: }
111: }
112: return load;
113: }
114:
115: }
|