/** * Restore an XFormsContainingDocument from XFormsState only. * * <p>Used by XFormsStateManager. * * @param xformsState XFormsState containing static and dynamic state * @param disableUpdates whether to disable updates (for recreating initial document upon browser * back) */ public XFormsContainingDocument(XFormsState xformsState, boolean disableUpdates) { super(); // 1. Restore the static state { final scala.Option<String> staticStateDigest = xformsState.staticStateDigest(); if (staticStateDigest.isDefined()) { final XFormsStaticState cachedState = XFormsStaticStateCache.instance().getDocument(staticStateDigest.get()); if (cachedState != null) { // Found static state in cache indentedLogger().logDebug("", "found static state by digest in cache"); this.staticState = cachedState; } else { // Not found static state in cache, create static state from input indentedLogger().logDebug("", "did not find static state by digest in cache"); indentedLogger().startHandleOperation("initialization", "restoring static state"); this.staticState = XFormsStaticStateImpl.restore(staticStateDigest, xformsState.staticState()); indentedLogger().endHandleOperation(); // Store in cache XFormsStaticStateCache.instance().storeDocument(this.staticState); } assert this.staticState.isServerStateHandling(); } else { // Not digest provided, create static state from input indentedLogger().logDebug("", "did not find static state by digest in cache"); this.staticState = XFormsStaticStateImpl.restore(staticStateDigest, xformsState.staticState()); assert this.staticState.isClientStateHandling(); } this.staticOps = new StaticStateGlobalOps(staticState.topLevelPart()); this.xpathDependencies = Version.instance().createUIDependencies(this); this.supportUpdates = !disableUpdates && !isNoUpdates(); } // 2. Restore the dynamic state indentedLogger().startHandleOperation("initialization", "restoring containing document"); try { restoreDynamicState(xformsState.dynamicState()); } catch (Exception e) { throw OrbeonLocationException.wrapException( e, new ExtendedLocationData(null, "re-initializing XForms containing document")); } indentedLogger().endHandleOperation(); }
private Stage2CacheableState readStaticState( PipelineContext pipelineContext, ExternalContext externalContext, IndentedLogger indentedLogger, XFormsStaticState[] staticState) { final StaticStateBits staticStateBits = new StaticStateBits(pipelineContext, externalContext, indentedLogger, null); { final XFormsStaticState cachedState = XFormsStaticStateCache.instance() .getDocument(pipelineContext, staticStateBits.staticStateDigest); if (cachedState != null && cachedState.getMetadata().checkBindingsIncludes()) { // Found static state in cache indentedLogger.logDebug("", "found up-to-date static state by digest in cache"); staticState[0] = cachedState; } else { // Not found static state in cache OR it is out of date, create and initialize static state // object // NOTE: In out of date case, could clone static state and reprocess instead? if (cachedState != null) indentedLogger.logDebug("", "found out-of-date static state by digest in cache"); else indentedLogger.logDebug("", "did not find static state by digest in cache"); staticState[0] = new XFormsStaticState( pipelineContext, staticStateBits.staticStateDocument, staticStateBits.staticStateDigest, staticStateBits.metadata); // Store in cache XFormsStaticStateCache.instance().storeDocument(pipelineContext, staticState[0]); } } // Update input dependencies object return new Stage2CacheableState( staticStateBits.annotatedTemplate, staticStateBits.staticStateDigest); }
private void doIt( final PipelineContext pipelineContext, XMLReceiver xmlReceiver, final URIProcessorOutputImpl processorOutput, String outputName) { final ExternalContext externalContext = XFormsUtils.getExternalContext(pipelineContext); final IndentedLogger indentedLogger = XFormsContainingDocument.getIndentedLogger( XFormsToXHTML.logger, XFormsServer.getLogger(), LOGGING_CATEGORY); // ContainingDocument and XFormsState created below final XFormsContainingDocument[] containingDocument = new XFormsContainingDocument[1]; final boolean[] cachedStatus = new boolean[] {false}; final Stage2CacheableState stage2CacheableState; if (TEST_STATE == null) { // Read and try to cache the complete XForms+XHTML document with annotations stage2CacheableState = (Stage2CacheableState) readCacheInputAsObject( pipelineContext, getInputByName(INPUT_ANNOTATED_DOCUMENT), new CacheableInputReader() { public Object read( PipelineContext pipelineContext, ProcessorInput processorInput) { // Compute annotated XForms document + static state document final Stage1CacheableState stage1CacheableState = new Stage1CacheableState(); final Stage2CacheableState stage2CacheableState; final XFormsStaticState[] staticState = new XFormsStaticState[1]; { // Store dependencies container in state before reading ((Stage2TransientState) XFormsToXHTML.this.getState(pipelineContext)) .stage1CacheableState = stage1CacheableState; // Read static state from input stage2CacheableState = readStaticState( pipelineContext, externalContext, indentedLogger, staticState); } // Create containing document and initialize XForms engine // NOTE: Create document here so we can do appropriate analysis of caching // dependencies final XFormsURIResolver uriResolver = new XFormsURIResolver( XFormsToXHTML.this, processorOutput, pipelineContext, INPUT_ANNOTATED_DOCUMENT, URLGenerator.DEFAULT_HANDLE_XINCLUDE); containingDocument[0] = new XFormsContainingDocument( pipelineContext, staticState[0], stage2CacheableState.getAnnotatedTemplate(), uriResolver); // Gather set caching dependencies gatherInputDependencies( pipelineContext, containingDocument[0], indentedLogger, stage1CacheableState); return stage2CacheableState; } @Override public void foundInCache() { cachedStatus[0] = true; } }, false); TEST_STATE = DO_TEST_STATE ? stage2CacheableState : null; } else { stage2CacheableState = TEST_STATE; } try { // Create containing document if not done yet if (containingDocument[0] == null) { assert cachedStatus[0]; // In this case, we found the static state digest and more in the cache, but we must now // create a new XFormsContainingDocument from this information indentedLogger.logDebug( "", "annotated document and static state digest obtained from cache", "digest", stage2CacheableState.getStaticStateDigest()); final XFormsStaticState staticState; { final XFormsStaticState cachedState = XFormsStaticStateCache.instance() .getDocument(pipelineContext, stage2CacheableState.getStaticStateDigest()); if (cachedState != null && cachedState.getMetadata().checkBindingsIncludes()) { // Found static state in cache indentedLogger.logDebug("", "found up-to-date static state by digest in cache"); staticState = cachedState; } else { // Not found static state in cache OR it is out of date, create static state from input // NOTE: In out of date case, could clone static state and reprocess instead? if (cachedState != null) indentedLogger.logDebug("", "found out-of-date static state by digest in cache"); else indentedLogger.logDebug("", "did not find static state by digest in cache"); final StaticStateBits staticStateBits = new StaticStateBits( pipelineContext, externalContext, indentedLogger, stage2CacheableState.getStaticStateDigest()); staticState = new XFormsStaticState( pipelineContext, staticStateBits.staticStateDocument, stage2CacheableState.getStaticStateDigest(), staticStateBits.metadata); // Store in cache XFormsStaticStateCache.instance().storeDocument(pipelineContext, staticState); } } final XFormsURIResolver uriResolver = new XFormsURIResolver( XFormsToXHTML.this, processorOutput, pipelineContext, INPUT_ANNOTATED_DOCUMENT, URLGenerator.DEFAULT_HANDLE_XINCLUDE); containingDocument[0] = new XFormsContainingDocument( pipelineContext, staticState, stage2CacheableState.getAnnotatedTemplate(), uriResolver); } else { assert !cachedStatus[0]; indentedLogger.logDebug( "", "annotated document and static state digest not obtained from cache."); } // Output resulting document if (outputName.equals("document")) { // Normal case where we output XHTML outputResponseDocument( pipelineContext, externalContext, indentedLogger, stage2CacheableState.getAnnotatedTemplate(), containingDocument[0], xmlReceiver); } else { // Output in test mode testOutputResponseState( pipelineContext, containingDocument[0], indentedLogger, xmlReceiver); } // Notify state manager XFormsStateManager.instance().afterInitialResponse(pipelineContext, containingDocument[0]); } catch (Throwable e) { indentedLogger.logDebug("", "throwable caught during initialization."); throw new OXFException(e); } }