1   package org.jadetower.dao;
2   
3   /*
4   Copyright (c) 2003, J Aaron Farr
5   All rights reserved.
6   
7   This software is published under the terms of the JadeTower Software License,
8   a BSD derived license, a copy of which has been included with this
9   distribution in the LICENSE file.  <http://www.jadetower.org>
10  */
11  
12  
13  import org.apache.avalon.framework.configuration.DefaultConfigurationBuilder;
14  import org.apache.avalon.framework.configuration.Configuration;
15  import org.apache.avalon.framework.container.ContainerUtil;
16  import org.apache.avalon.framework.configuration.DefaultConfiguration;
17  import org.apache.avalon.framework.logger.Logger;
18  import org.apache.avalon.framework.configuration.ConfigurationException;
19  import org.apache.excalibur.configuration.merged.ConfigurationMerger;
20  
21  import org.apache.commons.logging.Log;
22  import org.apache.commons.logging.LogFactory;
23  
24  import java.util.HashMap;
25  import java.util.Map;
26  import java.util.Collections;
27  import java.lang.reflect.Constructor;
28  
29  import org.jadetower.resolver.Resolver;
30  import org.jadetower.resolver.impl.DefaultResolver;
31  import org.jadetower.dao.impl.CommonsLogger;
32  
33  /***
34   * a simple DAO Container.
35   */
36  public class DaoContainer {
37  
38  
39      private boolean contextualized = false;
40      private Map m_context = null;
41  
42      private Configuration m_configuration = null;
43      private HashMap m_managers = new HashMap();
44      private String m_default = null;
45      private Logger m_logger = null;
46  
47      /***
48       * creates a basic DaoContainer
49       * @param configUrls a array of configuration file URLs (will merge files)
50       * @param context a default root context [can be null]
51       * @param logger an Jakarta Commons logger [can be null]
52       * @throws java.lang.Exception
53       */
54      public DaoContainer(final String[] configUrls, Map context, Log log) throws Exception {
55        DefaultConfigurationBuilder builder = new DefaultConfigurationBuilder();
56        Configuration conf = builder.build(configUrls[0]);
57        for(int i=1; i < configUrls.length; i++){
58          Configuration c = builder.build(configUrls[1]);
59          conf = ConfigurationMerger.merge(conf,c);
60        }
61        if( context != null)
62          m_context = Collections.synchronizedMap(context);
63        else
64          m_context = Collections.synchronizedMap(new HashMap());
65        m_configuration = conf;
66        initLogger(log);
67        initialize();
68      }
69  
70      /***
71       * get the default DaoManager
72       * @return the default DAO Manager
73       * @throws java.lang.Exception
74       */
75      public DaoManager getManager() throws Exception {
76        return getManager(m_default);
77      }
78  
79      /***
80       * get a specific named DaoManager
81       * @param context the DaoManager ID or context name
82       * @return the named DaoManager
83       * @throws java.lang.Exception
84       */
85      public DaoManager getManager(String context) throws Exception {
86          DaoManager manager = null;
87          if(m_managers.containsKey(context)){
88            manager = (DaoManager) m_managers.get(context);
89          }
90          return manager;
91      }
92  
93      protected void initialize() {
94  
95        Configuration rez = new DefaultConfiguration("resolver");
96        Configuration[] resolvers = m_configuration.getChildren("resolvers");
97        for(int i=0; i < resolvers.length; i++){
98          try {
99            Configuration r = resolvers[i];
100           rez = ConfigurationMerger.merge(rez, r);
101         }
102         catch (ConfigurationException ex) {
103           m_logger.error("Error merging resolver configurtions",ex);
104         }
105       }
106       Resolver resolver = createResolver(rez);
107       Configuration[] daoConfs = m_configuration.getChildren("manager");
108 
109       HashMap configurations = new HashMap();
110 
111       for(int i=0; i < daoConfs.length; i++){
112         try {
113           Configuration conf = daoConfs[i];
114           String name = conf.getAttribute("id", "default");
115           if(m_default == null)
116             m_default = name;
117           configurations.put(name, conf);
118           boolean isDefault = conf.getAttributeAsBoolean("default", false);
119           if(isDefault)
120             m_default = name;
121           String clazz = conf.getAttribute("impl",
122               "org.jadetower.dao.impl.DefaultDaoManager");
123 
124           String ext = conf.getAttribute("extends", null);
125           if (ext != null && configurations.containsKey(ext)) {
126             Configuration parent = (Configuration) configurations.get(ext);
127             conf = ConfigurationMerger.merge(conf, parent);
128           }
129 
130           Class[] param = new Class[] {
131               Resolver.class, Logger.class, Configuration.class, Map.class};
132 
133           Object[] params = new Object[] {
134               resolver, m_logger, conf, m_context};
135 
136           Constructor c = Class.forName(clazz).getConstructor(param);
137           DaoManager manager = (DaoManager) c.newInstance(params);
138           m_managers.put(name, manager);
139         }
140         catch (Exception ex) {
141           m_logger.error("error creating dao manager",ex);
142         }
143       }
144     }
145 
146     protected Resolver createResolver(Configuration config){
147       DefaultResolver resolver = new DefaultResolver();
148       resolver.configure(config);
149       return resolver;
150     }
151 
152     protected void initLogger(Log log){
153       if(log == null)
154         m_logger = new CommonsLogger(LogFactory.getLog("dao"));
155       else
156         m_logger = new CommonsLogger(log);
157     }
158 
159 }
This page was automatically generated by Maven