log
.debug("retreived transformation character block cache for a key \""
+ cacheKey + "\"");
// start channel threads
for(int i=0;i<cacheEntries.size();i++) {
CacheEntry ce = cacheEntries.get(i);
if (ce.getCacheType().equals(CacheType.CHANNEL_CONTENT)) {
String channelSubscribeId = ((ChannelContentCacheEntry)ce).getChannelId();
if(channelSubscribeId!=null) {
try {
channelManager.startChannelRendering(req, res, channelSubscribeId);
} catch (PortalException e) {
log.error("UserInstance::renderState() : unable to start rendering channel (subscribeId=\""+channelSubscribeId+"\", user="+person.getID()+" layoutId="+uPreferencesManager.getCurrentProfile().getLayoutId(),e);
}
} else {
log.error("channel entry " + Integer.toString(i)
+ " in character cache is invalid (user=" + person.getID() + ")!");
}
}
}
channelManager.commitToRenderingChannelSet();
// go through the output loop
CachingSerializer cSerializer = (CachingSerializer) markupSerializer;
cSerializer.setDocumentStarted(true);
for(int sb=0; sb<cacheEntries.size();sb++) {
CacheEntry ce = cacheEntries.get(sb);
if (log.isDebugEnabled()) {
DebugCachingSerializer dcs = new DebugCachingSerializer();
log.debug("----------printing " + ce.getCacheType() + " cache block "+Integer.toString(sb));
ce.replayCache(dcs, channelManager, req, res);
log.debug(dcs.getCache());
}
// get cache block output
ce.replayCache(cSerializer, channelManager, req, res);
}
cSerializer.flush();
output_produced = true;
}
}
// if this failed, try XSLT cache
if ((!ccaching) || (!ccache_exists)) {
// obtain XSLT cache
SAX2BufferImpl cachedBuffer = systemCache.get(cacheKey);
if (cachedBuffer != null) {
// replay the buffer to channel incorporation filter
if (log.isDebugEnabled()) {
log.debug("retreived XSLT transformation cache for a key '" + cacheKey + "'");
}
// attach rendering buffer downstream of the cached buffer
ChannelRenderingBuffer crb = new ChannelRenderingBuffer(cachedBuffer, channelManager, ccaching, req, res);
// attach channel incorporation filter downstream of the channel rendering buffer
cif.setParent(crb);
crb.setOutputAtDocumentEnd(true);
cachedBuffer.outputBuffer(crb);
output_produced = true;
}
}
}
// fallback on the regular rendering procedure
if (!output_produced) {
// obtain transformer handlers for both structure and theme stylesheets
TransformerHandler ssth = XSLT.getTransformerHandler(ResourceLoader.getResourceAsURL(this.getClass(), ssd.getStylesheetURI()).toString());
TransformerHandler tsth = XSLT.getTransformerHandler(tsd.getStylesheetURI(), localeManager
.getLocales(), this);
// obtain transformer references from the handlers
Transformer sst = ssth.getTransformer();
sst.setErrorListener(cErrListener);
Transformer tst = tsth.getTransformer();
tst.setErrorListener(cErrListener);
// pass resourcesDao into transformer
tst.setParameter(ResourcesXalanElements.SKIN_RESOURCESDAO_PARAMETER_NAME, resourcesElementsProvider);
tst.setParameter(ResourcesXalanElements.CURRENT_REQUEST, req);
// initialize ChannelRenderingBuffer and attach it downstream of the structure transformer
ChannelRenderingBuffer crb = new ChannelRenderingBuffer(channelManager, ccaching, req, res);
ssth.setResult(new SAXResult(crb));
// determine and set the stylesheet params
// prepare .uP element and detach flag to be passed to the stylesheets
// Including the context path in front of uPElement is necessary for phone.com browsers to work
sst.setParameter("baseActionURL", uPElement.getUPFile());
// construct idempotent version of the uPElement
UPFileSpec uPIdempotentElement = new UPFileSpec(uPElement);
sst.setParameter("baseIdempotentActionURL", uPElement.getUPFile());
Hashtable<String, String> supTable = userPreferences.getStructureStylesheetUserPreferences()
.getParameterValues();
for (Map.Entry<String, String> param : supTable.entrySet()) {
String pName = param.getKey();
String pValue = param.getValue();
if (log.isDebugEnabled())
log.debug("setting sparam \"" + pName + "\"=\"" + pValue
+ "\".");
sst.setParameter(pName, pValue);
}
// all the parameters are set up, fire up structure transformation
// filter to fill in channel/folder attributes for the "structure" transformation.
StructureAttributesIncorporationFilter saif = new StructureAttributesIncorporationFilter(ssth,
userPreferences.getStructureStylesheetUserPreferences());
// This is a debug statement that will print out XML incoming to the
// structure transformation to a log file serializer to a printstream
StringWriter dbwr1 = null;
OutputFormat outputFormat = null;
if (logXMLBeforeStructureTransformation && log.isDebugEnabled()) {
dbwr1 = new StringWriter();
outputFormat = new OutputFormat();
outputFormat.setIndenting(true);
XMLSerializer dbser1 = new XMLSerializer(dbwr1, outputFormat);
SAX2DuplicatingFilterImpl dupl1 = new SAX2DuplicatingFilterImpl(ssth, dbser1);
dupl1.setParent(saif);
}
// if operating in the detach mode, need wrap everything
// in a document node and a <layout_fragment> node
boolean detachMode = !rootNodeId.equals(UPFileSpec.USER_LAYOUT_ROOT_NODE);
if (detachMode) {
saif.startDocument();
saif.startElement("",
"layout_fragment",
"layout_fragment",
new org.xml.sax.helpers.AttributesImpl());
// emptyt.transform(new DOMSource(rElement),new SAXResult(new ChannelSAXStreamFilter((ContentHandler)saif)));
if (rElement == null) {
ulm.getUserLayout(new ChannelSAXStreamFilter((ContentHandler) saif));
}
else {
ulm.getUserLayout(rElement.getId(), new ChannelSAXStreamFilter((ContentHandler) saif));
}
saif.endElement("", "layout_fragment", "layout_fragment");
saif.endDocument();
}
else {
if (rElement == null) {
ulm.getUserLayout(saif);
}
else {
ulm.getUserLayout(rElement.getId(), saif);
}
// emptyt.transform(new DOMSource(rElement),new SAXResult((ContentHandler)saif));
}
// all channels should be rendering now
// Debug piece to print out the recorded pre-structure transformation XML
if (logXMLBeforeStructureTransformation && log.isDebugEnabled()) {
log.debug("XML incoming to the structure transformation :\n\n"
+ dbwr1.toString() + "\n\n");
}
// prepare for the theme transformation
// set up of the parameters
tst.setParameter("baseActionURL", uPElement.getUPFile());
tst.setParameter("baseIdempotentActionURL", uPIdempotentElement.getUPFile());
if (externalLoginUrl != null) {
tst.setParameter("EXTERNAL_LOGIN_URL", externalLoginUrl);
}
Hashtable<String, String> tupTable = userPreferences.getThemeStylesheetUserPreferences()
.getParameterValues();
for (Map.Entry<String, String> param : tupTable.entrySet()) {
String pName = param.getKey();
String pValue = param.getValue();
if (log.isDebugEnabled())
log.debug("setting tparam \"" + pName + "\"=\"" + pValue
+ "\".");
tst.setParameter(pName, pValue);
}
VersionsManager versionsManager = VersionsManager.getInstance();
Version[] versions = versionsManager.getVersions();
for (Version version : versions) {
String paramName = "version-" + version.getFname();
tst.setParameter(paramName, version.dottedTriple());
}
// the uP_productAndVersion stylesheet parameter is deprecated
// instead use the more generic "version-UP_VERSION" generated from the
// framework's functional name when all versions are pulled immediately
// above.
Version uPortalVersion = versionsManager.getVersion(IPermission.PORTAL_FRAMEWORK);
tst.setParameter("uP_productAndVersion", "uPortal " + uPortalVersion.dottedTriple());
final Locale[] locales = localeManager.getLocales();
if (locales != null && locales.length > 0 && locales[0] != null) {
tst.setParameter("USER_LANG", locales[0].toString().replace('_', '-'));
}
// initialize a filter to fill in channel attributes for the "theme" (second) transformation.
// attach it downstream of the channel rendering buffer
ThemeAttributesIncorporationFilter taif = new ThemeAttributesIncorporationFilter(
(XMLReader) crb, userPreferences.getThemeStylesheetUserPreferences());
// attach theme transformation downstream of the theme attribute incorporation filter
taif.setAllHandlers(tsth);
// This is a debug statement that will print out XML incoming to the
// theme transformation to a log file serializer to a printstream
StringWriter dbwr2 = null;
if (logXMLBeforeThemeTransformation && log.isDebugEnabled()) {
dbwr2 = new StringWriter();
XMLSerializer dbser2 = new XMLSerializer(dbwr2, outputFormat);
SAX2DuplicatingFilterImpl dupl2 = new SAX2DuplicatingFilterImpl(tsth, dbser2);
dupl2.setParent(taif);
}
if (CACHE_ENABLED && !ccaching) {
// record cache
// attach caching buffer downstream of the theme transformer
SAX2BufferImpl newCache = new SAX2BufferImpl();
tsth.setResult(new SAXResult(newCache));
// attach channel incorporation filter downstream of the caching buffer
cif.setParent(newCache);
systemCache.put(cacheKey, newCache);
newCache.setOutputAtDocumentEnd(true);
if (log.isDebugEnabled())
log.debug("recorded transformation cache with key \""
+ cacheKey + "\"");
}
else {
// attach channel incorporation filter downstream of the theme transformer
tsth.setResult(new SAXResult(cif));
}
// fire up theme transformation
crb.stopBuffering();
crb.outputBuffer();
crb.clearBuffer();
// Debug piece to print out the recorded pre-theme transformation XML
if (logXMLBeforeThemeTransformation && log.isDebugEnabled()) {
log.debug("XML incoming to the theme transformation :\n\n"
+ dbwr2.toString() + "\n\n");
}
if (CACHE_ENABLED && ccaching) {
// save character block cache
List<CacheEntry> cacheBlocks = cif.getCacheBlocks();
if(cacheBlocks == null) {
log
.error("CharacterCachingChannelIncorporationFilter returned invalid cache entries!");
}
else {
// record cache
systemCharacterCache.put(cacheKey, cacheBlocks);
if (log.isDebugEnabled()) {
log
.debug("recorded transformation character block cache with key \""
+ cacheKey + "\"");
log.debug("Printing transformation cache blocks:");
for (int i=0; i<cacheBlocks.size(); i++) {
CacheEntry ce = cacheBlocks.get(i);
if (ce.getCacheType().equals(CacheType.CHARACTERS)) {
log.debug("----------piece "+Integer.toString(i));
} else if (ce.getCacheType().equals(CacheType.CHANNEL_CONTENT)) {
log.debug("----------channel content entry "+Integer.toString(i));
}
DebugCachingSerializer dcs = new DebugCachingSerializer();
ce.replayCache(dcs, channelManager, req, res);
log.debug(dcs.getCache());
}
}
}
}