1 package com.atlassian.config;
2
3 import com.atlassian.core.util.ClassHelper;
4
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.Map;
8
9 public abstract class AbstractConfigurationPersister implements ConfigurationPersister
10 {
11 private Map configMappings = new HashMap();
12
13 public void addConfigMapping(Class propertyType, Class configType)
14 {
15 configMappings.put(propertyType, configType);
16 }
17
18 public abstract Object getRootContext();
19
20 public void addConfigElement(Object item, String propertyName) throws ConfigurationException
21 {
22 addConfigElement(item, propertyName, getRootContext());
23 }
24
25 public Object getConfigElement(Class propertyType, String propertyName) throws ConfigurationException
26 {
27 return getConfigElement(propertyType, propertyName, getRootContext());
28 }
29
30 public String getStringConfigElement(String propertyName) throws ConfigurationException
31 {
32 return (String) getConfigElement(String.class, propertyName);
33 }
34
35 public void addConfigElement(Object item, String propertyName, Object context) throws ConfigurationException
36 {
37 Class clazz = null;
38 Map.Entry entry;
39
40 if (item == null)
41 return;
42
43 for (Iterator iterator = configMappings.entrySet().iterator(); iterator.hasNext();)
44 {
45 entry = (Map.Entry) iterator.next();
46 Class c = (Class) entry.getKey();
47 if (c.isAssignableFrom(item.getClass()))
48 {
49 clazz = (Class) entry.getValue();
50 break;
51 }
52 }
53 if (clazz != null)
54 {
55 try
56 {
57 ConfigElement config = (ConfigElement) ClassHelper.instantiateClass(clazz, new Object[]{propertyName, context, this});
58 config.save(item);
59 }
60 catch (Exception e)
61 {
62 throw new ConfigurationException("Failed to create config element: " + clazz.getName(), e);
63 }
64 }
65 else
66 {
67 throw new ConfigurationException("Failed to find config element for " + item.getClass().getName());
68 }
69 }
70
71 public Object getConfigElement(Class propertyType, String propertyName, Object context) throws ConfigurationException
72 {
73 Class clazz = (Class) configMappings.get(propertyType);
74 if (clazz != null)
75 {
76 try
77 {
78 ConfigElement config = (ConfigElement) ClassHelper.instantiateClass(clazz, new Object[]{propertyName, context, this});
79 return config.load();
80 }
81 catch (Exception e)
82 {
83 throw new ConfigurationException("Failed to create config element: " + clazz.getName(), e);
84 }
85 }
86 else
87 {
88 throw new ConfigurationException("Failed to find config element for " + propertyType.getName());
89 }
90 }
91 }