/* ===============================================================================
*
* Part of the InfoGlue Content Management Platform (www.infoglue.org)
*
* ===============================================================================
*
* Copyright (C)
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License version 2, as published by the
* Free Software Foundation. See the file LICENSE.html for more information.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY, including the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc. / 59 Temple
* Place, Suite 330 / Boston, MA 02111-1307 / USA.
*
* ===============================================================================
*/
package org.infoglue.deliver.invokers;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.log4j.Logger;
import org.exolab.castor.jdo.Database;
import org.infoglue.cms.applications.common.VisualFormatter;
import org.infoglue.cms.controllers.kernel.impl.simple.ContentVersionController;
import org.infoglue.cms.controllers.kernel.impl.simple.LanguageController;
import org.infoglue.cms.controllers.kernel.impl.simple.SiteNodeVersionController;
import org.infoglue.cms.entities.content.ContentVO;
import org.infoglue.cms.entities.content.ContentVersionVO;
import org.infoglue.cms.entities.content.DigitalAssetVO;
import org.infoglue.cms.entities.content.impl.simple.MediumContentVersionImpl;
import org.infoglue.cms.entities.management.ContentTypeDefinitionVO;
import org.infoglue.cms.entities.management.LanguageVO;
import org.infoglue.cms.entities.structure.SiteNodeVO;
import org.infoglue.cms.entities.structure.SiteNodeVersionVO;
import org.infoglue.cms.exception.SystemException;
import org.infoglue.cms.providers.ComponentModel;
import org.infoglue.cms.util.CmsPropertyHandler;
import org.infoglue.cms.util.dom.DOMBuilder;
import org.infoglue.deliver.applications.actions.InfoGlueComponent;
import org.infoglue.deliver.applications.databeans.ComponentBinding;
import org.infoglue.deliver.applications.databeans.ComponentRestriction;
import org.infoglue.deliver.applications.databeans.DeliveryContext;
import org.infoglue.deliver.applications.databeans.Slot;
import org.infoglue.deliver.applications.databeans.SupplementedComponentBinding;
import org.infoglue.deliver.controllers.kernel.impl.simple.ComponentLogic;
import org.infoglue.deliver.controllers.kernel.impl.simple.ContentDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.LanguageDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.NodeDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.RepositoryDeliveryController;
import org.infoglue.deliver.controllers.kernel.impl.simple.TemplateController;
import org.infoglue.deliver.util.CacheController;
import org.infoglue.deliver.util.NullObject;
import org.infoglue.deliver.util.RequestAnalyser;
import org.infoglue.deliver.util.Timer;
import org.infoglue.deliver.util.VelocityTemplateProcessor;
import org.xmlpull.v1.builder.XmlAttribute;
import org.xmlpull.v1.builder.XmlDocument;
import org.xmlpull.v1.builder.XmlElement;
import org.xmlpull.v1.builder.XmlInfosetBuilder;
import org.xmlpull.v1.builder.xpath.Xb1XPath;
/**
* @author Mattias Bogeblad
*
* This class delivers a normal html page by using the component-based method.
*/
public class ComponentBasedHTMLPageInvoker extends PageInvoker
{
private final static DOMBuilder domBuilder = new DOMBuilder();
private final static VisualFormatter vf = new VisualFormatter();
private final static Logger logger = Logger.getLogger(ComponentBasedHTMLPageInvoker.class.getName());
/**
* This method should return an instance of the class that should be used for page editing inside the tools or in working.
* Makes it possible to have an alternative to the ordinary delivery optimized class.
*/
public PageInvoker getDecoratedPageInvoker(TemplateController templateController, DeliveryContext deliveryContext) throws SystemException
{
if(templateController.getIsEditOnSightDisabled() && !deliveryContext.getShowSimple())
return this;
String repositoryDecoratedPageInvoker = RepositoryDeliveryController.getRepositoryDeliveryController().getExtraPropertyValue(templateController.getSiteNode().getRepositoryId(), "decoratedPageInvoker");
if(repositoryDecoratedPageInvoker != null && !repositoryDecoratedPageInvoker.equals(""))
{
if(repositoryDecoratedPageInvoker != null && repositoryDecoratedPageInvoker.equalsIgnoreCase("ajax"))
return new AjaxDecoratedComponentBasedHTMLPageInvoker();
else
return new DecoratedComponentBasedHTMLPageInvoker();
}
else
{
String decoratedPageInvoker = CmsPropertyHandler.getDecoratedPageInvoker();
if(decoratedPageInvoker != null && decoratedPageInvoker.equalsIgnoreCase("ajax"))
return new AjaxDecoratedComponentBasedHTMLPageInvoker();
else
return new DecoratedComponentBasedHTMLPageInvoker();
}
}
protected String appendPagePartTemplates(String componentXML, Integer siteNodeId) throws Exception
{
String resultComponentXML = componentXML;
List entries = new ArrayList();
int isPagePartReferenceIndex = componentXML.indexOf("isPagePartReference");
while(isPagePartReferenceIndex > -1)
{
int tagStartIndex = componentXML.lastIndexOf("<component ", isPagePartReferenceIndex);
int tagEndIndex = componentXML.indexOf(">", isPagePartReferenceIndex);
String componentString = componentXML.substring(tagStartIndex, tagEndIndex);
int contentIdIndex = componentString.indexOf(" contentId=");
String contentId = componentString.substring(contentIdIndex + 12, componentString.indexOf("\"", contentIdIndex + 12));
int idIndex = componentString.indexOf(" id=");
String id = componentString.substring(idIndex + 5, componentString.indexOf("\"", idIndex + 5));
int nameIndex = componentString.indexOf(" name=");
String name = componentString.substring(nameIndex + 7, componentString.indexOf("\"", nameIndex + 7));
Map entry = new HashMap();
entry.put("contentId", contentId);
entry.put("id", id);
entry.put("name", name);
entries.add(entry);
isPagePartReferenceIndex = componentXML.indexOf("isPagePartReference", isPagePartReferenceIndex + 20);
}
Iterator entriesIterator = entries.iterator();
while(entriesIterator.hasNext())
{
Map entry = (Map)entriesIterator.next();
String contentIdString = (String)entry.get("contentId");
Integer contentId = new Integer(contentIdString);
String id = (String)entry.get("id");
String name = (String)entry.get("name");
try
{
ContentTypeDefinitionVO contentTypeDefinitionVO = ContentDeliveryController.getContentDeliveryController().getContentTypeDefinitionVO(getDatabase(), contentId);
if(contentTypeDefinitionVO != null && contentTypeDefinitionVO.getName().equals("PagePartTemplate"))
{
//logger.info("This was a pagePart reference..");
this.getTemplateController().getDeliveryContext().addUsedContent("selectiveCacheUpdateNonApplicable");
String pagePartString = this.getTemplateController().getContentAttribute(contentId, "ComponentStructure", true);
logger.info("pagePartString: " + pagePartString);
if(pagePartString == null || pagePartString.equals(""))
{
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(getTemplateController().getDatabase(), contentId, getTemplateController().getDeliveryContext());
LanguageVO masterLanguageVO = LanguageController.getController().getMasterLanguage(contentVO.getRepositoryId(), getTemplateController().getDatabase());
pagePartString = this.getTemplateController().getContentAttribute(contentId, masterLanguageVO.getId(), "ComponentStructure", true);
logger.info("pagePartString: " + pagePartString);
}
pagePartString = pagePartString.replaceFirst(" id=\".*?\"", " id=\"" + id + "\"");
pagePartString = pagePartString.replaceFirst(" name=\".*?\"", " name=\"" + name + "\"");
pagePartString = pagePartString.replaceFirst(" pagePartTemplateContentId=\".*?\"", " pagePartTemplateContentId=\"" + contentId + "\"");
logger.info("Bytte id och namn: " + pagePartString);
pagePartString = pagePartString.substring(pagePartString.indexOf("<component "));
pagePartString = pagePartString.substring(0, pagePartString.lastIndexOf("</components>"));
//logger.info("componentXML: " + componentXML);
logger.info("contentId" + contentId);
logger.info("pagePartString" + pagePartString);
pagePartString = Matcher.quoteReplacement(pagePartString);
String newComponentXML = componentXML.replaceAll("<component contentId=\"" + contentId + ".*?</component>", "" + pagePartString);
//logger.info("newComponentXML: " + newComponentXML);
resultComponentXML = newComponentXML;
}
}
catch (Exception e)
{
logger.warn("Could not append page part as the content was removed - fix on page with id: [" + siteNodeId + "]:" + e.getMessage());
}
}
return resultComponentXML;
}
/**
* This is the method that will render the page. It uses the new component based structure.
*/
public void invokePage() throws SystemException, Exception
{
String pageContent = "";
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(this.getDeliveryContext());
Integer repositoryId = nodeDeliveryController.getSiteNodeVO(getDatabase(), this.getDeliveryContext().getSiteNodeId()).getRepositoryId();
String componentXML = getPageComponentsString(getDatabase(), this.getTemplateController(), this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId());
componentXML = appendPagePartTemplates(componentXML, this.getDeliveryContext().getSiteNodeId());
InfoGlueComponent baseComponent = null;
if(componentXML != null && componentXML.length() != 0)
{
Timer t = new Timer();
List unsortedPageComponents = new ArrayList();
try
{
//DOM4J
/*
Document document = domBuilder.getDocument(componentXML);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("document with DOM4J", t.getElapsedTime());
List pageComponents = getPageComponentsWithDOM4j(getDatabase(), componentXML, document.getRootElement(), "base", this.getTemplateController(), null, unsortedPageComponents);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getPageComponentsWithDOM4j", t.getElapsedTime());
logger.info("pageComponents:" + pageComponents.size());
*/
//XPP3
XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance();
XmlDocument doc = builder.parseReader(new StringReader( componentXML ) );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("document with XPP3", t.getElapsedTime());
List pageComponents = getPageComponentsWithXPP3(getDatabase(), componentXML, doc.getDocumentElement(), "base", this.getTemplateController(), null, unsortedPageComponents);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getPageComponentsWithXPP3", t.getElapsedTime());
//logger.info("pageComponents:" + pageComponents.size());
preProcessComponents(nodeDeliveryController, repositoryId, unsortedPageComponents, pageComponents);
if(pageComponents.size() > 0)
{
baseComponent = (InfoGlueComponent)pageComponents.get(0);
}
if(baseComponent != null)
{
ContentVO metaInfoContentVO = nodeDeliveryController.getBoundContent(getDatabase(), this.getTemplateController().getPrincipal(), this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), true, "Meta information", this.getDeliveryContext());
pageContent = renderComponent(baseComponent, this.getTemplateController(), repositoryId, this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId(), metaInfoContentVO.getId(), 15, 0);
}
}
catch (Exception e)
{
logger.error("Error parsing page:" + e.getMessage(), e);
}
}
/*
Map context = getDefaultContext();
StringWriter cacheString = new StringWriter();
PrintWriter cachedStream = new PrintWriter(cacheString);
new VelocityTemplateProcessor().renderTemplate(context, cachedStream, pageContent, false, baseComponent);
String pageString = pageContent;
if(this.getDeliveryContext().getEvaluateFullPage())
pageString = cacheString.toString();
pageString = this.getTemplateController().decoratePage(pageString);
this.setPageString(pageString);
*/
String pageString = pageContent;
if(logger.isInfoEnabled())
logger.info("\n\nEvaluateFull:" + this.getDeliveryContext().getEvaluateFullPage());
if(this.getDeliveryContext().getEvaluateFullPage() && pageContent.length() < 1000000)
{
try
{
Map context = getDefaultContext();
StringWriter cacheString = new StringWriter();
PrintWriter cachedStream = new PrintWriter(cacheString);
new VelocityTemplateProcessor().renderTemplate(context, cachedStream, pageContent, false, baseComponent);
pageString = cacheString.toString();
}
catch (Exception e)
{
pageString = pageContent;
logger.error("Could not evaluate full page: " + e.getMessage(), e);
}
}
else if(pageContent.length() > 1000000)
logger.warn("The page:" + this.getTemplateController().getOriginalFullURL() + " was to big to evaluate full:" + pageContent.length());
//pageString = decorateHeadAndPageWithVarsFromComponents(pageString);
this.setPageString(pageString);
}
protected void preProcessComponents(NodeDeliveryController nodeDeliveryController, Integer repositoryId, List unsortedPageComponents, List pageComponents) throws SystemException, Exception
{
List sortedPageComponents = new ArrayList();
Iterator unsortedPageComponentsIterator = unsortedPageComponents.iterator();
while(unsortedPageComponentsIterator.hasNext())
{
InfoGlueComponent component = (InfoGlueComponent)unsortedPageComponentsIterator.next();
//this.getTemplateController().setComponentLogic(new ComponentLogic(this.getTemplateController(), component));
//this.getTemplateController().getDeliveryContext().getUsageListeners().add(this.getTemplateController().getComponentLogic().getComponentDeliveryContext());
int index = 0;
Iterator sortedPageComponentsIterator = sortedPageComponents.iterator();
while(sortedPageComponentsIterator.hasNext())
{
InfoGlueComponent sortedComponent = (InfoGlueComponent)sortedPageComponentsIterator.next();
//this.getTemplateController().setComponentLogic(new ComponentLogic(this.getTemplateController(), sortedComponent));
//this.getTemplateController().getDeliveryContext().getUsageListeners().add(this.getTemplateController().getComponentLogic().getComponentDeliveryContext());
if(sortedComponent.getPreProcessingOrder().compareTo(component.getPreProcessingOrder()) < 0)
break;
index++;
}
sortedPageComponents.add(index, component);
}
Iterator sortedPageComponentsIterator = sortedPageComponents.iterator();
while(sortedPageComponentsIterator.hasNext())
{
InfoGlueComponent component = (InfoGlueComponent)sortedPageComponentsIterator.next();
this.getTemplateController().setComponentLogic(new ComponentLogic(this.getTemplateController(), component));
//this.getTemplateController().getDeliveryContext().getUsageListeners().add(this.getTemplateController().getComponentLogic().getComponentDeliveryContext());
ContentVO metaInfoContentVO = nodeDeliveryController.getBoundContent(getDatabase(), this.getTemplateController().getPrincipal(), this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), true, "Meta information", this.getDeliveryContext());
if(!component.getIsInherited()) //Wrong maybe?
preProcessComponent(component, this.getTemplateController(), repositoryId, this.getDeliveryContext().getSiteNodeId(), this.getDeliveryContext().getLanguageId(), this.getDeliveryContext().getContentId(), metaInfoContentVO.getId(), sortedPageComponents);
}
}
/*
protected String decorateHeadAndPageWithVarsFromComponents(String pageString)
{
if(pageString.length() < 500000)
{
pageString = this.getTemplateController().decoratePage(pageString);
StringBuffer sb = null;
List htmlHeadItems = this.getTemplateController().getDeliveryContext().getHtmlHeadItems();
if(htmlHeadItems != null || htmlHeadItems.size() > 0)
{
int indexOfHeadEndTag = pageString.indexOf("</head");
if(indexOfHeadEndTag == -1)
indexOfHeadEndTag = pageString.indexOf("</HEAD");
if(indexOfHeadEndTag != -1)
{
sb = new StringBuffer(pageString);
Iterator htmlHeadItemsIterator = htmlHeadItems.iterator();
while(htmlHeadItemsIterator.hasNext())
{
String value = (String)htmlHeadItemsIterator.next();
sb.insert(indexOfHeadEndTag, value + "\n");
}
//pageString = sb.toString();
}
}
try
{
int lastModifiedDateTimeIndex;
if(sb == null)
lastModifiedDateTimeIndex = pageString.indexOf("<ig:lastModifiedDateTime");
else
lastModifiedDateTimeIndex = sb.indexOf("<ig:lastModifiedDateTime");
if(lastModifiedDateTimeIndex > -1)
{
if(sb == null)
sb = new StringBuffer(pageString);
int lastModifiedDateTimeEndIndex = sb.indexOf("</ig:lastModifiedDateTime>", lastModifiedDateTimeIndex);
String tagInfo = sb.substring(lastModifiedDateTimeIndex, lastModifiedDateTimeEndIndex);
logger.info("tagInfo:" + tagInfo);
String dateFormat = "yyyy-MM-dd HH:mm";
int formatStartIndex = tagInfo.indexOf("format");
if(formatStartIndex > -1)
{
int formatEndIndex = tagInfo.indexOf("\"", formatStartIndex + 7);
if(formatEndIndex > -1)
dateFormat = tagInfo.substring(formatStartIndex + 7, formatEndIndex);
}
String dateString = vf.formatDate(this.getTemplateController().getDeliveryContext().getLastModifiedDateTime(), this.getTemplateController().getLocale(), dateFormat);
logger.info("dateString:" + dateString);
sb.replace(lastModifiedDateTimeIndex, lastModifiedDateTimeEndIndex + "</ig:lastModifiedDateTime>".length(), dateString);
logger.info("Replaced:" + lastModifiedDateTimeIndex + " to " + lastModifiedDateTimeEndIndex + "</ig:lastModifiedDateTime>".length() + " with " + dateString);
}
}
catch (Exception e)
{
logger.error("Problem setting lastModifiedDateTime:" + e.getMessage(), e);
}
if(sb != null)
pageString = sb.toString();
}
else
{
if(logger.isInfoEnabled())
logger.info("pageString was to large (" + pageString.length() + ") so the headers was not inserted.");
}
return pageString;
}
*/
/**
* This method fetches the pageComponent structure from the metainfo content.
*/
protected String getPageComponentsString(Database db, TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception
{
SiteNodeVO siteNodeVO = templateController.getSiteNode(siteNodeId);
ContentVO contentVO = null;
if(siteNodeVO.getMetaInfoContentId() != null && siteNodeVO.getMetaInfoContentId().intValue() > -1)
contentVO = templateController.getContent(siteNodeVO.getMetaInfoContentId());
else
contentVO = NodeDeliveryController.getNodeDeliveryController(siteNodeId, languageId, contentId).getBoundContent(db, templateController.getPrincipal(), siteNodeId, languageId, true, "Meta information", this.getDeliveryContext());
templateController.getDeliveryContext().addUsedContent(CacheController.getPooledString(1, templateController.getMetaInformationContentId()) + "_ComponentStructure");
templateController.getDeliveryContext().addUsedContent(CacheController.getPooledString(1, templateController.getMetaInformationContentId()) + "_ComponentStructureDependency");
if(contentVO == null)
throw new SystemException("There was no Meta Information bound to this page which makes it impossible to render.");
String cacheName = "componentEditorCache";
String cacheKey = "pageComponentString_" + siteNodeId + "_" + languageId + "_" + contentId;
String versionKey = cacheKey + "_contentVersionId";
//String attributeName = "ComponentStructure";
//String attributeKey = "" + contentVO.getId() + "_" + languageId + "_" + attributeName + "_" + siteNodeId + "_" + true;
//String attributeKey = "" + contentVO.getId() + "_" + languageId + "_" + attributeName + "_" + true + "_" + false;
//String versionKey = attributeKey + "_contentVersionId";
String cachedPageComponentsString = (String)CacheController.getCachedObjectFromAdvancedCache(cacheName, cacheKey);
Set contentVersionId = (Set)CacheController.getCachedObjectFromAdvancedCache("componentEditorVersionIdCache", versionKey);
if(templateController.getOperatingMode() == 0 && templateController.getHttpServletRequest().getParameter("siteNodeVersionId") != null && !templateController.getHttpServletRequest().getParameter("siteNodeVersionId").equals(""))
{
cachedPageComponentsString = null;
}
if(cachedPageComponentsString != null)
{
if(contentVersionId != null)
{
Iterator contentVersionIdIterator = contentVersionId.iterator();
while(contentVersionIdIterator.hasNext())
{
Integer currentContentVersionId = (Integer)contentVersionIdIterator.next();
if(currentContentVersionId != null)
{
templateController.getDeliveryContext().addUsedContentVersion(CacheController.getPooledString(2, currentContentVersionId));
//logger.info("\nThere was a cached page string and the meta info content version was " + contentVersionId);
templateController.getDeliveryContext().getUsedPageMetaInfoContentVersionIdSet().add(currentContentVersionId);
templateController.getDeliveryContext().getUsedPageComponentsMetaInfoContentVersionIdSet().add(currentContentVersionId);
}
}
}
return cachedPageComponentsString;
}
String pageComponentsString = null;
//logger.info("contentVO in getPageComponentsString: " + contentVO.getContentId());
Integer masterLanguageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(db, siteNodeId).getId();
pageComponentsString = templateController.getMetaInfoContentAttribute(contentVO.getContentId(), masterLanguageId, "ComponentStructure", true);
String siteNodeVersionId = templateController.getHttpServletRequest().getParameter("siteNodeVersionId");
if(siteNodeVersionId != null)
{
SiteNodeVersionVO siteNodeVersionVO = SiteNodeVersionController.getController().getSiteNodeVersionVOWithId(new Integer(siteNodeVersionId), db);
List<MediumContentVersionImpl> contentVersionList = ContentVersionController.getContentVersionController().getMediumContentVersionList(siteNodeVO.getMetaInfoContentId(), masterLanguageId, db);
for(MediumContentVersionImpl cv : contentVersionList)
{
if(Math.abs(cv.getModifiedDateTime().getTime() - siteNodeVersionVO.getModifiedDateTime().getTime()) < 1000)
{
pageComponentsString = templateController.getContentAttribute(cv.getValueObject(), "ComponentStructure", true);
break;
}
}
}
if(pageComponentsString == null)
throw new SystemException("There was no Meta Information bound to this page which makes it impossible to render.");
if(templateController.getHttpServletRequest().getParameter("siteNodeVersionId") == null || templateController.getHttpServletRequest().getParameter("siteNodeVersionId").equals(""))
{
CacheController.cacheObjectInAdvancedCache(cacheName, cacheKey, pageComponentsString);
Set contentVersionIds = new HashSet();
//TODO - m�ste fixa s� att inte nulls sl�ngs in i getUsedPageMetaInfoContentVersionIdSet... hur det kan h�nda
contentVersionIds.addAll(templateController.getDeliveryContext().getUsedPageMetaInfoContentVersionIdSet());
Set groups = new HashSet();
if(templateController.getDeliveryContext().getUsedPageMetaInfoContentVersionIdSet().size() > 0)
{
ContentVersionVO contentVersionVO = ContentVersionController.getContentVersionController().getSmallContentVersionVOWithId((Integer)templateController.getDeliveryContext().getUsedPageMetaInfoContentVersionIdSet().toArray()[0], templateController.getDatabase());
groups.add(CacheController.getPooledString(2, contentVersionVO.getId()));
groups.add(CacheController.getPooledString(1, contentVersionVO.getContentId()));
}
if(groups.size() > 0)
{
CacheController.cacheObjectInAdvancedCacheWithGroupsAsSet("componentEditorVersionIdCache", versionKey, contentVersionIds, groups, true);
}
}
return pageComponentsString;
}
protected org.dom4j.Document getPageComponentsDOM4JDocument(Database db, TemplateController templateController, Integer siteNodeId, Integer languageId, Integer contentId) throws SystemException, Exception
{
String cacheName = "componentEditorCache";
String cacheKey = "pageComponentDocument_" + siteNodeId + "_" + languageId + "_" + contentId;
org.dom4j.Document cachedPageComponentsDocument = (org.dom4j.Document)CacheController.getCachedObjectFromAdvancedCache(cacheName, cacheKey);
if(cachedPageComponentsDocument != null)
return cachedPageComponentsDocument;
org.dom4j.Document pageComponentsDocument = null;
try
{
String xml = this.getPageComponentsString(db, templateController, siteNodeId, languageId, contentId);
pageComponentsDocument = domBuilder.getDocument(xml);
CacheController.cacheObjectInAdvancedCache(cacheName, cacheKey, pageComponentsDocument);
}
catch(Exception e)
{
logger.error(e.getMessage(), e);
throw e;
}
return pageComponentsDocument;
}
/**
* This method gets a Map of the components available on the page.
*/
/*
protected Map getComponentsWithDOM4j(Database db, Element element, TemplateController templateController, InfoGlueComponent parentComponent) throws Exception
{
logger.info("getComponentsWithDOM4j");
InfoGlueComponent component = null;
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
Map components = new HashMap();
String componentXPath = "component";
//logger.info("componentXPath - A:" + componentXPath);
List componentNodeList = element.selectNodes(componentXPath);
Iterator componentNodeListIterator = componentNodeList.iterator();
while(componentNodeListIterator.hasNext())
{
Element child = (Element)componentNodeListIterator.next();
Integer id = new Integer(child.attributeValue("id"));
Integer contentId = new Integer(child.attributeValue("contentId"));
String name = child.attributeValue("name");
//logger.info("id 2:" + id);
//logger.info("contentId 2:" + contentId);
//logger.info("name 2:" + name);
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(contentId, db);
component = new InfoGlueComponent();
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
//component.setName(name);
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
//Change to this later
//getComponentProperties(child, component, locale, templateController);
//logger.info("componentXPath - B:" + componentXPath);
List propertiesNodeList = child.selectNodes("properties");
//logger.info("propertiesNodeList:" + propertiesNodeList.getLength());
if(propertiesNodeList.size() > 0)
{
Element propertiesElement = (Element)propertiesNodeList.get(0);
List propertyNodeList = propertiesElement.selectNodes("property");
//logger.info("propertyNodeList:" + propertyNodeList.getLength());
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
Element propertyElement = (Element)propertyNodeListIterator.next();
String propertyName = propertyElement.attributeValue("name");
String type = propertyElement.attributeValue("type");
String path = propertyElement.attributeValue("path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode());
}
//logger.info("path:" + "path_" + locale.getLanguage() + ":" + propertyElement.attributeValue("path_" + locale.getLanguage()));
if(propertyElement.attributeValue("path_" + locale.getLanguage()) != null)
path = propertyElement.attributeValue("path_" + locale.getLanguage());
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 1 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
List attributes = propertyElement.attributes();
Iterator attributesIterator = attributes.iterator();
while(attributesIterator.hasNext())
{
Attribute attribute = (Attribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List bindings = new ArrayList();
List bindingNodeList = propertyElement.selectNodes("binding");
//logger.info("bindingNodeList:" + bindingNodeList.getLength());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
Element bindingElement = (Element)bindingNodeListIterator.next();
String entity = bindingElement.attributeValue("entity");
String entityId = bindingElement.attributeValue("entityId");
String assetKey = bindingElement.attributeValue("assetKey");
//logger.info("Binding found:" + entity + ":" + entityId);
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
//TEST
//component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithDOM4j(child, component, locale, templateController);
//Getting slots for the component
String componentString = this.getComponentString(templateController, contentId, component);
//logger.info("Getting the slots for component.......");
//logger.info("componentString:" + componentString);
int offset = 0;
int slotStartIndex = componentString.indexOf("<ig:slot", offset);
while(slotStartIndex > -1)
{
int slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex);
String slotString = componentString.substring(slotStartIndex, slotStopIndex + 10);
String slotId = slotString.substring(slotString.indexOf("id") + 4, slotString.indexOf("\"", slotString.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slotString.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slotString.substring(inheritIndex + 9, slotString.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
boolean disableAccessControl = false;
int disableAccessControlIndex = slotString.indexOf("disableAccessControl");
if(disableAccessControlIndex > -1)
{
String disableAccessControlString = slotString.substring(disableAccessControlIndex + "disableAccessControl".length() + 2, slotString.indexOf("\"", disableAccessControlIndex + "disableAccessControl".length() + 2));
disableAccessControl = Boolean.parseBoolean(disableAccessControlString);
}
String[] allowedComponentNamesArray = null;
int allowedComponentNamesIndex = slotString.indexOf(" allowedComponentNames");
if(allowedComponentNamesIndex > -1)
{
String allowedComponentNames = slotString.substring(allowedComponentNamesIndex + 24, slotString.indexOf("\"", allowedComponentNamesIndex + 24));
allowedComponentNamesArray = allowedComponentNames.split(",");
}
String[] disallowedComponentNamesArray = null;
int disallowedComponentNamesIndex = slotString.indexOf(" disallowedComponentNames");
if(disallowedComponentNamesIndex > -1)
{
String disallowedComponentNames = slotString.substring(disallowedComponentNamesIndex + 27, slotString.indexOf("\"", disallowedComponentNamesIndex + 27));
disallowedComponentNamesArray = disallowedComponentNames.split(",");
}
String[] allowedComponentGroupNamesArray = null;
int allowedComponentGroupNamesIndex = slotString.indexOf(" allowedComponentGroupNames");
if(allowedComponentGroupNamesIndex > -1)
{
String allowedComponentGroupNames = slotString.substring(allowedComponentGroupNamesIndex + 29, slotString.indexOf("\"", allowedComponentGroupNamesIndex + 29));
allowedComponentGroupNamesArray = allowedComponentGroupNames.split(",");
}
String addComponentText = null;
int addComponentTextIndex = slotString.indexOf("addComponentText");
if(addComponentTextIndex > -1)
{
addComponentText = slotString.substring(addComponentTextIndex + "addComponentText".length() + 2, slotString.indexOf("\"", addComponentTextIndex + "addComponentText".length() + 2));
}
String addComponentLinkHTML = null;
int addComponentLinkHTMLIndex = slotString.indexOf("addComponentLinkHTML");
if(addComponentLinkHTMLIndex > -1)
{
addComponentLinkHTML = slotString.substring(addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2, slotString.indexOf("\"", addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2));
}
int allowedNumberOfComponentsInt = -1;
int allowedNumberOfComponentsIndex = slotString.indexOf("allowedNumberOfComponents");
if(allowedNumberOfComponentsIndex > -1)
{
String allowedNumberOfComponents = slotString.substring(allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2, slotString.indexOf("\"", allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2));
try
{
allowedNumberOfComponentsInt = new Integer(allowedNumberOfComponents);
}
catch (Exception e)
{
allowedNumberOfComponentsInt = -1;
}
}
Slot slot = new Slot();
slot.setId(slotId);
slot.setInherit(inherit);
slot.setDisableAccessControl(disableAccessControl);
slot.setAllowedComponentsArray(allowedComponentNamesArray);
slot.setDisallowedComponentsArray(disallowedComponentNamesArray);
slot.setAllowedComponentGroupsArray(allowedComponentGroupNamesArray);
slot.setAddComponentLinkHTML(addComponentLinkHTML);
slot.setAddComponentText(addComponentText);
slot.setAllowedNumberOfComponents(new Integer(allowedNumberOfComponentsInt));
List subComponents = getComponentsWithDOM4j(db, templateController, component, templateController.getSiteNodeId(), slotId);
slot.setComponents(subComponents);
component.getSlotList().add(slot);
offset = slotStopIndex; // + 10;
slotStartIndex = componentString.indexOf("<ig:slot", offset);
}
List anl = child.selectNodes("components");
if(anl.size() > 0)
{
Element componentsElement = (Element)anl.get(0);
component.setComponents(getComponentsWithDOM4j(db, componentsElement, templateController, component));
}
components.put(name, component);
}
return components;
}
*/
protected Map getComponentsWithXPP3(Database db, XmlElement element, TemplateController templateController, InfoGlueComponent parentComponent) throws Exception
{
//logger.info("Getting components");
InfoGlueComponent component = null;
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
Map components = new HashMap();
String componentXPath = "component";
Xb1XPath xpathObject = (Xb1XPath)cachedXPathObjects.get(componentXPath);
if(xpathObject == null)
{
xpathObject = new Xb1XPath(componentXPath);
cachedXPathObjects.put(componentXPath, xpathObject);
}
List componentNodeList = xpathObject.selectNodes( element );
Iterator componentNodeListIterator = componentNodeList.iterator();
while(componentNodeListIterator.hasNext())
{
XmlElement child = (XmlElement)componentNodeListIterator.next();
Integer id = new Integer(child.getAttributeValue(child.getNamespaceName(), "id"));
Integer contentId = new Integer(child.getAttributeValue(child.getNamespaceName(), "contentId"));
String name = child.getAttributeValue(child.getNamespaceName(), "name");
String isPagePartRef = child.getAttributeValue(child.getNamespaceName(), "isPagePartReference");
//logger.info("id 2:" + id);
//logger.info("contentId 2:" + contentId);
//logger.info("name 2:" + name);
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(db, contentId, templateController.getDeliveryContext());
component = new InfoGlueComponent();
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
//component.setName(name);
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
Xb1XPath xpathObject2 = (Xb1XPath)cachedXPathObjects.get("properties");
if(xpathObject2 == null)
{
xpathObject2 = new Xb1XPath("properties");
cachedXPathObjects.put("properties", xpathObject2);
}
List propertiesNodeList = xpathObject2.selectNodes( child );
if(propertiesNodeList.size() > 0)
{
XmlElement propertiesElement = (XmlElement)propertiesNodeList.get(0);
Xb1XPath xpathObject3 = (Xb1XPath)cachedXPathObjects.get("property");
if(xpathObject3 == null)
{
xpathObject3 = new Xb1XPath("property");
cachedXPathObjects.put("property", xpathObject3);
}
List propertyNodeList = xpathObject3.selectNodes(propertiesElement);
//logger.info("propertyNodeList:" + propertyNodeList.getLength());
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
XmlElement propertyElement = (XmlElement)propertyNodeListIterator.next();
String propertyName = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "name");
String type = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "type");
String path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode());
}
//logger.info("path:" + "path_" + locale.getLanguage() + ":" + propertyElement.attributeValue("path_" + locale.getLanguage()));
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage());
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 1 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
property.put("isPagePartReference", (isPagePartRef == null ? "false" : isPagePartRef));
Iterator attributesIterator = propertyElement.attributes();
while(attributesIterator.hasNext())
{
XmlAttribute attribute = (XmlAttribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List bindings = new ArrayList();
Xb1XPath xpathObject4 = (Xb1XPath)cachedXPathObjects.get("binding");
if(xpathObject4 == null)
{
xpathObject4 = new Xb1XPath("binding");
cachedXPathObjects.put("binding", xpathObject4);
}
List bindingNodeList = xpathObject4.selectNodes(propertyElement);
//logger.info("bindingNodeList:" + bindingNodeList.getLength());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
XmlElement bindingElement = (XmlElement)bindingNodeListIterator.next();
String entity = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entity");
String entityId = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entityId");
String assetKey = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "assetKey");
//logger.info("Binding found:" + entity + ":" + entityId);
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
//TEST
//component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithXPP3(child, component, locale, templateController);
//Getting slots for the component
String componentString = this.getComponentString(templateController, contentId, component);
//logger.info("Getting the slots for component.......");
//logger.info("componentString:" + componentString);
int offset = 0;
int slotStartIndex = componentString.indexOf("<ig:slot", offset);
while(slotStartIndex > -1)
{
int slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex);
String slotString = componentString.substring(slotStartIndex, slotStopIndex + 10);
String slotId = slotString.substring(slotString.indexOf("id") + 4, slotString.indexOf("\"", slotString.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slotString.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slotString.substring(inheritIndex + 9, slotString.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
boolean disableAccessControl = false;
int disableAccessControlIndex = slotString.indexOf("disableAccessControl");
if(disableAccessControlIndex > -1)
{
String disableAccessControlString = slotString.substring(disableAccessControlIndex + "disableAccessControl".length() + 2, slotString.indexOf("\"", disableAccessControlIndex + "disableAccessControl".length() + 2));
disableAccessControl = Boolean.parseBoolean(disableAccessControlString);
}
String[] allowedComponentNamesArray = null;
int allowedComponentNamesIndex = slotString.indexOf(" allowedComponentNames");
if(allowedComponentNamesIndex > -1)
{
String allowedComponentNames = slotString.substring(allowedComponentNamesIndex + 24, slotString.indexOf("\"", allowedComponentNamesIndex + 24));
allowedComponentNamesArray = allowedComponentNames.split(",");
}
String[] disallowedComponentNamesArray = null;
int disallowedComponentNamesIndex = slotString.indexOf(" disallowedComponentNames");
if(disallowedComponentNamesIndex > -1)
{
String disallowedComponentNames = slotString.substring(disallowedComponentNamesIndex + 27, slotString.indexOf("\"", disallowedComponentNamesIndex + 27));
disallowedComponentNamesArray = disallowedComponentNames.split(",");
}
String[] allowedComponentGroupNamesArray = null;
int allowedComponentGroupNamesIndex = slotString.indexOf(" allowedComponentGroupNames");
if(allowedComponentGroupNamesIndex > -1)
{
String allowedComponentGroupNames = slotString.substring(allowedComponentGroupNamesIndex + 29, slotString.indexOf("\"", allowedComponentGroupNamesIndex + 29));
allowedComponentGroupNamesArray = allowedComponentGroupNames.split(",");
}
String addComponentText = null;
int addComponentTextIndex = slotString.indexOf("addComponentText");
if(addComponentTextIndex > -1)
{
addComponentText = slotString.substring(addComponentTextIndex + "addComponentText".length() + 2, slotString.indexOf("\"", addComponentTextIndex + "addComponentText".length() + 2));
}
String addComponentLinkHTML = null;
int addComponentLinkHTMLIndex = slotString.indexOf("addComponentLinkHTML");
if(addComponentLinkHTMLIndex > -1)
{
addComponentLinkHTML = slotString.substring(addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2, slotString.indexOf("\"", addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2));
}
int allowedNumberOfComponentsInt = -1;
int allowedNumberOfComponentsIndex = slotString.indexOf("allowedNumberOfComponents");
if(allowedNumberOfComponentsIndex > -1)
{
String allowedNumberOfComponents = slotString.substring(allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2, slotString.indexOf("\"", allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2));
try
{
allowedNumberOfComponentsInt = new Integer(allowedNumberOfComponents);
}
catch (Exception e)
{
allowedNumberOfComponentsInt = -1;
}
}
Slot slot = new Slot();
slot.setId(slotId);
slot.setInherit(inherit);
slot.setDisableAccessControl(disableAccessControl);
slot.setAllowedComponentsArray(allowedComponentNamesArray);
slot.setDisallowedComponentsArray(disallowedComponentNamesArray);
slot.setAllowedComponentGroupsArray(allowedComponentGroupNamesArray);
slot.setAddComponentLinkHTML(addComponentLinkHTML);
slot.setAddComponentText(addComponentText);
slot.setAllowedNumberOfComponents(new Integer(allowedNumberOfComponentsInt));
List subComponents = getComponentsWithXPP3(db, templateController, component, templateController.getSiteNodeId(), slotId);
slot.setComponents(subComponents);
component.getSlotList().add(slot);
offset = slotStopIndex; // + 10;
slotStartIndex = componentString.indexOf("<ig:slot", offset);
}
Xb1XPath xpathObject5 = (Xb1XPath)cachedXPathObjects.get("components");
if(xpathObject5 == null)
{
xpathObject5 = new Xb1XPath("components");
cachedXPathObjects.put("components", xpathObject5);
}
List anl = xpathObject5.selectNodes(child);
if(anl.size() > 0)
{
XmlElement componentsElement = (XmlElement)anl.get(0);
component.setComponents(getComponentsWithXPP3(db, componentsElement, templateController, component));
}
components.put(name, component);
}
return components;
}
/**
* This method gets a specific component.
*/
/*
protected Map getComponentWithDOM4j(Database db, Element element, String componentName, TemplateController templateController, InfoGlueComponent parentComponent) throws Exception
{
logger.info("getComponentWithDOM4j");
Timer t = new Timer();
//logger.info("Getting component with name:" + componentName);
InfoGlueComponent component = null;
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
Map components = new HashMap();
String componentXPath = getComponentXPath(parentComponent) + "/components/component[@name='" + componentName + "']";
//logger.info("componentXPath:" + componentXPath);
//logger.info("componentXPath:" + componentXPath);
List componentNodeList = element.selectNodes(componentXPath);
Iterator componentNodeListIterator = componentNodeList.iterator();
while(componentNodeListIterator.hasNext())
{
Element child = (Element)componentNodeListIterator.next();
Integer id = new Integer(child.attributeValue("id"));
Integer contentId = new Integer(child.attributeValue("contentId"));
String name = child.attributeValue("name");
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(contentId, db);
component = new InfoGlueComponent();
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
//component.setName(name);
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
//Change to this later
//getComponentProperties(child, component, locale, templateController);
List propertiesNodeList = child.selectNodes("properties");
////logger.info("propertiesNodeList:" + propertiesNodeList.getLength());
if(propertiesNodeList.size() > 0)
{
Element propertiesElement = (Element)propertiesNodeList.get(0);
List propertyNodeList = propertiesElement.selectNodes("property");
////logger.info("propertyNodeList:" + propertyNodeList.getLength());
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
Element propertyElement = (Element)propertyNodeListIterator.next();
String propertyName = propertyElement.attributeValue("name");
String type = propertyElement.attributeValue("type");
String path = propertyElement.attributeValue("path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode());
}
//logger.info("path:" + "path_" + locale.getLanguage() + ":" + propertyElement.attributeValue("path_" + locale.getLanguage()));
if(propertyElement.attributeValue("path_" + locale.getLanguage()) != null)
path = propertyElement.attributeValue("path_" + locale.getLanguage());
//logger.info("path:" + path);
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 2 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
List attributes = propertyElement.attributes();
Iterator attributesIterator = attributes.iterator();
while(attributesIterator.hasNext())
{
Attribute attribute = (Attribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List bindings = new ArrayList();
List bindingNodeList = propertyElement.selectNodes("binding");
////logger.info("bindingNodeList:" + bindingNodeList.getLength());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
Element bindingElement = (Element)bindingNodeListIterator.next();
String entity = bindingElement.attributeValue("entity");
String entityId = bindingElement.attributeValue("entityId");
String assetKey = bindingElement.attributeValue("assetKey");
////logger.info("Binding found:" + entity + ":" + entityId);
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithDOM4j(child, component, locale, templateController);
List anl = child.selectNodes("components");
////logger.info("Components NL:" + anl.getLength());
if(anl.size() > 0)
{
Element componentsElement = (Element)anl.get(0);
component.setComponents(getComponentsWithDOM4j(db, componentsElement, templateController, component));
}
List componentList = new ArrayList();
if(components.containsKey(name))
componentList = (List)components.get(name);
componentList.add(component);
components.put(name, componentList);
}
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Getting component with name", t.getElapsedTime());
return components;
}
*/
protected Map getComponentWithXPP3(Database db, XmlInfosetBuilder builder, XmlElement element, String componentName, TemplateController templateController, InfoGlueComponent parentComponent) throws Exception
{
InfoGlueComponent component = null;
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
Map components = new HashMap();
String componentXPath = getComponentXPath(parentComponent) + "/components/component[@name='" + componentName + "']";
//logger.info("componentXPath:" + componentXPath);
Xb1XPath xpathObject = (Xb1XPath)cachedXPathObjects.get(componentXPath);
if(xpathObject == null)
{
xpathObject = new Xb1XPath( componentXPath );
cachedXPathObjects.put(componentXPath, xpathObject);
}
//This keeps track of the cached inherited components.
StringBuilder sb = new StringBuilder();
List componentNodeList = xpathObject.selectNodes( element );
Iterator componentNodeListIterator = componentNodeList.iterator();
while(componentNodeListIterator.hasNext())
{
XmlElement child = (XmlElement)componentNodeListIterator.next();
String componentString = builder.serializeToString(child).trim();
sb.append(componentString);
//System.out.println("AAAAAAAAA" + componentString);
Integer id = new Integer(child.getAttributeValue(child.getNamespaceName(), "id"));
Integer contentId = new Integer(child.getAttributeValue(child.getNamespaceName(), "contentId"));
String name = child.getAttributeValue(child.getNamespaceName(), "name");
String isPagePartRef = child.getAttributeValue(child.getNamespaceName(), "isPagePartReference");
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(db, contentId, templateController.getDeliveryContext());
component = new InfoGlueComponent();
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
//component.setName(name);
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
Xb1XPath xpathObject2 = (Xb1XPath)cachedXPathObjects.get("properties");
if(xpathObject2 == null)
{
xpathObject2 = new Xb1XPath( "properties" );
cachedXPathObjects.put("properties", xpathObject2);
}
List propertiesNodeList = xpathObject2.selectNodes(child);
////logger.info("propertiesNodeList:" + propertiesNodeList.getLength());
if(propertiesNodeList.size() > 0)
{
XmlElement propertiesElement = (XmlElement)propertiesNodeList.get(0);
Xb1XPath xpathObject3 = (Xb1XPath)cachedXPathObjects.get("property");
if(xpathObject3 == null)
{
xpathObject3 = new Xb1XPath( "property" );
cachedXPathObjects.put("property", xpathObject3);
}
List propertyNodeList = xpathObject3.selectNodes(propertiesElement);
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
XmlElement propertyElement = (XmlElement)propertyNodeListIterator.next();
String propertyName = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "name");
String type = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "type");
String path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode());
}
//logger.info("path:" + "path_" + locale.getLanguage() + ":" + propertyElement.attributeValue("path_" + locale.getLanguage()));
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage());
//logger.info("path:" + path);
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 2 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
property.put("isPagePartReference", (isPagePartRef == null ? "false" : isPagePartRef));
Iterator attributesIterator = propertyElement.attributes();
while(attributesIterator.hasNext())
{
XmlAttribute attribute = (XmlAttribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List bindings = new ArrayList();
Xb1XPath xpathObject4 = (Xb1XPath)cachedXPathObjects.get("binding");
if(xpathObject4 == null)
{
xpathObject4 = new Xb1XPath( "binding" );
cachedXPathObjects.put("binding", xpathObject4);
}
List bindingNodeList = xpathObject4.selectNodes(propertyElement);
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
XmlElement bindingElement = (XmlElement)bindingNodeListIterator.next();
String entity = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entity");
String entityId = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entityId");
String assetKey = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "assetKey");
////logger.info("Binding found:" + entity + ":" + entityId);
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithXPP3(child, component, locale, templateController);
Xb1XPath xpathObject5 = (Xb1XPath)cachedXPathObjects.get("components");
if(xpathObject5 == null)
{
xpathObject5 = new Xb1XPath( "components" );
cachedXPathObjects.put("components", xpathObject5);
}
List anl = xpathObject5.selectNodes(child);
if(anl.size() > 0)
{
XmlElement componentsElement = (XmlElement)anl.get(0);
component.setComponents(getComponentsWithXPP3(db, componentsElement, templateController, component));
}
List componentList = new ArrayList();
if(components.containsKey(name))
componentList = (List)components.get(name);
componentList.add(component);
components.put(name, componentList);
}
int componentsHash = sb.toString().hashCode();
//System.out.println(componentsHash + " for " + componentName);
components.put(componentName + "_hashCode", componentsHash);
components.put(componentName + "_xpath", componentXPath);
return components;
}
/**
* This method renders the base component and all it's children.
*/
private String renderComponent(InfoGlueComponent component, TemplateController templateController, Integer repositoryId, Integer siteNodeId, Integer languageId, Integer contentId, Integer metainfoContentId, int maxDepth, int currentDepth) throws Exception
{
if(currentDepth > maxDepth)
{
logger.error("A page with to many levels (possibly infinite loop) was found on " + templateController.getOriginalFullURL());
return "";
}
/*
System.out.println("\n\n**** Rendering component ****");
System.out.println("id: " + component.getId());
System.out.println("contentId: " + component.getContentId());
System.out.println("name: " + component.getName());
System.out.println("slotName: " + component.getSlotName());
*/
if(logger.isDebugEnabled())
{
logger.debug("\n\n**** Rendering component ****");
logger.debug("id: " + component.getId());
logger.debug("contentId: " + component.getContentId());
logger.debug("name: " + component.getName());
logger.debug("slotName: " + component.getSlotName());
}
StringBuilder decoratedComponent = new StringBuilder();
String componentEditorUrl = CmsPropertyHandler.getComponentEditorUrl();
templateController.setComponentLogic(new ComponentLogic(templateController, component));
templateController.getDeliveryContext().getUsageListeners().add(templateController.getComponentLogic().getComponentDeliveryContext());
boolean renderComponent = false;
boolean cacheComponent = false;
//String cacheResult = templateController.getComponentLogic().getPropertyValue("CacheResult", true, false);
//String updateInterval = templateController.getComponentLogic().getPropertyValue("UpdateInterval", true, false);
//String componentCacheKey = templateController.getComponentLogic().getPropertyValue("CacheKey", true, false);
boolean cacheResult = component.getCacheResult();
int updateInterval = component.getUpdateInterval();
String componentCacheKey = component.getCacheKey();
if(componentCacheKey == null || componentCacheKey.equals(""))
componentCacheKey = CmsPropertyHandler.getComponentKey();
if(componentCacheKey != null && !componentCacheKey.equals(""))
{
componentCacheKey = CacheController.getComponentCacheKey(componentCacheKey,
templateController.getComponentLogic().getComponentDeliveryContext().getPageKey(),
templateController.getHttpServletRequest().getSession(),
templateController.getHttpServletRequest(),
siteNodeId,
languageId,
contentId,
templateController.getBrowserBean().getUseragent(),
templateController.getHttpServletRequest().getQueryString(),
component,
"");
}
else
{
StringBuilder componentCacheKeySB = new StringBuilder();
componentCacheKeySB.append(templateController.getComponentLogic().getComponentDeliveryContext().getPageKey()).append("_")
.append(component.getId()).append("_")
.append(component.getSlotName()).append("_")
.append(component.getContentId()).append("_")
.append(component.getIsInherited());
componentCacheKey = componentCacheKeySB.toString();
//componentCacheKey = templateController.getComponentLogic().getComponentDeliveryContext().getPageKey() + "_" + component.getId() + "_" + component.getSlotName() + "_" + component.getContentId() + "_" + component.getIsInherited();
}
if(logger.isDebugEnabled())
{
logger.debug("cacheResult:" + cacheResult);
logger.debug("updateInterval:" + updateInterval);
logger.debug("componentCacheKey:" + componentCacheKey);
}
//if(cacheResult == null || !cacheResult.equalsIgnoreCase("true"))
if(!cacheResult)
{
renderComponent = true;
}
else
{
cacheComponent = true;
String refresh = this.getRequest().getParameter("refresh");
if(refresh != null && refresh.equalsIgnoreCase("true"))
renderComponent = true;
}
if(logger.isDebugEnabled())
logger.debug("renderComponent:" + renderComponent);
if(!renderComponent)
{
if(logger.isDebugEnabled())
logger.debug("componentCacheKey:" + componentCacheKey);
//if(updateInterval != null && !updateInterval.equals("") && !updateInterval.equals("-1"))
if(updateInterval > 0)
{
String cachedString = (String)CacheController.getCachedObjectFromAdvancedCache("componentCache", componentCacheKey, updateInterval);
if(cachedString != null)
decoratedComponent.append(cachedString);
}
else
{
String cachedString = (String)CacheController.getCachedObjectFromAdvancedCache("componentCache", componentCacheKey);
if(cachedString != null)
decoratedComponent.append(cachedString);
}
if(decoratedComponent == null || decoratedComponent.length() == 0)
renderComponent = true;
}
if(logger.isDebugEnabled())
logger.debug("Will we render component:" + component.getName() + ":" + renderComponent);
if(renderComponent)
{
decoratedComponent.append("");
try
{
String componentString = getComponentString(templateController, component.getContentId(), component);
//System.out.println("\n\n" + componentString);
if(logger.isDebugEnabled())
logger.debug("componentString:" + componentString);
//String componentModelClassName
Map context = getDefaultContext();
context.put("templateLogic", templateController);
context.put("model", component.getModel());
StringWriter cacheString = new StringWriter();
PrintWriter cachedStream = new PrintWriter(cacheString);
//Timer t = new Timer();
new VelocityTemplateProcessor().renderTemplate(context, cachedStream, componentString, false, component);
//t.printElapsedTime("Rendering of " + component.getName() + " took ");
componentString = cacheString.toString();
if(logger.isDebugEnabled())
logger.debug("componentString:" + componentString);
if(componentString == null || componentString.equals(""))
{
logger.warn("The component rendering produced an empty string. This seems fishy. Lets not cache this. Please fix your template (contentID: " + component.getContentId() + " (" + component.getName() + "). \nSource URL:" + templateController.getOriginalFullURL());
//TODO - add page cache disable or perhaps a error...
templateController.getDeliveryContext().setDisablePageCache(true);
}
int offset = 0;
int slotStartIndex = componentString.indexOf("<ig:slot", offset);
int slotStopIndex = 0;
while(slotStartIndex > -1)
{
if(offset > 0)
decoratedComponent.append(componentString.substring(offset + 10, slotStartIndex));
else
decoratedComponent.append(componentString.substring(offset, slotStartIndex));
slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex);
String slot = componentString.substring(slotStartIndex, slotStopIndex + 10);
String id = slot.substring(slot.indexOf("id") + 4, slot.indexOf("\"", slot.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slot.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slot.substring(inheritIndex + 9, slot.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
List subComponents = getInheritedComponents(templateController.getDatabase(), templateController, component, templateController.getSiteNodeId(), id, inherit);
List<Integer> handledComponents = new ArrayList<Integer>();
Iterator subComponentsIterator = subComponents.iterator();
while(subComponentsIterator.hasNext())
{
InfoGlueComponent subComponent = (InfoGlueComponent)subComponentsIterator.next();
if(handledComponents.contains(subComponent.getId()))
continue;
handledComponents.add(subComponent.getId());
if(logger.isInfoEnabled())
logger.info(component.getName() + " had subcomponent " + subComponent.getName() + ":" + subComponent.getId());
String subComponentString = "";
if(subComponent != null)
{
subComponentString = renderComponent(subComponent, templateController, repositoryId, siteNodeId, languageId, contentId, metainfoContentId, maxDepth, currentDepth + 1);
}
decoratedComponent.append(subComponentString.trim());
}
offset = slotStopIndex;
slotStartIndex = componentString.indexOf("<ig:slot", offset);
}
if(offset > 0)
{
decoratedComponent.append(componentString.substring(offset + 10));
}
else
{
decoratedComponent.append(componentString.substring(offset));
}
if(cacheComponent)
{
if(this.getTemplateController().getOperatingMode().intValue() == 3 && !CmsPropertyHandler.getLivePublicationThreadClass().equalsIgnoreCase("org.infoglue.deliver.util.SelectiveLivePublicationThread"))
CacheController.cacheObjectInAdvancedCache("componentCache", componentCacheKey, decoratedComponent.toString(), templateController.getComponentLogic().getComponentDeliveryContext().getAllUsedEntities(), false);
else
CacheController.cacheObjectInAdvancedCache("componentCache", componentCacheKey, decoratedComponent.toString(), templateController.getComponentLogic().getComponentDeliveryContext().getAllUsedEntities(), true);
}
}
catch(Exception e)
{
templateController.getDeliveryContext().setDisablePageCache(true);
logger.error("The component rendering threw an exception. Lets not cache the page. Please fix your template (contentID: " + component.getContentId() + " (" + component.getName() + "). \nReason" + e.getMessage() + "\nSource URL:" + templateController.getOriginalFullURL());
logger.warn("The component rendering threw an exception. Lets not cache the page. Please fix your template (contentID: " + component.getContentId() + " (" + component.getName() + "). \nReason" + e.getMessage() + "\nSource URL:" + templateController.getOriginalFullURL(), e);
}
}
templateController.getDeliveryContext().getUsageListeners().remove(templateController.getComponentLogic().getComponentDeliveryContext());
if(logger.isDebugEnabled())
logger.debug("decoratedComponent:" + decoratedComponent.toString());
return decoratedComponent.toString();
}
/**
* This method renders the base component and all it's children.
*/
private String preProcessComponent(InfoGlueComponent component, TemplateController templateController, Integer repositoryId, Integer siteNodeId, Integer languageId, Integer contentId, Integer metainfoContentId, List sortedPageComponents) throws Exception
{
if(logger.isDebugEnabled())
{
logger.debug("\n\n**** Pre processing component ****");
logger.debug("id: " + component.getId());
logger.debug("contentId: " + component.getContentId());
logger.debug("name: " + component.getName());
logger.debug("slotName: " + component.getSlotName());
}
StringBuilder decoratedComponent = new StringBuilder();
templateController.setComponentLogic(new ComponentLogic(templateController, component));
templateController.getDeliveryContext().getUsageListeners().add(templateController.getComponentLogic().getComponentDeliveryContext());
try
{
String componentString = getComponentPreProcessingTemplateString(templateController, component.getContentId(), component);
if(logger.isDebugEnabled())
logger.debug("componentString:" + componentString);
String componentModelClassName = getComponentModelClassName(templateController, component.getContentId(), component);
if(logger.isDebugEnabled())
logger.debug("componentModelClassName:" + componentModelClassName);
if(componentModelClassName != null && !componentModelClassName.equals(""))
{
templateController.getDeliveryContext().getUsageListeners().add(templateController.getComponentLogic().getComponentDeliveryContext());
try
{
Timer t = new Timer();
DigitalAssetVO asset = templateController.getAsset(component.getContentId(), "jar");
String path = templateController.getAssetFilePathForAssetWithId(asset.getId());
if(logger.isDebugEnabled())
logger.debug("path: " + path);
if(path != null && !path.equals(""))
{
try
{
File jarFile = new File(path);
if(logger.isDebugEnabled())
logger.debug("jarFile:" + jarFile.exists());
URL url = jarFile.toURL();
URLClassLoader child = new URLClassLoader(new URL[]{url}, this.getClass().getClassLoader());
Class c = child.loadClass(componentModelClassName);
boolean isOk = ComponentModel.class.isAssignableFrom(c);
if(logger.isDebugEnabled())
logger.debug("isOk:" + isOk + " for " + componentModelClassName);
if(isOk)
{
if(logger.isDebugEnabled())
logger.debug("Calling prepare on '" + componentModelClassName + "'");
ComponentModel componentModel = (ComponentModel)c.newInstance();
componentModel.prepare(componentString, templateController, component.getModel());
}
}
catch (Exception e)
{
logger.error("Failed loading custom class from asset JAR. Trying normal class loader. Error:" + e.getMessage());
ComponentModel componentModel = (ComponentModel)Thread.currentThread().getContextClassLoader().loadClass(componentModelClassName).newInstance();
componentModel.prepare(componentString, templateController, component.getModel());
}
}
else
{
ComponentModel componentModel = (ComponentModel)Thread.currentThread().getContextClassLoader().loadClass(componentModelClassName).newInstance();
componentModel.prepare(componentString, templateController, component.getModel());
}
if(logger.isDebugEnabled())
t.printElapsedTime("Invoking custome class took");
}
catch (Exception e)
{
logger.error("The component '" + component.getName() + "' stated that class: " + componentModelClassName + " should be used as model. An exception was thrown when it was invoked: " + e.getMessage(), e);
}
templateController.getDeliveryContext().getUsageListeners().remove(templateController.getComponentLogic().getComponentDeliveryContext());
}
if(componentString != null && !componentString.equals(""))
{
templateController.getDeliveryContext().getUsageListeners().add(templateController.getComponentLogic().getComponentDeliveryContext());
Map context = getDefaultContext();
context.put("templateLogic", templateController);
context.put("model", component.getModel());
StringWriter cacheString = new StringWriter();
PrintWriter cachedStream = new PrintWriter(cacheString);
//Timer t = new Timer();
new VelocityTemplateProcessor().renderTemplate(context, cachedStream, componentString, false, component, " - PreTemplate");
//t.printElapsedTime("Rendering of " + component.getName() + " took ");
componentString = cacheString.toString();
if(logger.isDebugEnabled())
logger.debug("componentString:" + componentString);
templateController.getDeliveryContext().getUsageListeners().remove(templateController.getComponentLogic().getComponentDeliveryContext());
}
String templateComponentString = getComponentString(templateController, component.getContentId(), component);
if(logger.isDebugEnabled())
logger.debug("templateComponentString:" + templateComponentString);
int offset = 0;
int slotStartIndex = templateComponentString.indexOf("<ig:slot", offset);
int slotStopIndex = 0;
while(slotStartIndex > -1)
{
slotStopIndex = templateComponentString.indexOf("</ig:slot>", slotStartIndex);
String slot = templateComponentString.substring(slotStartIndex, slotStopIndex + 10);
String id = slot.substring(slot.indexOf("id") + 4, slot.indexOf("\"", slot.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slot.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slot.substring(inheritIndex + 9, slot.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
List subComponents = getInheritedComponents(templateController.getDatabase(), templateController, component, templateController.getSiteNodeId(), id, inherit);
Iterator subComponentsIterator = subComponents.iterator();
while(subComponentsIterator.hasNext())
{
InfoGlueComponent subComponent = (InfoGlueComponent)subComponentsIterator.next();
if(subComponent.getIsInherited())
{
String subComponentString = preProcessComponent(subComponent, templateController, repositoryId, siteNodeId, languageId, contentId, metainfoContentId, sortedPageComponents);
}
}
offset = slotStopIndex;
slotStartIndex = templateComponentString.indexOf("<ig:slot", offset);
}
}
catch(Exception e)
{
logger.warn("An component with either an empty template or with no template in the sitelanguages was found:" + e.getMessage(), e);
}
templateController.getDeliveryContext().getUsageListeners().remove(templateController.getComponentLogic().getComponentDeliveryContext());
if(logger.isDebugEnabled())
logger.debug("decoratedComponent:" + decoratedComponent.toString());
return decoratedComponent.toString();
}
/**
* This method fetches the component template as a string.
*/
protected String getComponentString(TemplateController templateController, Integer contentId, InfoGlueComponent component) throws SystemException, Exception
{
String template = null;
try
{
if(templateController.getDeliveryContext().getShowSimple() == true)
{
String componentString = templateController.getContentAttribute(contentId, templateController.getTemplateAttributeName(), true);
String slots = "";
int offset = 0;
int index = componentString.indexOf("<ig:slot");
int end = componentString.indexOf("</ig:slot>", offset);
while(index > -1 && end > -1)
{
offset = end;
slots += componentString.substring(index, end + 10);
index = componentString.indexOf("<ig:slot", offset + 1);
end = componentString.indexOf("</ig:slot>", index);
}
template = "<div style=\"position:relative; margin-top: 4px; margin-bottom: 4px; padding: 5px 5px 5px 5px; font-family:verdana, sans-serif; font-size:10px; border: 1px solid #ccc;\">" + component.getName() + slots + "</div>";
}
else
{
templateController.getDeliveryContext().addUsedContent(CacheController.getPooledString(1, contentId));
try
{
template = ContentDeliveryController.getContentDeliveryController().getContentAttribute(getDatabase(), contentId, templateController.getLanguageId(), templateController.getTemplateAttributeName(), templateController.getSiteNodeId(), true, templateController.getDeliveryContext(), templateController.getPrincipal(), false);
if(template == null)
{
logger.warn("This cannot be right. Let's check the content master language");
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(getDatabase(), contentId, templateController.getDeliveryContext());
logger.warn("contentVO:" + contentVO);
Integer contentMasterLanguageId = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId()).getLanguageId();
logger.warn("contentMasterLanguageId:" + contentMasterLanguageId);
template = ContentDeliveryController.getContentDeliveryController().getContentAttribute(getDatabase(), contentId, contentMasterLanguageId, templateController.getTemplateAttributeName(), templateController.getSiteNodeId(), true, templateController.getDeliveryContext(), templateController.getPrincipal(), false);
logger.warn("template:" + template);
}
}
catch(Exception e)
{
logger.error("Error getting template. Read more in warning log. Message: " + e.getMessage());
if(templateController.getComponentLogic() != null && templateController.getComponentLogic().getInfoGlueComponent() != null)
logger.warn("\nError on url: " + templateController.getOriginalFullURL() + "\n ComponentName=[ " + templateController.getComponentLogic().getInfoGlueComponent().getName() + " ]\nAn error occurred trying to get attributeName=" + templateController.getTemplateAttributeName() + " on content " + contentId + "\nReason:" + e.getMessage());
else
logger.warn("\nError on url: " + templateController.getOriginalFullURL() + "\n ComponentName=[ null - how? ]\nAn error occurred trying to get attributeName=" + templateController.getTemplateAttributeName() + " on content " + contentId + "\nReason:" + e.getMessage());
}
}
if(template == null)
{
throw new SystemException("There was no template available on the content with id " + contentId + ". Check so that the templates language are active on your site.\n OrginialUrl: " + templateController.getOriginalFullURL());
}
}
catch(Exception e)
{
logger.error(e.getMessage(), e);
throw e;
}
return template;
}
/**
* This method fetches the component template as a string.
*/
protected String getComponentPreProcessingTemplateString(TemplateController templateController, Integer contentId, InfoGlueComponent component) throws SystemException, Exception
{
String template = null;
try
{
template = templateController.getContentAttribute(contentId, "PreTemplate", true);
}
catch(Exception e)
{
logger.error(e.getMessage(), e);
}
return template;
}
/**
* This method fetches the component template as a string.
*/
protected String getComponentModelClassName(TemplateController templateController, Integer contentId, InfoGlueComponent component) throws SystemException, Exception
{
String modelClassName = null;
try
{
modelClassName = templateController.getContentAttribute(contentId, "ModelClassName", true);
}
catch(Exception e)
{
logger.error(e.getMessage(), e);
}
return modelClassName;
}
/**
* This method fetches a subcomponent from either the current page or from a parent node if it's not defined.
*/
protected List getInheritedComponents(Database db, TemplateController templateController, InfoGlueComponent component, Integer siteNodeId, String id, boolean inherit) throws Exception
{
//logger.info("slotId:" + id);
//logger.info("component:" + component);
//logger.info("getInheritedComponents with " + component.getName() + ":" + component.getSlotName() + ":" + component.getId());
List inheritedComponents = new ArrayList();
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), templateController.getLanguageId(), templateController.getContentId());
Iterator slotIterator = component.getSlotList().iterator();
while(slotIterator.hasNext())
{
Slot slot = (Slot)slotIterator.next();
//logger.info("Slot for component " + component.getName() + ":" + slot.getId());
//logger.info("Slot for component " + id + ":" + slot.getId() + ":" + slot.getName());
if(slot.getId().equalsIgnoreCase(id))
{
Iterator subComponentIterator = slot.getComponents().iterator();
while(subComponentIterator.hasNext())
{
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)subComponentIterator.next();
//logger.info("Adding not inherited component " + infoGlueComponent.getName() + " to list...");
inheritedComponents.add(infoGlueComponent);
}
}
}
SiteNodeVO parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, siteNodeId);
boolean restrictAll = false;
Iterator restrictionsIterator = component.getRestrictions().iterator();
while(restrictionsIterator.hasNext())
{
ComponentRestriction restriction = (ComponentRestriction)restrictionsIterator.next();
if(restriction.getType().equalsIgnoreCase("blockComponents"))
{
if(restriction.getSlotId().equalsIgnoreCase(id) && restriction.getArguments().equalsIgnoreCase("*"))
{
restrictAll = true;
}
}
}
while(inheritedComponents.size() == 0 && parentSiteNodeVO != null && inherit && !restrictAll)
{
//logger.info("INHERITING COMPONENTS");
String componentXML = this.getPageComponentsString(db, templateController, parentSiteNodeVO.getId(), templateController.getLanguageId(), component.getContentId());
//logger.info("componentXML:" + componentXML);
//logger.info("id:" + id);
String key = "" + parentSiteNodeVO.getId() + "_" + componentXML.hashCode();
//String mapKey = "" + parentSiteNodeVO.getId() + "_" + componentXML.hashCode() + "_" + id + "_components"; //
String mapKey = "" + parentSiteNodeVO.getId() + "_" + componentXML.hashCode() + "_" + id + "_" + siteNodeId + "_" + component.getId() + "_components";
Map components = (Map)CacheController.getCachedObjectFromAdvancedCache("componentPropertyCache", mapKey);
if(components == null)
{
Timer t = new Timer();
//DOM4j
/*
Document document = domBuilder.getDocument(componentXML);
components = getComponentWithDOM4j(db, document.getRootElement(), id, templateController, component);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("INHERITING COMPONENTS WITH DOM4J", t.getElapsedTime());
*/
//XPP3
XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance();
XmlDocument doc = builder.parseReader(new StringReader( componentXML ) );
components = getComponentWithXPP3(db, builder, doc.getDocumentElement(), id, templateController, component);
RequestAnalyser.getRequestAnalyser().registerComponentStatistics("INHERITING COMPONENTS WITH XPP3", t.getElapsedTime());
//System.out.println("components:" + components);
String hashCode = "" + components.get(id + "_hashCode");
String path = "" + components.get(id + "_xpath");
templateController.getDeliveryContext().addUsedContent("content_" + parentSiteNodeVO.getMetaInfoContentId() + "_ComponentStructureDependency");
templateController.getDeliveryContext().addUsedContent("content_" + parentSiteNodeVO.getMetaInfoContentId() + "_ComponentStructure:" + path + "=" + hashCode);
//logger.info("components:" + components);
if(components != null)
CacheController.cacheObjectInAdvancedCache("componentPropertyCache", mapKey, components, null, false);
}
//logger.info("components:" + components.size());
//logger.info("id:" + id);
if(components.containsKey(id))
{
inheritedComponents = (List)components.get(id);
//logger.info("inheritedComponents:" + inheritedComponents);
Iterator inheritedComponentIterator = inheritedComponents.iterator();
while(inheritedComponentIterator.hasNext())
{
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)inheritedComponentIterator.next();
infoGlueComponent.setIsInherited(true);
}
}
parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, parentSiteNodeVO.getId());
}
return inheritedComponents;
}
/**
* This method returns a path to the component so one does not mix them up.
*/
private String getComponentXPath(InfoGlueComponent infoGlueComponent)
{
String path = "";
String parentPath = "";
InfoGlueComponent parentInfoGlueComponent = infoGlueComponent.getParentComponent();
//logger.info("infoGlueComponent.getParentComponent():" + parentInfoGlueComponent);
if(parentInfoGlueComponent != null && parentInfoGlueComponent.getId().intValue() != infoGlueComponent.getId().intValue())
{
//logger.info("Had parent component...:" + parentInfoGlueComponent.getId() + ":" + parentInfoGlueComponent.getName());
parentPath = getComponentXPath(parentInfoGlueComponent);
//logger.info("parentPath:" + parentPath);
}
//logger.info("infoGlueComponent:" + infoGlueComponent.getSlotName());
path = parentPath + "/components/component[@name='" + infoGlueComponent.getSlotName() + "']";
//logger.info("returning path:" + path);
return path;
}
/**
* This method fetches a subcomponent from either the current page or from a parent node if it's not defined.
*/
/*
protected InfoGlueComponent getComponentWithDOM4j(Database db, TemplateController templateController, InfoGlueComponent component, Integer siteNodeId, String id) throws Exception
{
logger.info("getComponentWithDOM4j");
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), templateController.getLanguageId(), templateController.getContentId());
String componentXML = this.getPageComponentsString(db, templateController, siteNodeId, templateController.getLanguageId(), component.getContentId());
//logger.info("componentXML:" + componentXML);
Document document = domBuilder.getDocument(componentXML);
Map components = getComponentWithDOM4j(db, document.getRootElement(), id, templateController, component);
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)components.get(id);
//logger.info("infoGlueComponent:" + infoGlueComponent);
SiteNodeVO parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, siteNodeId);
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
while(infoGlueComponent == null && parentSiteNodeVO != null)
{
componentXML = this.getPageComponentsString(db, templateController, parentSiteNodeVO.getId(), templateController.getLanguageId(), component.getContentId());
//logger.info("componentXML:" + componentXML);
document = domBuilder.getDocument(componentXML);
components = getComponentWithDOM4j(db, document.getRootElement(), id, templateController, component);
infoGlueComponent = (InfoGlueComponent)components.get(id);
//logger.info("infoGlueComponent:" + infoGlueComponent);
if(infoGlueComponent != null)
infoGlueComponent.setIsInherited(true);
parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, parentSiteNodeVO.getId());
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
}
//logger.info("*************************STOP**********************");
return infoGlueComponent;
}
*/
/**
* This method fetches a subcomponent from either the current page or from a parent node if it's not defined.
*/
protected InfoGlueComponent getComponentWithXPP3(Database db, TemplateController templateController, InfoGlueComponent component, Integer siteNodeId, String id) throws Exception
{
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), templateController.getLanguageId(), templateController.getContentId());
String componentXML = this.getPageComponentsString(db, templateController, siteNodeId, templateController.getLanguageId(), component.getContentId());
//logger.info("componentXML:" + componentXML);
XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance();
XmlDocument doc = builder.parseReader(new StringReader( componentXML ) );
Map components = getComponentWithXPP3(db, builder, doc.getDocumentElement(), id, templateController, component);
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)components.get(id);
//logger.info("infoGlueComponent:" + infoGlueComponent);
SiteNodeVO parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, siteNodeId);
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
while(infoGlueComponent == null && parentSiteNodeVO != null)
{
componentXML = this.getPageComponentsString(db, templateController, parentSiteNodeVO.getId(), templateController.getLanguageId(), component.getContentId());
//logger.info("componentXML:" + componentXML);
builder = XmlInfosetBuilder.newInstance();
doc = builder.parseReader(new StringReader( componentXML ) );
components = getComponentWithXPP3(db, builder, doc.getDocumentElement(), id, templateController, component);
infoGlueComponent = (InfoGlueComponent)components.get(id);
//logger.info("infoGlueComponent:" + infoGlueComponent);
if(infoGlueComponent != null)
infoGlueComponent.setIsInherited(true);
parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, parentSiteNodeVO.getId());
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
}
//logger.info("*************************STOP**********************");
return infoGlueComponent;
}
/**
* This method fetches a subcomponent from either the current page or from a parent node if it's not defined.
*/
/*
protected List getComponentsWithDOM4j(Database db, TemplateController templateController, InfoGlueComponent component, Integer siteNodeId, String id) throws Exception
{
logger.info("getComponentsWithDOM4j");
List subComponents = new ArrayList();
try
{
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), templateController.getLanguageId(), templateController.getContentId());
String componentStructureXML = this.getPageComponentsString(db, templateController, siteNodeId, templateController.getLanguageId(), component.getContentId());
//logger.info("componentStructureXML:" + componentStructureXML);
Document document = domBuilder.getDocument(componentStructureXML);
Map components = getComponentWithDOM4j(db, document.getRootElement(), id, templateController, component);
if(components.containsKey(id))
subComponents = (List)components.get(id);
SiteNodeVO parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, siteNodeId);
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
while((subComponents == null || subComponents.size() == 0) && parentSiteNodeVO != null)
{
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
//logger.info("component:" + component);
componentStructureXML = this.getPageComponentsString(db, templateController, parentSiteNodeVO.getId(), templateController.getLanguageId(), component.getContentId());
//logger.info("componentStructureXML:" + componentStructureXML);
document = domBuilder.getDocument(componentStructureXML);
components = getComponentWithDOM4j(db, document.getRootElement(), id, templateController, component);
if(components.containsKey(id))
subComponents = (List)components.get(id);
if(subComponents != null)
{
//logger.info("infoGlueComponent:" + infoGlueComponent);
Iterator inheritedComponentsIterator = subComponents.iterator();
while(inheritedComponentsIterator.hasNext())
{
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)inheritedComponentsIterator.next();
infoGlueComponent.setIsInherited(true);
}
}
parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, parentSiteNodeVO.getId());
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
}
}
catch(Exception e)
{
logger.warn("An error occurred: " + e.getMessage(), e);
throw e;
}
return subComponents;
}
*/
protected List getComponentsWithXPP3(Database db, TemplateController templateController, InfoGlueComponent component, Integer siteNodeId, String id) throws Exception
{
List subComponents = new ArrayList();
try
{
NodeDeliveryController nodeDeliveryController = NodeDeliveryController.getNodeDeliveryController(templateController.getSiteNodeId(), templateController.getLanguageId(), templateController.getContentId());
String componentStructureXML = this.getPageComponentsString(db, templateController, siteNodeId, templateController.getLanguageId(), component.getContentId());
//logger.info("componentStructureXML:" + componentStructureXML);
XmlInfosetBuilder builder = XmlInfosetBuilder.newInstance();
XmlDocument doc = builder.parseReader(new StringReader( componentStructureXML ) );
Map components = getComponentWithXPP3(db, builder, doc.getDocumentElement(), id, templateController, component);
if(components.containsKey(id))
subComponents = (List)components.get(id);
SiteNodeVO parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, siteNodeId);
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
while((subComponents == null || subComponents.size() == 0) && parentSiteNodeVO != null)
{
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
//logger.info("component:" + component);
componentStructureXML = this.getPageComponentsString(db, templateController, parentSiteNodeVO.getId(), templateController.getLanguageId(), component.getContentId());
//logger.info("componentStructureXML:" + componentStructureXML);
builder = XmlInfosetBuilder.newInstance();
doc = builder.parseReader(new StringReader( componentStructureXML ) );
components = getComponentWithXPP3(db, builder, doc.getDocumentElement(), id, templateController, component);
if(components.containsKey(id))
subComponents = (List)components.get(id);
if(subComponents != null)
{
//logger.info("infoGlueComponent:" + infoGlueComponent);
Iterator inheritedComponentsIterator = subComponents.iterator();
while(inheritedComponentsIterator.hasNext())
{
InfoGlueComponent infoGlueComponent = (InfoGlueComponent)inheritedComponentsIterator.next();
infoGlueComponent.setIsInherited(true);
}
}
parentSiteNodeVO = nodeDeliveryController.getParentSiteNode(db, parentSiteNodeVO.getId());
//logger.info("parentSiteNodeVO:" + parentSiteNodeVO);
}
}
catch(Exception e)
{
logger.warn("An error occurred: " + e.getMessage(), e);
throw e;
}
return subComponents;
}
/**
* This method gets the component structure on the page.
*
* @author mattias
*/
/*
protected List getPageComponents(Database db, String componentXML, Element element, String slotName, TemplateController templateController, InfoGlueComponent parentComponent) throws Exception
{
return getPageComponents(db, componentXML, element, slotName, templateController, parentComponent, null);
}
*/
private static Map cachedXPathObjects = new HashMap();
/*
protected List getPageComponentsWithDOM4j(Database db, String componentXML, Element element, String slotName, TemplateController templateController, InfoGlueComponent parentComponent, List sortedPageComponents) throws Exception
{
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
StringBuilder key = new StringBuilder("" + componentXML.hashCode()).append("_").append(templateController.getLanguageId()).append("_").append(slotName);
if(parentComponent != null)
key = new StringBuilder("" + componentXML.hashCode()).append("_").append(templateController.getLanguageId()).append("_").append(slotName).append("_").append(parentComponent.getId()).append("_").append(parentComponent.getName()).append("_").append(parentComponent.getIsInherited());
String keyChildComponents = key + "_childComponents";
Object componentsCandidate = CacheController.getCachedObjectFromAdvancedCache("pageComponentsCache", key.toString());
Object childComponentsCandidate = CacheController.getCachedObjectFromAdvancedCache("pageComponentsCache", keyChildComponents);
List components = new ArrayList();
List childComponents = new ArrayList();
String[] groups = null;
if(childComponentsCandidate != null)
{
if(componentsCandidate instanceof NullObject)
childComponents = Collections.EMPTY_LIST;
else
childComponents = (List)childComponentsCandidate;
}
if(componentsCandidate != null)
{
if(componentsCandidate instanceof NullObject)
components = null;
else
components = (List)componentsCandidate;
}
else
{
Timer t = new Timer();
//logger.info("key:" + key);
String componentXPath = "component[@name='" + slotName + "']";
//logger.info("componentXPath:" + componentXPath);
List componentElements = element.selectNodes(componentXPath);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("DOM4J selectNodes size:" + componentElements.size(), t.getElapsedTime());
//logger.info("componentElements:" + componentElements.size());
Iterator componentIterator = componentElements.iterator();
int slotPosition = 0;
while(componentIterator.hasNext())
{
Element componentElement = (Element)componentIterator.next();
Integer id = new Integer(componentElement.attributeValue("id"));
Integer contentId = new Integer(componentElement.attributeValue("contentId"));
String name = componentElement.attributeValue("name");
String isInherited = componentElement.attributeValue("isInherited");
String pagePartTemplateContentId = componentElement.attributeValue("pagePartTemplateContentId");
//logger.info("id 1: " + id);
//logger.info("contentId 1:" + contentId);
//logger.info("name 1: " + name);
//logger.info("isInherited 1: " + isInherited);
//logger.info("pagePartTemplateContentId 1: " + pagePartTemplateContentId);
try
{
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(contentId, db);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("2 took", t.getElapsedTime());
//logger.info("slotName:" + slotName + " should get connected with content_" + contentVO.getId());
groups = new String[]{CacheController.getPooledString(1, contentVO.getId())};
InfoGlueComponent component = new InfoGlueComponent();
component.setPositionInSlot(new Integer(slotPosition));
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(isInherited != null && isInherited.equals("true"))
component.setIsInherited(true);
else if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
if(pagePartTemplateContentId != null && !pagePartTemplateContentId.equals("") && !pagePartTemplateContentId.equals("-1"))
{
Integer pptContentId = new Integer(pagePartTemplateContentId);
ContentVO pptContentIdContentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(pptContentId, db);
InfoGlueComponent partTemplateReferenceComponent = new InfoGlueComponent();
partTemplateReferenceComponent.setPositionInSlot(new Integer(slotPosition));
partTemplateReferenceComponent.setId(id);
partTemplateReferenceComponent.setContentId(pptContentId);
partTemplateReferenceComponent.setName(pptContentIdContentVO.getName());
partTemplateReferenceComponent.setSlotName(name);
partTemplateReferenceComponent.setParentComponent(parentComponent);
partTemplateReferenceComponent.setIsInherited(true);
component.setPagePartTemplateContentId(pptContentId);
component.setPagePartTemplateComponent(partTemplateReferenceComponent);
}
//Use this later
//getComponentProperties(componentElement, component, locale, templateController);
List propertiesNodeList = componentElement.selectNodes("properties");
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("propertiesNodeList LOG4J size: " + propertiesNodeList.size(), t.getElapsedTime());
if(propertiesNodeList.size() > 0)
{
Element propertiesElement = (Element)propertiesNodeList.get(0);
List propertyNodeList = propertiesElement.selectNodes("property");
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
Element propertyElement = (Element)propertyNodeListIterator.next();
String propertyName = propertyElement.attributeValue("name");
String type = propertyElement.attributeValue("type");
String path = propertyElement.attributeValue("path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode());
}
if(propertyElement.attributeValue("path_" + locale.getLanguage()) != null)
path = propertyElement.attributeValue("path_" + locale.getLanguage());
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 1 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
List attributes = propertyElement.attributes();
Iterator attributesIterator = attributes.iterator();
while(attributesIterator.hasNext())
{
Attribute attribute = (Attribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List<ComponentBinding> bindings = new ArrayList<ComponentBinding>();
List bindingNodeList = propertyElement.selectNodes("binding");
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("bindingNodeList LOG4J size: " + bindingNodeList.size(), t.getElapsedTime());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
Element bindingElement = (Element)bindingNodeListIterator.next();
String entity = bindingElement.attributeValue("entity");
String entityId = bindingElement.attributeValue("entityId");
String assetKey = bindingElement.attributeValue("assetKey");
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithDOM4j(componentElement, component, locale, templateController);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getComponentRestrictionsWithDOM4j", t.getElapsedTime());
//Getting slots for the component
try
{
String componentString = this.getComponentString(templateController, contentId, component);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getComponentString", t.getElapsedTime());
int offset = 0;
int slotStartIndex = componentString.indexOf("<ig:slot", offset);
while(slotStartIndex > -1)
{
int slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex);
String slotString = componentString.substring(slotStartIndex, slotStopIndex + 10);
String slotId = slotString.substring(slotString.indexOf("id") + 4, slotString.indexOf("\"", slotString.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slotString.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slotString.substring(inheritIndex + 9, slotString.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
boolean disableAccessControl = false;
int disableAccessControlIndex = slotString.indexOf("disableAccessControl");
if(disableAccessControlIndex > -1)
{
String disableAccessControlString = slotString.substring(disableAccessControlIndex + "disableAccessControl".length() + 2, slotString.indexOf("\"", disableAccessControlIndex + "disableAccessControl".length() + 2));
disableAccessControl = Boolean.parseBoolean(disableAccessControlString);
}
String[] allowedComponentNamesArray = null;
int allowedComponentNamesIndex = slotString.indexOf(" allowedComponentNames");
if(allowedComponentNamesIndex > -1)
{
String allowedComponentNames = slotString.substring(allowedComponentNamesIndex + 24, slotString.indexOf("\"", allowedComponentNamesIndex + 24));
allowedComponentNamesArray = allowedComponentNames.split(",");
}
String[] disallowedComponentNamesArray = null;
int disallowedComponentNamesIndex = slotString.indexOf(" disallowedComponentNames");
if(disallowedComponentNamesIndex > -1)
{
String disallowedComponentNames = slotString.substring(disallowedComponentNamesIndex + 27, slotString.indexOf("\"", disallowedComponentNamesIndex + 27));
disallowedComponentNamesArray = disallowedComponentNames.split(",");
}
String[] allowedComponentGroupNamesArray = null;
int allowedComponentGroupNamesIndex = slotString.indexOf(" allowedComponentGroupNames");
if(allowedComponentGroupNamesIndex > -1)
{
String allowedComponentGroupNames = slotString.substring(allowedComponentGroupNamesIndex + 29, slotString.indexOf("\"", allowedComponentGroupNamesIndex + 29));
allowedComponentGroupNamesArray = allowedComponentGroupNames.split(",");
}
String addComponentText = null;
int addComponentTextIndex = slotString.indexOf("addComponentText");
if(addComponentTextIndex > -1)
{
addComponentText = slotString.substring(addComponentTextIndex + "addComponentText".length() + 2, slotString.indexOf("\"", addComponentTextIndex + "addComponentText".length() + 2));
}
String addComponentLinkHTML = null;
int addComponentLinkHTMLIndex = slotString.indexOf("addComponentLinkHTML");
if(addComponentLinkHTMLIndex > -1)
{
addComponentLinkHTML = slotString.substring(addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2, slotString.indexOf("\"", addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2));
}
int allowedNumberOfComponentsInt = -1;
int allowedNumberOfComponentsIndex = slotString.indexOf("allowedNumberOfComponents");
if(allowedNumberOfComponentsIndex > -1)
{
String allowedNumberOfComponents = slotString.substring(allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2, slotString.indexOf("\"", allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2));
try
{
allowedNumberOfComponentsInt = new Integer(allowedNumberOfComponents);
}
catch (Exception e)
{
allowedNumberOfComponentsInt = -1;
}
}
Slot slot = new Slot();
slot.setId(slotId);
slot.setInherit(inherit);
slot.setDisableAccessControl(disableAccessControl);
slot.setAllowedComponentsArray(allowedComponentNamesArray);
slot.setDisallowedComponentsArray(disallowedComponentNamesArray);
slot.setAllowedComponentGroupsArray(allowedComponentGroupNamesArray);
slot.setAddComponentLinkHTML(addComponentLinkHTML);
slot.setAddComponentText(addComponentText);
slot.setAllowedNumberOfComponents(new Integer(allowedNumberOfComponentsInt));
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Parsing slots DOM4J", t.getElapsedTime());
Element componentsElement = (Element)componentElement.selectSingleNode("components");
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("DOM4J componentsElement:" + componentsElement, t.getElapsedTime());
//logger.info("componentsElement:" + componentsElement);
//groups = new String[]{CacheController.getPooledString(1, contentVO.getId())};
List tempChildComponents = new ArrayList();
List subComponents = getPageComponentsWithDOM4j(db, componentXML, componentsElement, slotId, templateController, component, childComponents);
childComponents.addAll(tempChildComponents);
slot.setComponents(subComponents);
component.getSlotList().add(slot);
offset = slotStopIndex;
slotStartIndex = componentString.indexOf("<ig:slot", offset);
}
}
catch(Exception e)
{
logger.warn("An component with either an empty template or with no template in the sitelanguages was found:" + e.getMessage());
}
components.add(component);
}
catch(Exception e)
{
logger.warn("There was deleted referenced component or some other problem when rendering siteNode: " + templateController.getCurrentPagePath() + "(" + templateController.getSiteNodeId() + ") in language " + templateController.getLanguageId() + ":" + e.getMessage());
}
slotPosition++;
}
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("All page components", t.getElapsedTime());
if(groups == null)
groups = new String[]{"selectiveCacheUpdateNonApplicable"};
if(components != null)
{
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", key, components, groups, false);
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", keyChildComponents, childComponents, groups, false);
}
else
{
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", key, new NullObject(), groups, false);
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", keyChildComponents, new NullObject(), groups, false);
}
}
//logger.info("sortedPageComponents:" + sortedPageComponents.size());
//logger.info("childComponents:" + childComponents.size());
if(sortedPageComponents != null)
{
sortedPageComponents.addAll(components);
sortedPageComponents.addAll(childComponents);
}
return components;
}
*/
protected List getPageComponentsWithXPP3(Database db, String componentXML, XmlElement element, String slotName, TemplateController templateController, InfoGlueComponent parentComponent, List sortedPageComponents) throws Exception
{
Locale locale = LanguageDeliveryController.getLanguageDeliveryController().getLocaleWithId(db, templateController.getLanguageId());
StringBuilder key = new StringBuilder("" + componentXML.hashCode()).append("_").append(templateController.getLanguageId()).append("_").append(slotName);
if(parentComponent != null)
key = new StringBuilder("" + componentXML.hashCode()).append("_").append(templateController.getLanguageId()).append("_").append(slotName).append("_").append(parentComponent.getId()).append("_").append(parentComponent.getName()).append("_").append(parentComponent.getIsInherited());
String keyChildComponents = key + "_childComponents";
Object componentsCandidate = CacheController.getCachedObjectFromAdvancedCache("pageComponentsCache", key.toString());
Object childComponentsCandidate = CacheController.getCachedObjectFromAdvancedCache("pageComponentsCache", keyChildComponents);
if(templateController.getOperatingMode() == 0 && templateController.getHttpServletRequest().getParameter("siteNodeVersionId") != null && !templateController.getHttpServletRequest().getParameter("siteNodeVersionId").equals(""))
{
componentsCandidate = null;
childComponentsCandidate = null;
}
List components = new ArrayList();
List childComponents = new ArrayList();
String[] groups = null;
if(childComponentsCandidate != null)
{
if(componentsCandidate instanceof NullObject)
childComponents = Collections.EMPTY_LIST;
else
childComponents = (List)childComponentsCandidate;
}
if(componentsCandidate != null)
{
if(componentsCandidate instanceof NullObject)
components = null;
else
components = (List)componentsCandidate;
}
else
{
Timer t = new Timer();
//logger.info("key:" + key);
String componentXPath = "component[@name='" + slotName + "']";
//logger.info("componentXPath:" + componentXPath);
Xb1XPath xpathObject = (Xb1XPath)cachedXPathObjects.get(componentXPath);
if(xpathObject == null)
{
xpathObject = new Xb1XPath( componentXPath );
cachedXPathObjects.put(componentXPath, xpathObject);
}
List anl = xpathObject.selectNodes( element );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP3 selectNodes size:" + anl.size(), t.getElapsedTime());
//logger.info("anl:" + anl.size());
//logger.info("componentElements:" + componentElements.size());
Iterator componentIterator = anl.iterator();
int slotPosition = 0;
while(componentIterator.hasNext())
{
XmlElement componentElement = (XmlElement)componentIterator.next();
Integer id = new Integer(componentElement.getAttributeValue(componentElement.getNamespaceName(), "id"));
Integer contentId = new Integer(componentElement.getAttributeValue(componentElement.getNamespaceName(), "contentId"));
String name = componentElement.getAttributeValue(componentElement.getNamespaceName(), "name");
String isInherited = componentElement.getAttributeValue(componentElement.getNamespaceName(), "isInherited");
String pagePartTemplateContentId = componentElement.getAttributeValue(componentElement.getNamespaceName(), "pagePartTemplateContentId");
String isPagePartRef = componentElement.getAttributeValue(componentElement.getNamespaceName(), "isPagePartReference");
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP 1 took", t.getElapsedTime());
try
{
ContentVO contentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(db, contentId, templateController.getDeliveryContext());
//logger.info("slotName:" + slotName + " should get connected with content_" + contentVO.getId());
groups = new String[]{CacheController.getPooledString(1, contentVO.getId())};
InfoGlueComponent component = new InfoGlueComponent();
component.setPositionInSlot(new Integer(slotPosition));
component.setId(id);
component.setContentId(contentId);
component.setName(contentVO.getName());
component.setSlotName(name);
component.setParentComponent(parentComponent);
if(isInherited != null && isInherited.equals("true"))
component.setIsInherited(true);
else if(parentComponent != null)
component.setIsInherited(parentComponent.getIsInherited());
if(pagePartTemplateContentId != null && !pagePartTemplateContentId.equals("") && !pagePartTemplateContentId.equals("-1"))
{
Integer pptContentId = new Integer(pagePartTemplateContentId);
ContentVO pptContentIdContentVO = ContentDeliveryController.getContentDeliveryController().getContentVO(db, pptContentId, templateController.getDeliveryContext());
InfoGlueComponent partTemplateReferenceComponent = new InfoGlueComponent();
partTemplateReferenceComponent.setPositionInSlot(new Integer(slotPosition));
partTemplateReferenceComponent.setId(id);
partTemplateReferenceComponent.setContentId(pptContentId);
partTemplateReferenceComponent.setName(pptContentIdContentVO.getName());
partTemplateReferenceComponent.setSlotName(name);
partTemplateReferenceComponent.setParentComponent(parentComponent);
partTemplateReferenceComponent.setIsInherited(true);
component.setPagePartTemplateContentId(pptContentId);
component.setPagePartTemplateComponent(partTemplateReferenceComponent);
}
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("3 took", t.getElapsedTime());
Xb1XPath xpathObject3 = (Xb1XPath)cachedXPathObjects.get("properties");
if(xpathObject3 == null)
{
xpathObject3 = new Xb1XPath("properties");
cachedXPathObjects.put("properties", xpathObject3);
}
List propertiesNodeList = xpathObject3.selectNodes( componentElement );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP3 propertiesNodeList:" + propertiesNodeList.size(), t.getElapsedTime());
//logger.info("XPP3 componentElement:" + componentElement);
if(propertiesNodeList.size() > 0)
{
XmlElement propertiesElement = (XmlElement)propertiesNodeList.get(0);
Xb1XPath xpathObject4 = (Xb1XPath)cachedXPathObjects.get("property");
if(xpathObject4 == null)
{
xpathObject4 = new Xb1XPath("property");
cachedXPathObjects.put("property", xpathObject4);
}
List propertyNodeList = xpathObject4.selectNodes( propertiesElement );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP3 propertyNodeList:" + propertyNodeList.size(), t.getElapsedTime());
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
XmlElement propertyElement = (XmlElement)propertyNodeListIterator.next();
String propertyName = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "name");
String type = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "type");
String path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + langaugeVO.getLanguageCode());
}
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + locale.getLanguage());
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 1 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.getAttributeValue(propertyElement.getNamespaceName(), "path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
property.put("isPagePartReference", (isPagePartRef == null ? "false" : isPagePartRef));
Iterator attributesIterator = propertyElement.attributes();
while(attributesIterator.hasNext())
{
XmlAttribute attribute = (XmlAttribute)attributesIterator.next();
if(attribute.getName().startsWith("path_"))
property.put(attribute.getName(), attribute.getValue());
}
if(path != null)
{
if(propertyName.equals(InfoGlueComponent.CACHE_RESULT_PROPERTYNAME) && (path.equalsIgnoreCase("true") || path.equalsIgnoreCase("yes")))
{
component.setCacheResult(true);
}
if(propertyName.equals(InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME) && !path.equals(""))
{
try { component.setUpdateInterval(Integer.parseInt(path)); } catch (Exception e) { logger.warn("The component " + component.getName() + " " + InfoGlueComponent.UPDATE_INTERVAL_PROPERTYNAME + " with a faulty value on page " + this.getTemplateController().getOriginalFullURL() + ":" + e.getMessage()); }
}
if(propertyName.equals(InfoGlueComponent.CACHE_KEY_PROPERTYNAME) && !path.equals(""))
{
component.setCacheKey(path);
}
if(propertyName.equals(InfoGlueComponent.PREPROCESSING_ORDER_PROPERTYNAME) && !path.equals(""))
{
component.setPreProcessingOrder(path);
}
}
List<ComponentBinding> bindings = new ArrayList<ComponentBinding>();
Xb1XPath xpathObject5 = (Xb1XPath)cachedXPathObjects.get("binding");
if(xpathObject5 == null)
{
xpathObject5 = new Xb1XPath("binding");
cachedXPathObjects.put("binding", xpathObject5);
}
List bindingNodeList = xpathObject5.selectNodes( propertyElement );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP3 bindingNodeList:" + bindingNodeList.size(), t.getElapsedTime());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
XmlElement bindingElement = (XmlElement)bindingNodeListIterator.next();
String entity = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entity");
String entityId = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "entityId");
String assetKey = bindingElement.getAttributeValue(bindingElement.getNamespaceName(), "assetKey");
XmlElement supplementingBindingElement = bindingElement.element(bindingElement.getNamespace(), "supplementing-binding");
ComponentBinding componentBinding;
if (supplementingBindingElement == null)
{
componentBinding = new ComponentBinding();
}
else
{
String supplementingEntityIdString = null;
try
{
supplementingEntityIdString = supplementingBindingElement.getAttributeValue(supplementingBindingElement.getNamespaceName(), "entityId");
Integer supplementingEntityId = null;
if (supplementingEntityIdString != null && !supplementingEntityIdString.equals(""))
{
supplementingEntityId = new Integer(supplementingEntityIdString);
}
String supplementingAssetKey = supplementingBindingElement.getAttributeValue(supplementingBindingElement.getNamespaceName(), "assetKey");
supplementingAssetKey = StringEscapeUtils.unescapeXml(supplementingAssetKey);
componentBinding = new SupplementedComponentBinding(supplementingEntityId, supplementingAssetKey);
}
catch (NumberFormatException ex)
{
logger.error("Could not make Integer from supplementing entity id [id: " + supplementingEntityIdString + "]. Will ignore it!. Property name: " + propertyName);
componentBinding = new ComponentBinding();
}
}
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
}
}
getComponentRestrictionsWithXPP3(componentElement, component, locale, templateController);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getComponentRestrictions", t.getElapsedTime());
//Getting slots for the component
try
{
String componentString = this.getComponentString(templateController, contentId, component);
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("getComponentString", t.getElapsedTime());
int offset = 0;
int slotStartIndex = componentString.indexOf("<ig:slot", offset);
while(slotStartIndex > -1)
{
int slotStopIndex = componentString.indexOf("</ig:slot>", slotStartIndex);
String slotString = componentString.substring(slotStartIndex, slotStopIndex + 10);
String slotId = slotString.substring(slotString.indexOf("id") + 4, slotString.indexOf("\"", slotString.indexOf("id") + 4));
boolean inherit = true;
int inheritIndex = slotString.indexOf("inherit");
if(inheritIndex > -1)
{
String inheritString = slotString.substring(inheritIndex + 9, slotString.indexOf("\"", inheritIndex + 9));
inherit = Boolean.parseBoolean(inheritString);
}
boolean disableAccessControl = false;
int disableAccessControlIndex = slotString.indexOf("disableAccessControl");
if(disableAccessControlIndex > -1)
{
String disableAccessControlString = slotString.substring(disableAccessControlIndex + "disableAccessControl".length() + 2, slotString.indexOf("\"", disableAccessControlIndex + "disableAccessControl".length() + 2));
disableAccessControl = Boolean.parseBoolean(disableAccessControlString);
}
String[] allowedComponentNamesArray = null;
int allowedComponentNamesIndex = slotString.indexOf(" allowedComponentNames");
if(allowedComponentNamesIndex > -1)
{
String allowedComponentNames = slotString.substring(allowedComponentNamesIndex + 24, slotString.indexOf("\"", allowedComponentNamesIndex + 24));
allowedComponentNamesArray = allowedComponentNames.split(",");
}
String[] disallowedComponentNamesArray = null;
int disallowedComponentNamesIndex = slotString.indexOf(" disallowedComponentNames");
if(disallowedComponentNamesIndex > -1)
{
String disallowedComponentNames = slotString.substring(disallowedComponentNamesIndex + 27, slotString.indexOf("\"", disallowedComponentNamesIndex + 27));
disallowedComponentNamesArray = disallowedComponentNames.split(",");
}
String[] allowedComponentGroupNamesArray = null;
int allowedComponentGroupNamesIndex = slotString.indexOf(" allowedComponentGroupNames");
if(allowedComponentGroupNamesIndex > -1)
{
String allowedComponentGroupNames = slotString.substring(allowedComponentGroupNamesIndex + 29, slotString.indexOf("\"", allowedComponentGroupNamesIndex + 29));
allowedComponentGroupNamesArray = allowedComponentGroupNames.split(",");
}
String addComponentText = null;
int addComponentTextIndex = slotString.indexOf("addComponentText");
if(addComponentTextIndex > -1)
{
addComponentText = slotString.substring(addComponentTextIndex + "addComponentText".length() + 2, slotString.indexOf("\"", addComponentTextIndex + "addComponentText".length() + 2));
}
String addComponentLinkHTML = null;
int addComponentLinkHTMLIndex = slotString.indexOf("addComponentLinkHTML");
if(addComponentLinkHTMLIndex > -1)
{
addComponentLinkHTML = slotString.substring(addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2, slotString.indexOf("\"", addComponentLinkHTMLIndex + "addComponentLinkHTML".length() + 2));
}
int allowedNumberOfComponentsInt = -1;
int allowedNumberOfComponentsIndex = slotString.indexOf("allowedNumberOfComponents");
if(allowedNumberOfComponentsIndex > -1)
{
String allowedNumberOfComponents = slotString.substring(allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2, slotString.indexOf("\"", allowedNumberOfComponentsIndex + "allowedNumberOfComponents".length() + 2));
try
{
allowedNumberOfComponentsInt = new Integer(allowedNumberOfComponents);
}
catch (Exception e)
{
allowedNumberOfComponentsInt = -1;
}
}
Slot slot = new Slot();
slot.setId(slotId);
slot.setInherit(inherit);
slot.setDisableAccessControl(disableAccessControl);
slot.setAllowedComponentsArray(allowedComponentNamesArray);
slot.setDisallowedComponentsArray(disallowedComponentNamesArray);
slot.setAllowedComponentGroupsArray(allowedComponentGroupNamesArray);
slot.setAddComponentLinkHTML(addComponentLinkHTML);
slot.setAddComponentText(addComponentText);
slot.setAllowedNumberOfComponents(new Integer(allowedNumberOfComponentsInt));
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("Parsing slots", t.getElapsedTime());
Xb1XPath xpathObject2 = (Xb1XPath)cachedXPathObjects.get("components");
if(xpathObject2 == null)
{
xpathObject2 = new Xb1XPath("components");
cachedXPathObjects.put("components", xpathObject2);
}
XmlElement componentsElement = (XmlElement)xpathObject2.selectSingleNode( componentElement );
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("XPP3 componentsElement:" + componentsElement, t.getElapsedTime());
//logger.info("componentsElement:" + componentsElement);
//groups = new String[]{CacheController.getPooledString(1, contentVO.getId())};
List tempChildComponents = new ArrayList();
List subComponents = getPageComponentsWithXPP3(db, componentXML, componentsElement, slotId, templateController, component, childComponents);
childComponents.addAll(tempChildComponents);
slot.setComponents(subComponents);
component.getSlotList().add(slot);
offset = slotStopIndex;
slotStartIndex = componentString.indexOf("<ig:slot", offset);
}
}
catch(Exception e)
{
logger.warn("An component with either an empty template or with no template in the sitelanguages was found:" + e.getMessage());
}
components.add(component);
}
catch(Exception e)
{
logger.warn("There was deleted referenced component or some other problem when rendering siteNode: " + templateController.getCurrentPagePath() + "(" + templateController.getSiteNodeId() + ") in language " + templateController.getLanguageId() + ":" + e.getMessage());
}
slotPosition++;
}
//RequestAnalyser.getRequestAnalyser().registerComponentStatistics("All page components", t.getElapsedTime());
if(groups == null)
groups = new String[]{"selectiveCacheUpdateNonApplicable"};
if(templateController.getHttpServletRequest().getParameter("siteNodeVersionId") == null || templateController.getHttpServletRequest().getParameter("siteNodeVersionId").equals(""))
{
if(components != null)
{
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", key, components, groups, false);
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", keyChildComponents, childComponents, groups, false);
}
else
{
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", key, new NullObject(), groups, false);
CacheController.cacheObjectInAdvancedCache("pageComponentsCache", keyChildComponents, new NullObject(), groups, false);
}
}
}
//logger.info("sortedPageComponents:" + sortedPageComponents.size());
//logger.info("childComponents:" + childComponents.size());
if(sortedPageComponents != null)
{
sortedPageComponents.addAll(components);
sortedPageComponents.addAll(childComponents);
}
return components;
}
/**
* This method gets the component properties
*/
/*
private void getComponentProperties(Element child, InfoGlueComponent component, Locale locale, TemplateController templateController) throws Exception
{
List propertiesNodeList = child.selectNodes("properties");
//logger.info("propertiesNodeList:" + propertiesNodeList.getLength());
if(propertiesNodeList.size() > 0)
{
Element propertiesElement = (Element)propertiesNodeList.get(0);
List propertyNodeList = propertiesElement.selectNodes("property");
//logger.info("propertyNodeList:" + propertyNodeList.getLength());
Iterator propertyNodeListIterator = propertyNodeList.iterator();
while(propertyNodeListIterator.hasNext())
{
Element propertyElement = (Element)propertyNodeListIterator.next();
String propertyName = propertyElement.attributeValue("name");
String type = propertyElement.attributeValue("type");
String path = propertyElement.attributeValue("path");
if(path == null)
{
LanguageVO langaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForSiteNode(getDatabase(), templateController.getSiteNodeId());
if(propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + langaugeVO.getLanguageCode());
}
//logger.info("path:" + "path_" + locale.getLanguage() + ":" + propertyElement.attributeValue("path_" + locale.getLanguage()));
if(propertyElement.attributeValue("path_" + locale.getLanguage()) != null)
path = propertyElement.attributeValue("path_" + locale.getLanguage());
//logger.info("path:" + path);
if(path == null || path.equals(""))
{
logger.info("Falling back to content master language 1 for property:" + propertyName);
LanguageVO contentMasterLangaugeVO = LanguageDeliveryController.getLanguageDeliveryController().getMasterLanguageForRepository(getDatabase(), contentVO.getRepositoryId());
if(propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode()) != null)
path = propertyElement.attributeValue("path_" + contentMasterLangaugeVO.getLanguageCode());
}
Map property = new HashMap();
property.put("name", propertyName);
property.put("path", path);
property.put("type", type);
List bindings = new ArrayList();
List bindingNodeList = propertyElement.selectNodes("binding");
//logger.info("bindingNodeList:" + bindingNodeList.getLength());
Iterator bindingNodeListIterator = bindingNodeList.iterator();
while(bindingNodeListIterator.hasNext())
{
Element bindingElement = (Element)bindingNodeListIterator.next();
String entity = bindingElement.attributeValue("entity");
String entityId = bindingElement.attributeValue("entityId");
String assetKey = bindingElement.attributeValue("assetKey");
//logger.info("Binding found:" + entity + ":" + entityId);
ComponentBinding componentBinding = new ComponentBinding();
//componentBinding.setId(new Integer(id));
//componentBinding.setComponentId(componentId);
componentBinding.setEntityClass(entity);
componentBinding.setEntityId(new Integer(entityId));
componentBinding.setAssetKey(assetKey);
componentBinding.setBindingPath(path);
bindings.add(componentBinding);
}
property.put("bindings", bindings);
component.getProperties().put(propertyName, property);
}
}
}
*/
/**
* This method gets the restrictions for this component
*/
/*
private void getComponentRestrictionsWithDOM4j(Element child, InfoGlueComponent component, Locale locale, TemplateController templateController) throws Exception
{
//logger.info("Getting restrictions for " + component.getId() + ":" + child.getName());
List restrictionsNodeList = child.selectNodes("restrictions");
//logger.info("restrictionsNodeList:" + restrictionsNodeList.getLength());
if(restrictionsNodeList.size() > 0)
{
Element restrictionsElement = (Element)restrictionsNodeList.get(0);
List restrictionNodeList = restrictionsElement.selectNodes("restriction");
//logger.info("restrictionNodeList:" + restrictionNodeList.getLength());
Iterator restrictionNodeListIterator = restrictionNodeList.iterator();
while(restrictionNodeListIterator.hasNext())
{
Element restrictionElement = (Element)restrictionNodeListIterator.next();
ComponentRestriction restriction = new ComponentRestriction();
String type = restrictionElement.attributeValue("type");
if(type.equals("blockComponents"))
{
String slotId = restrictionElement.attributeValue("slotId");
String arguments = restrictionElement.attributeValue("arguments");
restriction.setType(type);
restriction.setSlotId(slotId);
restriction.setArguments(arguments);
}
component.getRestrictions().add(restriction);
}
}
}
*/
/**
* This method gets the restrictions for this component
*/
private void getComponentRestrictionsWithXPP3(XmlElement child, InfoGlueComponent component, Locale locale, TemplateController templateController) throws Exception
{
Xb1XPath xpathObject = (Xb1XPath)cachedXPathObjects.get("restrictions");
if(xpathObject == null)
{
xpathObject = new Xb1XPath("restrictions");
cachedXPathObjects.put("restrictions", xpathObject);
}
List restrictionsNodeList = xpathObject.selectNodes( child );
//logger.info("restrictionsNodeList:" + restrictionsNodeList.getLength());
if(restrictionsNodeList.size() > 0)
{
XmlElement restrictionsElement = (XmlElement)restrictionsNodeList.get(0);
Xb1XPath xpathObject2 = (Xb1XPath)cachedXPathObjects.get("restriction");
if(xpathObject2 == null)
{
xpathObject2 = new Xb1XPath("restriction");
cachedXPathObjects.put("restriction", xpathObject2);
}
List restrictionNodeList = xpathObject2.selectNodes( restrictionsElement );
//logger.info("restrictionNodeList:" + restrictionNodeList.getLength());
Iterator restrictionNodeListIterator = restrictionNodeList.iterator();
while(restrictionNodeListIterator.hasNext())
{
XmlElement restrictionElement = (XmlElement)restrictionNodeListIterator.next();
ComponentRestriction restriction = new ComponentRestriction();
String type = restrictionElement.getAttributeValue(restrictionElement.getNamespaceName(), "type");
if(type.equals("blockComponents"))
{
String slotId = restrictionElement.getAttributeValue(restrictionElement.getNamespaceName(), "slotId");
String arguments = restrictionElement.getAttributeValue(restrictionElement.getNamespaceName(), "arguments");
restriction.setType(type);
restriction.setSlotId(slotId);
restriction.setArguments(arguments);
}
component.getRestrictions().add(restriction);
}
}
}
}