1 24 package org.riotfamily.forms.factory.xml; 25 26 import java.util.ArrayList ; 27 import java.util.HashMap ; 28 import java.util.Iterator ; 29 import java.util.List ; 30 import java.util.Map ; 31 32 import javax.activation.MimetypesFileTypeMap ; 33 34 import org.apache.commons.logging.Log; 35 import org.apache.commons.logging.LogFactory; 36 import org.riotfamily.common.image.ImageCropper; 37 import org.riotfamily.common.xml.BeanConfigurationWatcher; 38 import org.riotfamily.common.xml.ConfigurableBean; 39 import org.riotfamily.common.xml.ConfigurationEventListener; 40 import org.riotfamily.common.xml.DocumentReader; 41 import org.riotfamily.common.xml.ValidatingDocumentReader; 42 import org.riotfamily.forms.factory.AbstractFormRepository; 43 import org.riotfamily.forms.factory.FormFactory; 44 import org.springframework.beans.factory.BeanFactory; 45 import org.springframework.beans.factory.BeanFactoryAware; 46 import org.springframework.beans.factory.InitializingBean; 47 import org.springframework.core.io.Resource; 48 49 52 public class XmlFormRepository extends AbstractFormRepository implements 53 BeanFactoryAware, InitializingBean, ConfigurableBean { 54 55 private Log log = LogFactory.getLog(XmlFormRepository.class); 56 57 private List configLocations; 58 59 private boolean reloadable = true; 60 61 private BeanConfigurationWatcher configWatcher = 62 new BeanConfigurationWatcher(this); 63 64 private XmlFormRepositoryDigester digester; 65 66 private BeanFactory beanFactory; 67 68 private Class defaultBeanClass; 69 70 private MimetypesFileTypeMap mimetypesMap; 71 72 private ImageCropper imageCropper; 73 74 private HashMap customElements; 75 76 private HashMap customElementsWithoutNS; 77 78 79 public void setCustomElements(Map elements) 80 throws ClassNotFoundException { 81 82 customElements = new HashMap (); 83 customElementsWithoutNS = new HashMap (); 84 85 Iterator it = elements.entrySet().iterator(); 86 while (it.hasNext()) { 87 Map.Entry prop = (Map.Entry ) it.next(); 88 String className = (String ) prop.getValue(); 89 if (className != null) { 90 String type = (String ) prop.getKey(); 91 Class elementClass = Class.forName(className); 92 customElements.put(type, elementClass); 93 int i = type.indexOf('}'); 94 if (i != -1 && i < type.length() - 1) { 95 type = type.substring(i + 1); 96 customElementsWithoutNS.put(type, elementClass); 97 } 98 } 99 } 100 } 101 102 public Class getElementClass(String type) { 103 if (customElements == null) { 104 return null; 105 } 106 Class elementClass = (Class ) customElements.get(type); 107 if (elementClass == null) { 108 elementClass = (Class ) customElementsWithoutNS.get(type); 109 } 110 return elementClass; 111 } 112 113 public void setConfig(Resource config) { 114 setConfigLocations(new Resource[] { config }); 115 } 116 117 public void setConfigLocations(Resource[] configLocations) { 118 this.configLocations = new ArrayList (); 119 if (configLocations != null) { 120 for (int i = 0; i < configLocations.length; i++) { 121 this.configLocations.add(configLocations[i]); 122 } 123 } 124 configWatcher.setResources(this.configLocations); 125 } 126 127 public Class getDefaultBeanClass() { 128 return this.defaultBeanClass; 129 } 130 131 public void setDefaultBeanClass(Class defaultBeanClass) { 132 this.defaultBeanClass = defaultBeanClass; 133 } 134 135 public boolean isReloadable() { 136 return this.reloadable; 137 } 138 139 public void setReloadable(boolean reloadable) { 140 if (!reloadable) { 141 log.info("Modification checks have been disabled."); 142 } 143 this.reloadable = reloadable; 144 } 145 146 public void addListener(ConfigurationEventListener listener) { 147 configWatcher.addListener(listener); 148 } 149 150 public void setBeanFactory(BeanFactory beanFactory) { 151 this.beanFactory = beanFactory; 152 } 153 154 public void setMimetypesMap(MimetypesFileTypeMap mimetypesMap) { 155 this.mimetypesMap = mimetypesMap; 156 } 157 158 public MimetypesFileTypeMap getMimetypesMap() { 159 return this.mimetypesMap; 160 } 161 162 public ImageCropper getImageCropper() { 163 return this.imageCropper; 164 } 165 166 public void setImageCropper(ImageCropper imageCropper) { 167 this.imageCropper = imageCropper; 168 } 169 170 public final void afterPropertiesSet() throws Exception { 171 digester = new XmlFormRepositoryDigester(this, beanFactory); 172 configure(); 173 } 174 175 public FormFactory getFormFactory(String id) { 176 configWatcher.checkForModifications(); 177 return super.getFormFactory(id); 178 } 179 180 public void configure() { 181 getFactories().clear(); 182 Iterator it = configLocations.iterator(); 183 while (it.hasNext()) { 184 Resource res = (Resource) it.next(); 185 if (res.exists()) { 186 DocumentReader reader = new ValidatingDocumentReader(res); 187 digester.digest(reader.readDocument(), res); 188 } 189 } 190 } 191 192 } 193 | Popular Tags |