View Javadoc
1   /*
2    * Copyright 2006 Werner Guttmann
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.exolab.castor.builder.conflictresolution;
17  
18  import java.util.HashMap;
19  import java.util.Map;
20  import java.util.StringTokenizer;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  
25  /**
26   * Registry for {@link ClassNameCRStrategy} implementations obtained from the
27   * Castor builder properties file.
28   *
29   * @author <a href="mailto:werner DOT guttmann @gmx DOT net">Werner Guttmann</a>
30   * @version $Revision: 5951 $ $Date: 2006-04-08 08:58:10 -0600 (Sat, 08 Apr 2006) $
31   * @since 1.1
32   */
33  public final class ClassNameCRStrategyRegistry {
34      //--------------------------------------------------------------------------
35  
36      /** The <a href="http://jakarta.apache.org/commons/logging/">Jakarta
37       *  Commons Logging</a> instance used for all logging. */
38      private static final Log LOG = LogFactory.getLog(
39              ClassNameCRStrategyRegistry.class);
40  
41      /**
42       * Association between name of {@link ClassNameCRStrategy} implementation
43       * and {@link ClassNameCRStrategy} instance.
44       */
45      private Map<String, ClassNameCRStrategy> _strategies = new HashMap<String, ClassNameCRStrategy>();
46  
47      //--------------------------------------------------------------------------
48  
49      /**
50       * Construct an instance of {@link ClassNameCRStrategyRegistry} that loads
51       * the {@link ClassNameCRStrategy} implementations specified in the given
52       * BuilderConfiguration.
53       *
54       * @param enlistedNameConflictStrategies The BuilderConfiguration.
55       */
56      public ClassNameCRStrategyRegistry(final String enlistedNameConflictStrategies) {
57          StringTokenizer tokenizer = new StringTokenizer(enlistedNameConflictStrategies, ", ");
58          ClassLoader loader = ClassNameCRStrategyRegistry.class.getClassLoader();
59          while (tokenizer.hasMoreTokens()) {
60              String classname = tokenizer.nextToken();
61              try {
62                  Class<?> cls = loader.loadClass(classname);
63                  Object obj = cls.newInstance();
64                  ClassNameCRStrategy strategy = (ClassNameCRStrategy) obj;
65                  _strategies.put(strategy.getName(), strategy);
66              } catch (Exception except) {
67                  LOG.error("The ClassNameConflictResolutionStrategy " + classname + " "
68                          + "specified in the Castor builder properties file could not "
69                          + "be instantiated.");
70              }
71          }
72      }
73  
74      //--------------------------------------------------------------------------
75  
76      /**
77       * Returns the names of all the configured {@link ClassNameCRStrategy}
78       * implementations. A {@link ClassNameCRStrategy} instance can be obtained
79       * by the {@link #getClassNameConflictResolutionStrategy} method.
80       *
81       * @return Names of {@link ClassNameCRStrategy} implementations
82       */
83      public String[] getClassNameConflictResolutionStrategyNames() {
84          String[] names = new String[_strategies.size()];
85          return _strategies.keySet().toArray(names);
86      }
87  
88      /**
89       * Returns a {@link ClassNameCRStrategy} with the specified name. Returns
90       * null if the named strategy is not supported.
91       *
92       * @param name The name of the ClassNameConflictResolutionStrategy.
93       * @return The TransactionManagerFactory or null if none exists.
94       */
95      public ClassNameCRStrategy getClassNameConflictResolutionStrategy(final String name) {
96          Object factory = _strategies.get(name);
97          if (factory == null) {
98              String msg = "The ClassNameConflictResolutionStrategy '" + name + "' "
99                         + "does not exist in the Castor builder properties file "
100                        + "and is therefore not supported.";
101             LOG.error(msg);
102             throw new IllegalArgumentException(msg);
103         }
104         return (ClassNameCRStrategy) factory;
105     }
106 
107 }