1 28 29 package com.opencms.template; 30 31 import org.opencms.file.CmsFile; 32 import org.opencms.file.CmsObject; 33 import org.opencms.file.CmsResource; 34 import org.opencms.file.CmsResourceFilter; 35 import org.opencms.importexport.CmsCompatibleCheck; 36 import org.opencms.main.CmsException; 37 import org.opencms.main.CmsLog; 38 import org.opencms.staticexport.CmsLinkManager; 39 40 import com.opencms.legacy.CmsLegacyException; 41 import com.opencms.template.cache.CmsElementDefinition; 42 import com.opencms.template.cache.CmsElementDefinitionCollection; 43 44 import java.util.Enumeration ; 45 import java.util.Hashtable ; 46 import java.util.Vector ; 47 48 import org.w3c.dom.Document ; 49 import org.w3c.dom.Element ; 50 import org.w3c.dom.Node ; 51 import org.w3c.dom.NodeList ; 52 53 61 public class CmsXmlControlFile extends A_CmsXmlContent { 62 63 66 public CmsXmlControlFile() { 67 68 super(); 69 } 70 71 79 public CmsXmlControlFile(CmsObject cms, CmsFile file) 80 throws CmsException { 81 82 super(); 83 init(cms, file); 84 } 85 86 94 public CmsXmlControlFile(CmsObject cms, String filename) 95 throws CmsException { 96 97 super(); 98 init(cms, filename); 99 } 100 101 110 public CmsXmlControlFile(CmsObject cms, String filename, String content) 111 throws CmsException { 112 113 super(); 114 init(cms, filename, content); 115 } 116 117 121 public String getContentDescription() { 122 123 return "OpenCms XML page file"; 124 } 125 126 132 public String getElementClass(String elementName) throws CmsException { 133 134 return getDataValue("ELEMENTDEF." + elementName + ".CLASS"); 135 } 136 137 143 public CmsElementDefinitionCollection getElementDefinitionCollection() throws CmsException { 144 145 CmsElementDefinitionCollection result = new CmsElementDefinitionCollection(); 146 Enumeration elementDefinitions = getElementDefinitions(); 147 while (elementDefinitions.hasMoreElements()) { 148 String elementName = (String )elementDefinitions.nextElement(); 149 150 String elementClass = null; 151 String elementTemplate = null; 152 String elementTs = null; 153 if (isElementClassDefined(elementName)) { 154 elementClass = getElementClass(elementName); 155 } 156 if (isElementTemplateDefined(elementName)) { 157 elementTemplate = getElementTemplate(elementName); 158 } 159 if (isElementTemplSelectorDefined(elementName)) { 160 elementTs = getElementTemplSelector(elementName); 161 } 162 Hashtable elementParameters = getElementParameters(elementName); 163 if (elementClass == null) { 164 elementClass = CmsCompatibleCheck.XML_CONTROL_DEFAULT_CLASS; 165 } 166 if (elementTemplate != null) { 167 elementTemplate = CmsLinkManager.getAbsoluteUri(elementTemplate, getAbsoluteFilename()); 168 } 169 result.add(new CmsElementDefinition( 170 elementName, 171 elementClass, 172 elementTemplate, 173 elementTs, 174 elementParameters)); 175 } 176 return result; 177 } 178 179 185 public Enumeration getElementDefinitions() throws CmsException { 186 187 NodeList elementDefTags = getXmlDocument().getDocumentElement().getChildNodes(); 188 return getNamesFromNodeList(elementDefTags, "ELEMENTDEF", false); 189 } 190 191 198 public String getElementParameter(String elementName, String parameterName) throws CmsException { 199 200 return getDataValue("ELEMENTDEF." + elementName + ".PARAMETER." + parameterName); 201 } 202 203 209 public Enumeration getElementParameterNames(String elementName) throws CmsException { 210 211 Element elementDefinition = getData("elementdef." + elementName); 212 NodeList parameterTags = elementDefinition.getChildNodes(); 213 return getNamesFromNodeList(parameterTags, "PARAMETER", false); 214 } 215 216 222 public Hashtable getElementParameters(String elementName) throws CmsException { 223 224 Hashtable result = new Hashtable (); 225 Element elementDefinition = getData("elementdef." + elementName); 226 NodeList parameterTags = elementDefinition.getChildNodes(); 227 228 int numElements = parameterTags.getLength(); 229 for (int i = 0; i < numElements; i++) { 230 Node n = parameterTags.item(i); 231 if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().toLowerCase().equals("parameter")) { 232 String name = ((Element )n).getAttribute("name"); 233 if (name != null && !"".equals(name)) { 234 result.put(name, getTagValue((Element )n)); 235 } 236 } 237 } 238 return result; 239 } 240 241 247 public String getElementTemplate(String elementName) throws CmsException { 248 249 String result = getDataValue("ELEMENTDEF." + elementName + ".TEMPLATE"); 251 return result; 252 } 253 254 260 public String getElementTemplSelector(String elementName) throws CmsException { 261 262 return getDataValue("ELEMENTDEF." + elementName + ".TEMPLATESELECTOR"); 263 } 264 265 271 public String getMasterTemplate() throws CmsException { 272 273 String result = getDataValue("mastertemplate"); 274 if (result == null || "".equals(result)) { 275 if (CmsLog.getLog(this).isErrorEnabled()) { 276 CmsLog.getLog(this).error("<MASTERTEMPLATE> tag not found in file " + getAbsoluteFilename()); 277 } 278 removeFromFileCache(); 279 throw new CmsLegacyException("\"MASTERTEMPLATE\" definition tag not found in file " 280 + getAbsoluteFilename() 281 + ".", CmsLegacyException.C_XML_TAG_MISSING); 282 } 283 return result; 284 } 285 286 292 public String getParameter(String parameterName) throws CmsException { 293 294 return getDataValue("PARAMETER." + parameterName); 295 } 296 297 302 public Enumeration getParameterNames() throws CmsException { 303 304 NodeList parameterTags = getXmlDocument().getDocumentElement().getChildNodes(); 305 return getNamesFromNodeList(parameterTags, "PARAMETER", false); 306 } 307 308 313 public String getTemplateClass() throws CmsException { 314 315 return getDataValue("class"); 316 } 317 318 323 public String getXmlDocumentTagName() { 324 325 return "PAGE"; 326 } 327 328 334 public boolean isElementClassDefined(String elementName) { 335 336 return this.hasData("ELEMENTDEF." + elementName + ".CLASS"); 337 } 338 339 345 public boolean isElementTemplateDefined(String elementName) { 346 347 return this.hasData("ELEMENTDEF." + elementName + ".TEMPLATE"); 348 } 349 350 356 public boolean isElementTemplSelectorDefined(String elementName) { 357 358 return this.hasData("ELEMENTDEF." + elementName + ".TEMPLATESELECTOR"); 359 } 360 361 366 public void setElementClass(String elementName, String classname) { 367 368 createElementDef(elementName); 369 setData("ELEMENTDEF." + elementName + ".CLASS", classname); 370 } 371 372 378 public void setElementParameter(String elementName, String parameterName, String parameterValue) { 379 380 createElementDef(elementName); 381 if (!hasData("ELEMENTDEF." + elementName + ".PARAMETER." + parameterName)) { 382 Document doc = getXmlDocument(); 383 Element e = doc.createElement("PARAMETER"); 384 e.setAttribute("name", parameterName); 385 e.appendChild(doc.createTextNode(parameterValue)); 386 setData("ELEMENTDEF." + elementName + ".PARAMETER." + parameterName, e); 387 } else { 388 setData("ELEMENTDEF." + elementName + ".PARAMETER." + parameterName, parameterValue); 389 } 390 } 391 392 397 public void setElementTemplate(String elementName, String filename) { 398 399 createElementDef(elementName); 400 setData("ELEMENTDEF." + elementName + ".TEMPLATE", filename); 401 } 402 403 408 public void setElementTemplSelector(String elementName, String templateSelector) { 409 410 createElementDef(elementName); 411 setData("ELEMENTDEF." + elementName + ".TEMPLATESELECTOR", templateSelector); 412 } 413 414 419 public void setMasterTemplate(String template) { 420 421 setData("masterTemplate", template); 422 } 423 424 429 public void setParameter(String parameterName, String parameterValue) { 430 431 if (!hasData("PARAMETER." + parameterName)) { 432 Document doc = getXmlDocument(); 433 Element e = doc.createElement("PARAMETER"); 434 e.setAttribute("name", parameterName); 435 e.appendChild(doc.createTextNode(parameterValue)); 436 setData("PARAMETER." + parameterName, e); 437 } else { 438 setData("PARAMETER." + parameterName, parameterValue); 439 } 440 } 441 442 447 public void setTemplateClass(String templateClass) { 448 449 setData("class", templateClass); 450 } 451 452 464 public String validateBodyPath(CmsObject cms, String bodyPath, CmsResource page) { 465 466 String validatedBodyPath = null; 467 468 if (bodyPath == null || "".equals(bodyPath)) { 469 return bodyPath; 470 } 471 472 try { 473 cms.readResource(bodyPath, CmsResourceFilter.ALL); 474 validatedBodyPath = bodyPath; 475 } catch (CmsException e) { 476 if ((e instanceof CmsLegacyException) 477 && (((CmsLegacyException)e).getType() == CmsLegacyException.C_NOT_FOUND)) { 478 479 String defaultBodyPath = CmsCompatibleCheck.VFS_PATH_BODIES 480 + CmsResource.getParentFolder(cms.getSitePath(page)).substring(1) 481 + page.getName(); 482 try { 483 cms.readResource(defaultBodyPath, CmsResourceFilter.ALL); 484 validatedBodyPath = defaultBodyPath; 485 setElementTemplate(CmsXmlTemplate.C_BODY_ELEMENT, validatedBodyPath); 486 } catch (CmsException e1) { 487 validatedBodyPath = null; 488 } 489 } 490 } 491 492 return validatedBodyPath; 493 } 494 495 504 private void createElementDef(String name) { 505 506 if (!hasData("ELEMENTDEF." + name)) { 507 Document doc = getXmlDocument(); 508 Element e = doc.createElement("ELEMENTDEF"); 509 e.setAttribute("name", name); 510 setData("elementdef." + name, e); 511 } 512 } 513 514 524 private Enumeration getNamesFromNodeList(NodeList nl, String tag, boolean unnamedAllowed) throws CmsException { 525 526 int numElements = nl.getLength(); 527 Vector collectNames = new Vector (); 528 for (int i = 0; i < numElements; i++) { 529 Node n = nl.item(i); 530 if (n.getNodeType() == Node.ELEMENT_NODE && n.getNodeName().toLowerCase().equals(tag.toLowerCase())) { 531 String name = ((Element )n).getAttribute("name"); 532 if (name == null || "".equals(name)) { 533 534 if (unnamedAllowed) { 536 name = "(default)"; 537 } else { 538 if (CmsLog.getLog(this).isErrorEnabled()) { 539 CmsLog.getLog(this).error( 540 "Unnamed <" 541 + n.getNodeName() 542 + "> found in OpenCms control file " 543 + getAbsoluteFilename()); 544 } 545 throw new CmsLegacyException("Unnamed \"" 546 + n.getNodeName() 547 + "\" found in OpenCms control file " 548 + getAbsoluteFilename(), CmsLegacyException.C_XML_TAG_MISSING); 549 } 550 } 551 collectNames.addElement(name); 552 } 553 } 554 return collectNames.elements(); 555 } 556 557 } 558 | Popular Tags |