Skip to content

Commit

Permalink
Implemented "[ #315252 ] RFE: Implement XForms static state caching b…
Browse files Browse the repository at this point in the history
…ased on static state digest".
  • Loading branch information
ebruchez committed Aug 13, 2010
1 parent 523999d commit b081a90
Show file tree
Hide file tree
Showing 29 changed files with 613 additions and 484 deletions.
4 changes: 2 additions & 2 deletions .idea/libraries/Orbeon_Forms.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

224 changes: 171 additions & 53 deletions src/java/org/orbeon/oxf/xforms/XFormsContainingDocument.java

Large diffs are not rendered by default.

34 changes: 15 additions & 19 deletions src/java/org/orbeon/oxf/xforms/XFormsModel.java
Expand Up @@ -27,22 +27,14 @@
import org.orbeon.oxf.xforms.event.*;
import org.orbeon.oxf.xforms.event.events.*;
import org.orbeon.oxf.xforms.function.xxforms.XXFormsExtractDocument;
import org.orbeon.oxf.xforms.submission.BaseSubmission;
import org.orbeon.oxf.xforms.submission.OptimizedSubmission;
import org.orbeon.oxf.xforms.submission.XFormsModelSubmission;
import org.orbeon.oxf.xforms.submission.*;
import org.orbeon.oxf.xforms.xbl.XBLBindings;
import org.orbeon.oxf.xforms.xbl.XBLContainer;
import org.orbeon.oxf.xml.TransformerUtils;
import org.orbeon.oxf.xml.dom4j.Dom4jUtils;
import org.orbeon.oxf.xml.dom4j.ExtendedLocationData;
import org.orbeon.oxf.xml.dom4j.LocationData;
import org.orbeon.saxon.om.DocumentInfo;
import org.orbeon.saxon.om.Item;
import org.orbeon.saxon.om.NodeInfo;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import org.orbeon.oxf.xml.dom4j.*;
import org.orbeon.saxon.om.*;

import java.net.*;
import java.util.*;

/**
Expand Down Expand Up @@ -371,7 +363,7 @@ private void loadSchemasIfNeeded(PropertyContext propertyContext) {
if (schemaValidator == null) {
final Element modelElement = staticModel.document.getRootElement();
schemaValidator = new XFormsModelSchemaValidator(modelElement, indentedLogger);
schemaValidator.loadSchemas(propertyContext);
schemaValidator.loadSchemas(propertyContext, containingDocument);

mustSchemaValidate = schemaValidator.hasSchema();
}
Expand Down Expand Up @@ -726,11 +718,14 @@ private void loadExternalInstance(final PropertyContext propertyContext, Instanc

// TODO: This doesn't handle optimized submissions.

final String resolvedInstanceURL = XFormsUtils.resolveServiceURL(propertyContext, containingDocument, instance.element, instance.instanceSource,
ExternalContext.Response.REWRITE_MODE_ABSOLUTE);

// NOTE: No XInclude supported to read instances with @src for now
final XFormsInstance sharedXFormsInstance
= XFormsServerSharedInstancesCache.instance().findConvert(propertyContext, indentedLogger,
instance.staticId, effectiveId,
instance.instanceSource, null, instance.isReadonlyHint, false, XFormsProperties.isExposeXPathTypes(containingDocument),
resolvedInstanceURL, null, instance.isReadonlyHint, false, XFormsProperties.isExposeXPathTypes(containingDocument),
instance.xxformsTimeToLive, instance.xxformsValidation, INSTANCE_LOADER);

setInstance(sharedXFormsInstance, false);
Expand All @@ -749,13 +744,13 @@ private void loadExternalInstance(final PropertyContext propertyContext, Instanc

if (optimizeLocal) {
// Use URL resolved against current context
final URI resolvedURI = XFormsUtils.resolveXMLBase(instance.element, instanceResource);
final URI resolvedURI = XFormsUtils.resolveXMLBase(containingDocument, instance.element, instanceResource);
loadInstanceOptimized(propertyContext, externalContext, instance.element, instance.staticId, resolvedURI.toString(), instance.isReadonlyHint, instance.xxformsValidation);
} else {
// Use full resolved resource URL
// o absolute URL, e.g. http://example.org/instance.xml
// o absolute path relative to server root, e.g. /orbeon/foo/bar/instance.xml
loadInstance(externalContext, instance);
loadInstance(propertyContext, externalContext, instance);
}
}
} catch (Exception e) {
Expand Down Expand Up @@ -811,9 +806,10 @@ public ReadonlyXFormsInstance load(PropertyContext propertyContext, String insta
/*
* Load an external instance using an absolute URL.
*/
private void loadInstance(ExternalContext externalContext, Instance instance) {
private void loadInstance(PropertyContext propertyContext, ExternalContext externalContext, Instance instance) {

final String absoluteURLString = instance.instanceSource;
final String absoluteURLString = XFormsUtils.resolveServiceURL(propertyContext, containingDocument, instance.element, instance.instanceSource,
ExternalContext.Response.REWRITE_MODE_ABSOLUTE);

assert NetUtils.urlHasProtocol(absoluteURLString);

Expand Down
2 changes: 1 addition & 1 deletion src/java/org/orbeon/oxf/xforms/XFormsModelBinds.java
Expand Up @@ -897,7 +897,7 @@ private void handleValidationBind(PropertyContext propertyContext, Bind bind, Li
// xforms:dayTimeDuration, xforms:yearMonthDuration, xforms:email, xforms:card-number
if (xformsValidator == null) {
xformsValidator = new XFormsModelSchemaValidator("oxf:/org/orbeon/oxf/xforms/xforms-types.xsd");
xformsValidator.loadSchemas(propertyContext);
xformsValidator.loadSchemas(propertyContext, containingDocument);
}

final String validationError =
Expand Down
46 changes: 14 additions & 32 deletions src/java/org/orbeon/oxf/xforms/XFormsModelSchemaValidator.java
Expand Up @@ -15,56 +15,37 @@

import com.sun.msv.datatype.xsd.DatatypeFactory;
import com.sun.msv.datatype.xsd.XSDatatype;
import com.sun.msv.grammar.Expression;
import com.sun.msv.grammar.Grammar;
import com.sun.msv.grammar.IDContextProvider2;
import com.sun.msv.grammar.*;
import com.sun.msv.grammar.xmlschema.*;
import com.sun.msv.reader.GrammarReaderController;
import com.sun.msv.reader.util.GrammarLoader;
import com.sun.msv.reader.xmlschema.XMLSchemaReader;
import com.sun.msv.util.DatatypeRef;
import com.sun.msv.util.StartTagInfo;
import com.sun.msv.util.StringRef;
import com.sun.msv.util.*;
import com.sun.msv.verifier.Acceptor;
import com.sun.msv.verifier.regexp.ExpressionAcceptor;
import com.sun.msv.verifier.regexp.REDocumentDeclaration;
import com.sun.msv.verifier.regexp.SimpleAcceptor;
import com.sun.msv.verifier.regexp.StringToken;
import com.sun.msv.verifier.regexp.*;
import com.sun.msv.verifier.regexp.xmlschema.XSAcceptor;
import com.sun.msv.verifier.regexp.xmlschema.XSREDocDecl;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.QName;
import org.orbeon.oxf.cache.Cache;
import org.orbeon.oxf.cache.CacheKey;
import org.orbeon.oxf.cache.ObjectCache;
import org.dom4j.*;
import org.orbeon.oxf.cache.*;
import org.orbeon.oxf.common.ValidationException;
import org.orbeon.oxf.pipeline.api.ExternalContext;
import org.orbeon.oxf.resources.URLFactory;
import org.orbeon.oxf.util.IndentedLogger;
import org.orbeon.oxf.util.LoggerFactory;
import org.orbeon.oxf.util.NetUtils;
import org.orbeon.oxf.util.PropertyContext;
import org.orbeon.oxf.util.*;
import org.orbeon.oxf.xforms.msv.IDConstraintChecker;
import org.orbeon.oxf.xml.*;
import org.orbeon.oxf.xml.dom4j.Dom4jUtils;
import org.orbeon.oxf.xml.dom4j.ExtendedLocationData;
import org.orbeon.oxf.xml.dom4j.LocationData;
import org.orbeon.oxf.xml.XMLUtils;
import org.orbeon.oxf.xml.dom4j.*;
import org.relaxng.datatype.Datatype;
import org.relaxng.datatype.DatatypeException;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.*;
import org.xml.sax.helpers.AttributesImpl;

import javax.xml.parsers.SAXParserFactory;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.*;

/**
* Provides XML Schema validation services for the XForms model.
Expand Down Expand Up @@ -648,15 +629,16 @@ private boolean validateChildren(final Element element, final Acceptor acceptor,
/**
* Load XForms model schemas.
*
* @param propertyContext current context
* @param propertyContext current context
* @param containingDocument current document
*/
public void loadSchemas(final PropertyContext propertyContext) {
public void loadSchemas(final PropertyContext propertyContext, XFormsContainingDocument containingDocument) {

// Check for external schema
if (schemaURIs != null && schemaURIs.length > 0) {
// Resolve URL
// NOTE: We do not support "optimized" access here, we always use an URL, because loadGrammar() wants a URL
final String resolvedURLString = XFormsUtils.resolveServiceURL(propertyContext, modelElement, schemaURIs[0],
final String resolvedURLString = XFormsUtils.resolveServiceURL(propertyContext, containingDocument, modelElement, schemaURIs[0],
ExternalContext.Response.REWRITE_MODE_ABSOLUTE);

// Load associated grammar
Expand Down

0 comments on commit b081a90

Please sign in to comment.