You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2013/10/29 20:34:26 UTC
svn commit: r1536861 - in /cxf/trunk/core/src/main/java/org/apache/cxf:
databinding/source/ staxutils/validation/
Author: dkulp
Date: Tue Oct 29 19:34:26 2013
New Revision: 1536861
URL: http://svn.apache.org/r1536861
Log:
Updates to cache the Woodstox schema grammer
Modified:
cxf/trunk/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataReader.java
cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/Stax2ValidationUtils.java
cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationInInterceptor.java
cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationOutInterceptor.java
cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/WoodstoxValidationImpl.java
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataReader.java?rev=1536861&r1=1536860&r2=1536861&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataReader.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/databinding/source/XMLStreamDataReader.java Tue Oct 29 19:34:26 2013
@@ -23,7 +23,6 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.util.Collection;
import java.util.List;
-import java.util.logging.Level;
import java.util.logging.Logger;
import javax.activation.DataSource;
@@ -227,17 +226,13 @@ public class XMLStreamDataReader impleme
WoodstoxValidationImpl impl = new WoodstoxValidationImpl();
XMLStreamWriter nullWriter = null;
- boolean canValidate = impl.canValidate();
- if (canValidate) {
+ if (impl.canValidate()) {
nullWriter = StaxUtils.createXMLStreamWriter(new NUllOutputStream());
- try {
- impl.setupValidation(nullWriter, message.getExchange().getService().getServiceInfos().get(0));
- } catch (Throwable t) {
- LOG.log(Level.FINE, "Trouble setting up validation.", t);
- canValidate = false;
- }
+ impl.setupValidation(nullWriter, message.getExchange().getEndpoint(),
+ message.getExchange().getService().getServiceInfos().get(0));
}
- if (canValidate) {
+ //check if the impl can still validate after the setup, possible issue loading schemas or similar
+ if (impl.canValidate()) {
//Can use the MSV libs and woodstox to handle the schema validation during
//parsing and processing. Much faster and single traversal
//filter xop node
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/Stax2ValidationUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/Stax2ValidationUtils.java?rev=1536861&r1=1536860&r2=1536861&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/Stax2ValidationUtils.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/Stax2ValidationUtils.java Tue Oct 29 19:34:26 2013
@@ -21,6 +21,7 @@ package org.apache.cxf.staxutils.validat
import java.util.Map;
import java.util.TreeMap;
+import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.XMLConstants;
@@ -32,6 +33,7 @@ import org.w3c.dom.Element;
import org.apache.cxf.common.i18n.Message;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.service.model.SchemaInfo;
import org.apache.cxf.service.model.ServiceInfo;
@@ -49,6 +51,7 @@ import org.codehaus.stax2.validation.XML
*/
class Stax2ValidationUtils {
private static final Logger LOG = LogUtils.getL7dLogger(Stax2ValidationUtils.class);
+ private static final String KEY = XMLValidationSchema.class.getName();
public Stax2ValidationUtils() {
new W3CMultiSchemaFactory(); // will throw if wrong woodstox.
@@ -59,7 +62,9 @@ class Stax2ValidationUtils {
*
* @throws XMLStreamException
*/
- public void setupValidation(XMLStreamReader reader, ServiceInfo serviceInfo) throws XMLStreamException {
+ public boolean setupValidation(XMLStreamReader reader, Endpoint endpoint, ServiceInfo serviceInfo)
+ throws XMLStreamException {
+
// Gosh, this is bad, but I don't know a better solution, unless we're willing
// to require the stax2 API no matter what.
XMLStreamReader effectiveReader = reader;
@@ -67,7 +72,10 @@ class Stax2ValidationUtils {
effectiveReader = ((DepthXMLStreamReader)reader).getReader();
}
final XMLStreamReader2 reader2 = (XMLStreamReader2)effectiveReader;
- XMLValidationSchema vs = getValidator(serviceInfo);
+ XMLValidationSchema vs = getValidator(endpoint, serviceInfo);
+ if (vs == null) {
+ return false;
+ }
reader2.setValidationProblemHandler(new ValidationProblemHandler() {
public void reportProblem(XMLValidationProblem problem) throws XMLValidationException {
@@ -76,11 +84,17 @@ class Stax2ValidationUtils {
}
});
reader2.validateAgainst(vs);
+ return true;
}
- public void setupValidation(XMLStreamWriter writer, ServiceInfo serviceInfo) throws XMLStreamException {
+ public boolean setupValidation(XMLStreamWriter writer, Endpoint endpoint, ServiceInfo serviceInfo)
+ throws XMLStreamException {
+
XMLStreamWriter2 writer2 = (XMLStreamWriter2)writer;
- XMLValidationSchema vs = getValidator(serviceInfo);
+ XMLValidationSchema vs = getValidator(endpoint, serviceInfo);
+ if (vs == null) {
+ return false;
+ }
writer2.setValidationProblemHandler(new ValidationProblemHandler() {
public void reportProblem(XMLValidationProblem problem) throws XMLValidationException {
@@ -88,6 +102,7 @@ class Stax2ValidationUtils {
}
});
writer2.validateAgainst(vs);
+ return true;
}
/**
@@ -97,32 +112,45 @@ class Stax2ValidationUtils {
* @return
* @throws XMLStreamException
*/
- private XMLValidationSchema getValidator(ServiceInfo serviceInfo) throws XMLStreamException {
- Map<String, EmbeddedSchema> sources = new TreeMap<String, EmbeddedSchema>();
-
- for (SchemaInfo schemaInfo : serviceInfo.getSchemas()) {
- XmlSchema sch = schemaInfo.getSchema();
- String uri = sch.getTargetNamespace();
- if (XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(uri)) {
- continue;
+ private XMLValidationSchema getValidator(Endpoint endpoint, ServiceInfo serviceInfo) throws XMLStreamException {
+ synchronized (endpoint) {
+ XMLValidationSchema ret = (XMLValidationSchema)endpoint.get(KEY);
+ if (ret == null) {
+ if (endpoint.containsKey(KEY)) {
+ return null;
+ }
+ Map<String, EmbeddedSchema> sources = new TreeMap<String, EmbeddedSchema>();
+
+ for (SchemaInfo schemaInfo : serviceInfo.getSchemas()) {
+ XmlSchema sch = schemaInfo.getSchema();
+ String uri = sch.getTargetNamespace();
+ if (XMLConstants.W3C_XML_SCHEMA_NS_URI.equals(uri)) {
+ continue;
+ }
+ LOG.info(uri);
+
+ Element serialized = schemaInfo.getElement();
+ String schemaSystemId = sch.getSourceURI();
+ if (null == schemaSystemId) {
+ schemaSystemId = sch.getTargetNamespace();
+ }
+
+ EmbeddedSchema embeddedSchema = new EmbeddedSchema(schemaSystemId, serialized);
+ sources.put(sch.getTargetNamespace(), embeddedSchema);
+ }
+
+ W3CMultiSchemaFactory factory = new W3CMultiSchemaFactory();
+ // I don't think that we need the baseURI.
+ try {
+ ret = factory.loadSchemas(null, sources);
+ endpoint.put(KEY, ret);
+ } catch (XMLStreamException ex) {
+ LOG.log(Level.INFO, "Problem loading schemas. Falling back to slower method.", ret);
+ endpoint.put(KEY, null);
+ }
}
- LOG.info(uri);
-
- Element serialized = schemaInfo.getElement();
- String schemaSystemId = sch.getSourceURI();
- if (null == schemaSystemId) {
- schemaSystemId = sch.getTargetNamespace();
- }
-
- EmbeddedSchema embeddedSchema = new EmbeddedSchema(schemaSystemId, serialized);
- sources.put(sch.getTargetNamespace(), embeddedSchema);
+ return ret;
}
-
- W3CMultiSchemaFactory factory = new W3CMultiSchemaFactory();
- XMLValidationSchema vs;
- // I don't think that we need the baseURI.
- vs = factory.loadSchemas(null, sources);
- return vs;
}
}
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationInInterceptor.java?rev=1536861&r1=1536860&r2=1536861&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationInInterceptor.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationInInterceptor.java Tue Oct 29 19:34:26 2013
@@ -56,7 +56,8 @@ public class StaxSchemaValidationInInter
try {
WoodstoxValidationImpl mgr = new WoodstoxValidationImpl();
if (mgr.canValidate()) {
- mgr.setupValidation(reader, message.getExchange().getService().getServiceInfos().get(0));
+ mgr.setupValidation(reader, message.getExchange().getEndpoint(),
+ message.getExchange().getService().getServiceInfos().get(0));
}
} catch (Throwable t) {
//likely no MSV or similar
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationOutInterceptor.java?rev=1536861&r1=1536860&r2=1536861&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationOutInterceptor.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/StaxSchemaValidationOutInterceptor.java Tue Oct 29 19:34:26 2013
@@ -56,7 +56,8 @@ public class StaxSchemaValidationOutInte
try {
WoodstoxValidationImpl mgr = new WoodstoxValidationImpl();
if (mgr.canValidate()) {
- mgr.setupValidation(writer, message.getExchange().getService().getServiceInfos().get(0));
+ mgr.setupValidation(writer, message.getExchange().getEndpoint(),
+ message.getExchange().getService().getServiceInfos().get(0));
}
} catch (Throwable t) {
//likely no MSV or similar
Modified: cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/WoodstoxValidationImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/WoodstoxValidationImpl.java?rev=1536861&r1=1536860&r2=1536861&view=diff
==============================================================================
--- cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/WoodstoxValidationImpl.java (original)
+++ cxf/trunk/core/src/main/java/org/apache/cxf/staxutils/validation/WoodstoxValidationImpl.java Tue Oct 29 19:34:26 2013
@@ -27,6 +27,7 @@ import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.service.model.ServiceInfo;
/**
@@ -54,15 +55,18 @@ public class WoodstoxValidationImpl {
/** {@inheritDoc}
* @throws XMLStreamException */
public void setupValidation(XMLStreamReader reader,
+ Endpoint endpoint,
ServiceInfo serviceInfo) throws XMLStreamException {
- if (utils != null && reader != null) {
- utils.setupValidation(reader, serviceInfo);
+ if (utils != null && reader != null && !utils.setupValidation(reader, endpoint, serviceInfo)) {
+ utils = null;
}
}
- public void setupValidation(XMLStreamWriter writer, ServiceInfo serviceInfo) throws XMLStreamException {
- if (utils != null && writer != null) {
- utils.setupValidation(writer, serviceInfo);
+ public void setupValidation(XMLStreamWriter writer,
+ Endpoint endpoint,
+ ServiceInfo serviceInfo) throws XMLStreamException {
+ if (utils != null && writer != null && !utils.setupValidation(writer, endpoint, serviceInfo)) {
+ utils = null;
}
}
}