1 24 package org.ofbiz.widget.form; 25 26 import java.io.IOException ; 27 import java.net.URL ; 28 import java.util.HashMap ; 29 import java.util.Iterator ; 30 import java.util.List ; 31 import java.util.Map ; 32 import javax.servlet.ServletContext ; 33 import javax.servlet.http.HttpServletRequest ; 34 import javax.xml.parsers.ParserConfigurationException ; 35 36 import org.ofbiz.base.location.FlexibleLocation; 37 import org.ofbiz.base.util.UtilHttp; 38 import org.ofbiz.base.util.UtilXml; 39 import org.ofbiz.base.util.cache.UtilCache; 40 import org.ofbiz.entity.GenericDelegator; 41 import org.ofbiz.service.LocalDispatcher; 42 43 import org.w3c.dom.Document ; 44 import org.w3c.dom.Element ; 45 import org.xml.sax.SAXException ; 46 47 48 55 public class FormFactory { 56 57 public static final String module = FormFactory.class.getName(); 58 59 public static final UtilCache formLocationCache = new UtilCache("widget.form.locationResource", 0, 0, false); 60 public static final UtilCache formWebappCache = new UtilCache("widget.form.webappResource", 0, 0, false); 61 62 public static ModelForm getFormFromLocation(String resourceName, String formName, GenericDelegator delegator, LocalDispatcher dispatcher) 63 throws IOException , SAXException , ParserConfigurationException { 64 Map modelFormMap = (Map ) formLocationCache.get(resourceName); 65 if (modelFormMap == null) { 66 synchronized (FormFactory.class) { 67 modelFormMap = (Map ) formLocationCache.get(resourceName); 68 if (modelFormMap == null) { 69 ClassLoader loader = Thread.currentThread().getContextClassLoader(); 70 if (loader == null) { 71 loader = FormFactory.class.getClassLoader(); 72 } 73 74 URL formFileUrl = null; 75 formFileUrl = FlexibleLocation.resolveLocation(resourceName); Document formFileDoc = UtilXml.readXmlDocument(formFileUrl, true); 77 modelFormMap = readFormDocument(formFileDoc, delegator, dispatcher); 78 formLocationCache.put(resourceName, modelFormMap); 79 } 80 } 81 } 82 83 ModelForm modelForm = (ModelForm) modelFormMap.get(formName); 84 if (modelForm == null) { 85 throw new IllegalArgumentException ("Could not find form with name [" + formName + "] in class resource [" + resourceName + "]"); 86 } 87 return modelForm; 88 } 89 90 public static ModelForm getFormFromWebappContext(String resourceName, String formName, HttpServletRequest request) 91 throws IOException , SAXException , ParserConfigurationException { 92 String webappName = UtilHttp.getApplicationName(request); 93 String cacheKey = webappName + "::" + resourceName; 94 95 96 Map modelFormMap = (Map ) formWebappCache.get(cacheKey); 97 if (modelFormMap == null) { 98 synchronized (FormFactory.class) { 99 modelFormMap = (Map ) formWebappCache.get(cacheKey); 100 if (modelFormMap == null) { 101 ServletContext servletContext = (ServletContext ) request.getAttribute("servletContext"); 102 GenericDelegator delegator = (GenericDelegator) request.getAttribute("delegator"); 103 LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); 104 105 URL formFileUrl = servletContext.getResource(resourceName); 106 Document formFileDoc = UtilXml.readXmlDocument(formFileUrl, true); 107 modelFormMap = readFormDocument(formFileDoc, delegator, dispatcher); 108 formWebappCache.put(cacheKey, modelFormMap); 109 } 110 } 111 } 112 113 ModelForm modelForm = (ModelForm) modelFormMap.get(formName); 114 if (modelForm == null) { 115 throw new IllegalArgumentException ("Could not find form with name [" + formName + "] in webapp resource [" + resourceName + "] in the webapp [" + webappName + "]"); 116 } 117 return modelForm; 118 } 119 120 public static Map readFormDocument(Document formFileDoc, GenericDelegator delegator, LocalDispatcher dispatcher) { 121 Map modelFormMap = new HashMap (); 122 if (formFileDoc != null) { 123 Element rootElement = formFileDoc.getDocumentElement(); 125 List formElements = UtilXml.childElementList(rootElement, "form"); 126 Iterator formElementIter = formElements.iterator(); 127 while (formElementIter.hasNext()) { 128 Element formElement = (Element ) formElementIter.next(); 129 ModelForm modelForm = new ModelForm(formElement, delegator, dispatcher); 130 modelFormMap.put(modelForm.getName(), modelForm); 131 } 132 } 133 return modelFormMap; 134 } 135 } 136 | Popular Tags |