1 24 package org.ofbiz.widget.tree; 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 TreeFactory { 56 57 public static final String module = TreeFactory.class.getName(); 58 59 public static final UtilCache treeLocationCache = new UtilCache("widget.tree.locationResource", 0, 0, false); 60 public static final UtilCache treeWebappCache = new UtilCache("widget.tree.webappResource", 0, 0, false); 61 62 public static ModelTree getTreeFromLocation(String resourceName, String treeName, GenericDelegator delegator, LocalDispatcher dispatcher) 63 throws IOException , SAXException , ParserConfigurationException { 64 Map modelTreeMap = (Map ) treeLocationCache.get(resourceName); 65 if (modelTreeMap == null) { 66 synchronized (TreeFactory.class) { 67 modelTreeMap = (Map ) treeLocationCache.get(resourceName); 68 if (modelTreeMap == null) { 69 ClassLoader loader = Thread.currentThread().getContextClassLoader(); 70 if (loader == null) { 71 loader = TreeFactory.class.getClassLoader(); 72 } 73 74 URL treeFileUrl = null; 75 treeFileUrl = FlexibleLocation.resolveLocation(resourceName); Document treeFileDoc = UtilXml.readXmlDocument(treeFileUrl, true); 77 modelTreeMap = readTreeDocument(treeFileDoc, delegator, dispatcher); 78 treeLocationCache.put(resourceName, modelTreeMap); 79 } 80 } 81 } 82 83 ModelTree modelTree = (ModelTree) modelTreeMap.get(treeName); 84 if (modelTree == null) { 85 throw new IllegalArgumentException ("Could not find tree with name [" + treeName + "] in class resource [" + resourceName + "]"); 86 } 87 return modelTree; 88 } 89 90 public static ModelTree getTreeFromWebappContext(String resourceName, String treeName, HttpServletRequest request) 91 throws IOException , SAXException , ParserConfigurationException { 92 String webappName = UtilHttp.getApplicationName(request); 93 String cacheKey = webappName + "::" + resourceName; 94 95 96 Map modelTreeMap = (Map ) treeWebappCache.get(cacheKey); 97 if (modelTreeMap == null) { 98 synchronized (TreeFactory.class) { 99 modelTreeMap = (Map ) treeWebappCache.get(cacheKey); 100 if (modelTreeMap == 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 treeFileUrl = servletContext.getResource(resourceName); 106 Document treeFileDoc = UtilXml.readXmlDocument(treeFileUrl, true); 107 modelTreeMap = readTreeDocument(treeFileDoc, delegator, dispatcher); 108 treeWebappCache.put(cacheKey, modelTreeMap); 109 } 110 } 111 } 112 113 ModelTree modelTree = (ModelTree) modelTreeMap.get(treeName); 114 if (modelTree == null) { 115 throw new IllegalArgumentException ("Could not find tree with name [" + treeName + "] in webapp resource [" + resourceName + "] in the webapp [" + webappName + "]"); 116 } 117 return modelTree; 118 } 119 120 public static Map readTreeDocument(Document treeFileDoc, GenericDelegator delegator, LocalDispatcher dispatcher) { 121 Map modelTreeMap = new HashMap (); 122 if (treeFileDoc != null) { 123 Element rootElement = treeFileDoc.getDocumentElement(); 125 List treeElements = UtilXml.childElementList(rootElement, "tree"); 126 Iterator treeElementIter = treeElements.iterator(); 127 while (treeElementIter.hasNext()) { 128 Element treeElement = (Element ) treeElementIter.next(); 129 ModelTree modelTree = new ModelTree(treeElement, delegator, dispatcher); 130 modelTreeMap.put(modelTree.getName(), modelTree); 131 } 132 } 133 return modelTreeMap; 134 } 135 } 136 | Popular Tags |