Validation
001 package org.gxml.book.validation; 002 003 import java.io.InputStream; 004 import java.net.URI; 005 import java.util.LinkedList; 006 import java.util.List; 007 008 import org.gxml.book.common.SampleApp; 009 import org.gxml.sa.GxFragmentBuilder; 010 import org.gxml.sa.GxModel; 011 import org.gxml.sa.GxProcessingContext; 012 import org.gxml.xdm.Resolved; 013 import org.gxml.xdm.Resolver; 014 import org.gxml.xs.SmException; 015 import org.gxml.xs.SmExceptionCatcher; 016 import org.gxml.xs.SmExceptionHandler; 017 import org.gxml.xs.SmMetaLoadArgs; 018 019 import com.tibco.gxml.sa.common.helpers.DocumentBuilderFactory; 020 import com.tibco.gxml.sa.common.helpers.GxDocumentBuilder; 021 import com.tibco.gxml.sa.common.helpers.GxDocumentBuilderFactory; 022 import com.tibco.gxml.sa.common.helpers.SmAtomBridgeOnGxAtomBridgeAdapter; 023 import com.tibco.gxml.sa.processor.validation.GxContentValidator; 024 import com.tibco.gxml.sa.processor.validation.GxValidatorCache; 025 import com.tibco.gxml.sa.processor.validation.GxValidatorCacheFactory; 026 import com.tibco.gxml.sa.processor.validation.ValidatorCacheFactory; 027 import com.tibco.gxml.xs.W3cXmlSchemaParser; 028 029 public abstract class ValidationSample<I, U, N extends I, A extends I, S, T, X> extends SampleApp<I, U, N, A, S, T, X> 030 { 031 public void testByteStreamValidation() throws Exception 032 { 033 // Load a top-level schema into the processing context. 034 final List<Resolved<InputStream>> resources = new LinkedList<Resolved<InputStream>>(); 035 resources.add(getResolver().resolveInputStream(new URI("PurchaseOrder.xsd"))); 036 037 final SmExceptionCatcher errors = new SmExceptionCatcher(); 038 final SmMetaLoadArgs args = new SmMetaLoadArgs(); 039 040 final GxProcessingContext<I, U, N, A, S, T, X> pcx = newProcessingContext(); 041 042 final W3cXmlSchemaParser<A, S> parser = new W3cXmlSchemaParser<A, S>(new SmAtomBridgeOnGxAtomBridgeAdapter<A, S>(pcx.getAtomBridge())); 043 044 for (final Resolved<InputStream> resource : resources) 045 { 046 pcx.register(parser.parse(resource.getLocation(), resource.getResource(), resource.getSystemId(), errors, args, pcx)); 047 } 048 049 pcx.lock(); 050 051 // Create a validator... 052 final GxValidatorCacheFactory<A, S, T> vcf = new ValidatorCacheFactory<I, U, N, A, S, T, X>(pcx); 053 final GxValidatorCache<A, S, T> vc = vcf.newValidatorCache(); 054 final GxContentValidator<A, S, T> validator = vc.newContentValidator(); 055 056 // Set the downstream event handler which contains annotations and typed content. 057 // validator.setGxContentHandler(/* ...*/null); 058 validator.setExceptionHandler(errors); 059 060 // The document node that we wish to validate. 061 final Resolved<InputStream> xmlInput = getResolver().resolveInputStream(new URI("PurchaseOrder.xml")); 062 063 final GxDocumentBuilderFactory<N, S> factory = new DocumentBuilderFactory<I, U, N, A, S, T, X>(pcx); 064 065 final GxDocumentBuilder<N> builder = factory.newDocumentBuilder(); 066 067 final N document = builder.parse(xmlInput.getResource(), xmlInput.getSystemId()); 068 069 // Stream the document into the validator. 070 final GxModel<N, A, S, T> model = pcx.getModel(); 071 072 model.stream(document, true, true, validator); 073 074 if (errors.size() > 0) 075 { 076 // You've got errors.' 077 } 078 } 079 080 public void testTreeValidation() throws Exception 081 { 082 final Resolver resolver = getResolver(); 083 084 // Load a top-level schema into the processing context. 085 final List<Resolved<InputStream>> resources = new LinkedList<Resolved<InputStream>>(); 086 resources.add(getResolver().resolveInputStream(new URI("PurchaseOrder.xsd"))); 087 088 final SmExceptionCatcher errors = new SmExceptionCatcher(); 089 final SmMetaLoadArgs args = new SmMetaLoadArgs(); 090 091 final GxProcessingContext<I, U, N, A, S, T, X> pcx = newProcessingContext(); 092 final W3cXmlSchemaParser<A, S> parser = new W3cXmlSchemaParser<A, S>(new SmAtomBridgeOnGxAtomBridgeAdapter<A, S>(pcx.getAtomBridge())); 093 for (final Resolved<InputStream> resource : resources) 094 { 095 pcx.register(parser.parse(resource.getLocation(), resource.getResource(), resource.getSystemId(), errors, args, pcx)); 096 } 097 pcx.lock(); 098 // The document node that we wish to validate. 099 @SuppressWarnings("unused") 100 final URI xmlLocation = new URI("PurchaseOrder.xml"); 101 final URI xmlSystemId = new URI("PurchaseOrder.xml"); 102 final Resolved<InputStream> xmlInput = resolver.resolveInputStream(xmlSystemId); 103 104 final GxDocumentBuilderFactory<N, S> factory = new DocumentBuilderFactory<I, U, N, A, S, T, X>(pcx); 105 106 final GxDocumentBuilder<N> builder = factory.newDocumentBuilder(); 107 108 final N documentIn = builder.parse(xmlInput.getResource(), xmlInput.getSystemId()); 109 110 @SuppressWarnings("unused") 111 final N documentOut = validate(documentIn, errors, pcx); 112 113 if (errors.size() > 0) 114 { 115 // You've got errors.' 116 for (@SuppressWarnings("unused") 117 final SmException error : errors) 118 { 119 // System.out.println(error.getLocalizedMessage()); 120 } 121 } 122 } 123 124 /** 125 * This static function illustrates a helper function for validating a document tree. <br/> 126 * Note that we assume that the processing context is already loaded with meta-data. 127 * 128 * @param node 129 * The input document. 130 * @param errors 131 * The error handler. 132 * @param pcx 133 * The processing context. 134 */ 135 public static <I, U, N extends I, A extends I, S, T, X> N validate(final N node, final SmExceptionHandler errors, final GxProcessingContext<I, U, N, A, S, T, X> pcx) 136 { 137 final GxValidatorCacheFactory<A, S, T> vcf = new ValidatorCacheFactory<I, U, N, A, S, T, X>(pcx); 138 139 // We already have a tree as input so we'll use the content validator' 140 // and stream the document in as a bunch of events (a bit like SAX, but not lexical). 141 final GxValidatorCache<A, S, T> vc = vcf.newValidatorCache(); 142 143 final GxContentValidator<A, S, T> validator = vc.newContentValidator(); 144 145 validator.setExceptionHandler(errors); 146 147 final GxModel<N, A, S, T> model = pcx.getModel(); 148 149 // We want to produce a node so we'll need a fragment builder at the output.' 150 final GxFragmentBuilder<N, A, S, T> builder = pcx.newFragmentBuilder(); 151 152 // Connect the pieces together so that the validation output builds a tree. 153 validator.setGxContentHandler(builder); 154 155 // Make it so! 156 model.stream(node, true, true, validator); 157 158 // Practice safe coding: We don't know what might happen if there are errors.' 159 final List<? extends N> nodes = builder.getNodes(); 160 if (nodes.size() > 0) 161 { 162 return nodes.get(0); 163 } 164 else 165 { 166 return null; 167 } 168 } 169 }
Copyright © 2022. Cloud Software Group, Inc. All Rights Reserved.