1 package org.objectweb.celtix.configuration.impl; 2 3 import java.io.IOException ; 4 import java.io.InputStream ; 5 import java.util.HashMap ; 6 import java.util.Map ; 7 import java.util.ResourceBundle ; 8 9 import org.objectweb.celtix.common.i18n.BundleUtils; 10 import org.objectweb.celtix.common.i18n.Message; 11 import org.objectweb.celtix.configuration.Configuration; 12 import org.objectweb.celtix.configuration.ConfigurationBuilder; 13 import org.objectweb.celtix.configuration.ConfigurationException; 14 import org.objectweb.celtix.configuration.ConfigurationMetadata; 15 import org.objectweb.celtix.resource.DefaultResourceManager; 16 17 public class ConfigurationBuilderImpl implements ConfigurationBuilder { 18 protected static final ResourceBundle BUNDLE = 19 BundleUtils.getBundle(ConfigurationBuilderImpl.class); 20 21 protected Map <String , Map <String , Configuration>> configurations; 22 private Map <String , ConfigurationMetadata> models; 23 24 25 public ConfigurationBuilderImpl() { 26 models = new HashMap <String , ConfigurationMetadata>(); 27 configurations = new HashMap <String , Map <String , Configuration>>(); 28 29 38 } 39 40 public Configuration getConfiguration(String namespaceUri, String id) { 41 Map <String , Configuration> instances = configurations.get(namespaceUri); 42 if (null == instances) { 43 if (null == getModel(namespaceUri)) { 44 throw new ConfigurationException(new Message("UNKNOWN_NAMESPACE_EXC", BUNDLE, namespaceUri)); 45 } 46 return null; 47 } 48 return instances.get(id); 49 } 50 51 public Configuration getConfiguration(String namespaceUri, String id, Configuration parent) { 52 if (parent == null) { 53 return null; 54 } 55 56 Configuration c = parent.getChild(namespaceUri, id); 57 if (null == c && null == getModel(namespaceUri)) { 58 throw new ConfigurationException(new Message("UNKNOWN_NAMESPACE_EXC", BUNDLE, namespaceUri)); 59 } 60 return c; 61 } 62 63 public Configuration buildConfiguration(String namespaceUri, String id, Configuration parent) { 64 ConfigurationMetadata model = getModel(namespaceUri); 65 if (null == model) { 66 throw new ConfigurationException(new Message("UNKNOWN_NAMESPACE_EXC", BUNDLE, namespaceUri)); 67 } 68 75 if (parent == null && !isValidTopConfiguration(model, parent)) { 76 throw new ConfigurationException(new Message("INVALID_TOP_CONFIGURATION", 77 BUNDLE, namespaceUri)); 78 } 79 80 Configuration c = new AbstractConfigurationImpl(model, id, parent); 81 if (null == parent) { 82 Map <String , Configuration> instances = configurations.get(namespaceUri); 83 if (null == instances) { 84 instances = new HashMap <String , Configuration>(); 85 configurations.put(namespaceUri, instances); 86 } 87 instances.put(id, c); 88 } 89 return c; 90 } 91 92 97 protected boolean isValidTopConfiguration(ConfigurationMetadata model, Configuration parent) { 98 String parentNamespaceURI = model.getParentNamespaceURI(); 99 100 if (parentNamespaceURI == null || "".equals(parentNamespaceURI)) { 101 return true; 102 } 103 104 return false; 105 } 106 107 116 117 public Configuration buildConfiguration(String namespaceUri, String id) { 118 return buildConfiguration(namespaceUri, id, null); 119 } 120 121 public final void addModel(ConfigurationMetadata model) { 122 models.put(model.getNamespaceURI(), model); 123 } 124 125 public ConfigurationMetadata getModel(String namespaceUri) { 126 return models.get(namespaceUri); 127 } 128 129 public void addModel(String resource) { 130 131 InputStream is = null; 132 if (resource != null) { 133 is = loadResource(resource); 134 if (is == null) { 135 throw new ConfigurationException(new Message("METADATA_RESOURCE_EXC", 136 BUNDLE, resource)); 137 } 138 } 139 140 ConfigurationMetadata model = null; 141 ConfigurationMetadataBuilder builder = new ConfigurationMetadataBuilder(true); 142 if (null != is) { 143 try { 144 model = builder.build(is); 145 } catch (IOException ex) { 146 throw new ConfigurationException(new Message("METADATA_RESOURCE_EXC", 147 BUNDLE, resource), ex); 148 } 149 } else { 150 model = new ConfigurationMetadataImpl(); 151 } 152 153 addModel(model); 154 } 155 156 private InputStream loadResource(String resourceName) { 157 return DefaultResourceManager.instance().getResourceAsStream(resourceName); 158 } 159 } 160 | Popular Tags |