1 31 32 package org.opencms.frontend.templateone; 33 34 import org.opencms.i18n.CmsMessages; 35 import org.opencms.jsp.CmsJspActionElement; 36 import org.opencms.main.CmsEvent; 37 import org.opencms.main.CmsLog; 38 import org.opencms.main.I_CmsEventListener; 39 import org.opencms.main.OpenCms; 40 41 import java.util.Collections ; 42 import java.util.Locale ; 43 import java.util.Map ; 44 45 import org.apache.commons.collections.map.LRUMap; 46 import org.apache.commons.logging.Log; 47 48 59 public final class CmsTemplateParts implements I_CmsEventListener { 60 61 62 public static final String KEY_ILLEGAL = "illpart"; 63 64 65 private static final Log LOG = CmsLog.getLog(CmsTemplateParts.class); 66 67 68 private static CmsTemplateParts m_instance; 69 70 71 private Map m_parts; 72 73 78 private CmsTemplateParts() { 79 80 initPartsMap(); 82 OpenCms.addCmsEventListener(this); 84 } 85 86 91 public static CmsTemplateParts getInstance() { 92 93 if (m_instance == null) { 94 m_instance = new CmsTemplateParts(); 96 } 97 return m_instance; 98 } 99 100 106 public void addPart(String partKey, String value) { 107 108 if (!partKey.equals(KEY_ILLEGAL)) { 109 m_parts.put(partKey, value); 111 } 112 } 113 114 119 public void cmsEvent(CmsEvent event) { 120 121 switch (event.getType()) { 122 case I_CmsEventListener.EVENT_PUBLISH_PROJECT: 123 case I_CmsEventListener.EVENT_CLEAR_CACHES: 124 case I_CmsEventListener.EVENT_FLEX_CACHE_CLEAR: 125 case I_CmsEventListener.EVENT_FLEX_PURGE_JSP_REPOSITORY: 126 initPartsMap(); 128 if (LOG.isDebugEnabled()) { 129 LOG.debug(Messages.get().getBundle().key(Messages.LOG_CMSTEMPLATEPARTS_CLEARED_0)); 130 } 131 break; 132 default: } 134 } 135 136 142 public String getPart(String partKey) { 143 144 return (String )m_parts.get(partKey); 145 } 146 147 157 public String includePart(String target, String element, String layout, CmsJspActionElement jsp) { 158 159 if (OpenCms.getRunLevel() < OpenCms.RUNLEVEL_4_SERVLET_ACCESS) { 160 return ""; 162 } 163 String part = null; 164 String partKey = ""; 165 166 try { 167 partKey = generateKey( 169 target, 170 element, 171 layout, 172 jsp.getRequestContext().getLocale(), 173 jsp.getRequestContext().currentProject().getId()); 174 part = (String )m_parts.get(partKey); 176 if (part == null) { 177 part = jsp.getContent(target, element, jsp.getRequestContext().getLocale()); 179 if (part != null && !part.startsWith(CmsMessages.UNKNOWN_KEY_EXTENSION)) { 180 addPart(partKey, part); 182 } else { 183 part = ""; 185 } 186 if (LOG.isDebugEnabled()) { 187 LOG.debug(Messages.get().getBundle().key(Messages.LOG_INCLUDE_PART_NOT_FOUND_1, partKey)); 188 } 189 } else if (LOG.isDebugEnabled()) { 190 LOG.debug(Messages.get().getBundle().key(Messages.LOG_INCLUDE_PART_FOUND_1, partKey)); 191 } 192 } catch (Throwable t) { 193 part = ""; 195 if (LOG.isDebugEnabled()) { 196 LOG.debug(Messages.get().getBundle().key(Messages.LOG_INCLUDE_PART_ERR_2, partKey, t)); 197 } 198 } 199 return part; 200 } 201 202 210 private String generateKey(String target, String element, String layout, Locale locale, int project) { 211 212 try { 213 if (element == null) { 214 element = ""; 216 } 217 StringBuffer partKey = new StringBuffer (32); 219 partKey.append(target); 220 partKey.append("_"); 221 partKey.append(element); 222 partKey.append("_"); 223 partKey.append(layout); 224 partKey.append("_"); 225 partKey.append(locale); 226 partKey.append("_"); 227 partKey.append(project); 228 return partKey.toString(); 229 } catch (Exception e) { 230 return KEY_ILLEGAL; 232 } 233 } 234 235 238 private synchronized Map initPartsMap() { 239 240 LRUMap cacheParts = new LRUMap(512); 241 Map oldParts = m_parts; 242 m_parts = Collections.synchronizedMap(cacheParts); 243 if (oldParts != null) { 244 oldParts.clear(); 245 oldParts = null; 246 } 247 return m_parts; 248 } 249 } | Popular Tags |