From ad53dcd44c6f0bf916d5f8a51e82bf4aef80eb8d Mon Sep 17 00:00:00 2001
From: David Abram Cargill <cargilld@apache.org>
Date: Wed, 23 Feb 2005 19:07:59 +0000
Subject: [PATCH] Various PSVI fixes from Mike Boos.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@176322 13f79535-47bb-0310-9956-ffa450edef68
---
 samples/PSVIWriter/PSVIUni.cpp                | 15 +++++++----
 samples/PSVIWriter/PSVIUni.hpp                |  5 ++--
 samples/PSVIWriter/PSVIWriter.cpp             |  6 +++++
 samples/PSVIWriter/PSVIWriterHandlers.cpp     | 25 +++++++++++++------
 samples/PSVIWriter/PSVIWriterHandlers.hpp     | 25 +++++++++++++++++++
 .../datatype/DatatypeValidatorFactory.cpp     | 14 +++++++++--
 6 files changed, 73 insertions(+), 17 deletions(-)

diff --git a/samples/PSVIWriter/PSVIUni.cpp b/samples/PSVIWriter/PSVIUni.cpp
index 02695795c..2de133a04 100644
--- a/samples/PSVIWriter/PSVIUni.cpp
+++ b/samples/PSVIWriter/PSVIUni.cpp
@@ -285,6 +285,11 @@ const XMLCh PSVIUni::fgElementDeclaration[] =
 	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_e, chLatin_l, chLatin_e, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_D, chLatin_e, chLatin_c, chLatin_l, chLatin_a, chLatin_r, chLatin_a, chLatin_t, chLatin_i, chLatin_o, chLatin_n, chNull
 };
 
+const XMLCh PSVIUni::fgFacetFixed[] =
+{
+	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_f, chLatin_i, chLatin_x, chLatin_e, chLatin_d, chNull
+};
+
 const XMLCh PSVIUni::fgFacets[] =
 {
 	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_f, chLatin_a, chLatin_c, chLatin_e, chLatin_t, chLatin_s, chNull
@@ -300,11 +305,6 @@ const XMLCh PSVIUni::fgFinal[] =
 	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_f, chLatin_i, chLatin_n, chLatin_a, chLatin_l, chNull
 };
 
-const XMLCh PSVIUni::fgFixed[] =
-{
-	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_f, chLatin_i, chLatin_x, chLatin_e, chLatin_d, chNull
-};
-
 const XMLCh PSVIUni::fgFundamentalFacets[] =
 {
 	chLatin_p, chLatin_s, chLatin_v, chColon, chLatin_f, chLatin_u, chLatin_n, chLatin_d, chLatin_a, chLatin_m, chLatin_e, chLatin_n, chLatin_t, chLatin_a, chLatin_l, chLatin_F, chLatin_a, chLatin_c, chLatin_e, chLatin_t, chLatin_s, chNull
@@ -795,6 +795,11 @@ const XMLCh PSVIUni::fgValid[] =
 	chLatin_v, chLatin_a, chLatin_l, chLatin_i, chLatin_d, chNull
 };
 
+const XMLCh PSVIUni::fgVCFixed[] =
+{
+	chLatin_f, chLatin_i, chLatin_x, chLatin_e, chLatin_d, chNull
+};
+
 const XMLCh PSVIUni::fgXMLChNull[] =
 {
 	chNull
diff --git a/samples/PSVIWriter/PSVIUni.hpp b/samples/PSVIWriter/PSVIUni.hpp
index 0e0b14cc7..2529ecaa8 100644
--- a/samples/PSVIWriter/PSVIUni.hpp
+++ b/samples/PSVIWriter/PSVIUni.hpp
@@ -83,9 +83,9 @@ public :
     static const XMLCh fgDocumentLocation[];
     static const XMLCh fgElementDeclaration[];
     static const XMLCh fgFacets[];
+    static const XMLCh fgFacetFixed[];
     static const XMLCh fgFields[];
-    static const XMLCh fgFinal[];
-    static const XMLCh fgFixed[];
+    static const XMLCh fgFinal[];    
     static const XMLCh fgFundamentalFacets[];
     static const XMLCh fgIdentityConstraintCategory[];
     static const XMLCh fgIdentityConstraintDefinition[];
@@ -186,6 +186,7 @@ public :
     static const XMLCh fgUnique[];
     static const XMLCh fgUnknown[];
     static const XMLCh fgValid[];
+    static const XMLCh fgVCFixed[];
     static const XMLCh fgXMLChNull[];
 
 	//PSVI Element Types (Shortened)
diff --git a/samples/PSVIWriter/PSVIWriter.cpp b/samples/PSVIWriter/PSVIWriter.cpp
index 8ee86b200..25639583a 100644
--- a/samples/PSVIWriter/PSVIWriter.cpp
+++ b/samples/PSVIWriter/PSVIWriter.cpp
@@ -17,6 +17,9 @@
 //REVISIT
 /*
  * $Log$
+ * Revision 1.7  2005/02/23 19:07:59  cargilld
+ * Various PSVI fixes from Mike Boos.
+ *
  * Revision 1.6  2005/01/12 20:43:21  cargilld
  * Remove warning messages.
  *
@@ -234,6 +237,9 @@ int main(int argC, char* argV[])
    	else
    		handler = new PSVIWriterHandlers(psviFormatter, errorFormatter);
 
+    PSVIAdvancedHandler* advancedHandler = new PSVIAdvancedHandler(handler);
+    parser->installAdvDocHandler(advancedHandler);
+
 	parser->setPSVIHandler(handler);
     parser->setContentHandler(handler);
     parser->setLexicalHandler(handler);
diff --git a/samples/PSVIWriter/PSVIWriterHandlers.cpp b/samples/PSVIWriter/PSVIWriterHandlers.cpp
index 82977540f..b8c5a3a2c 100644
--- a/samples/PSVIWriter/PSVIWriterHandlers.cpp
+++ b/samples/PSVIWriter/PSVIWriterHandlers.cpp
@@ -213,10 +213,6 @@ void PSVIWriterHandlers::startDocument() {
 	
 	writeOpen(PSVIUni::fgDocument, fAttrList);	
 	incIndent();
-	sendElementValue(PSVIUni::fgCharacterEncodingScheme, fFormatter->getEncodingName());
-	sendElementEmpty(PSVIUni::fgStandalone);
-	sendElementValue(PSVIUni::fgVersion, PSVIUni::fgOnePointZero);
-	
 	fElementChildren->push(false);
 }
 
@@ -822,7 +818,7 @@ void PSVIWriterHandlers::processFacets(XSFacetList* facets, XSMultiValueFacetLis
 				XSFacet* facet = facets->elementAt(facetCount);
 				sendIndentedElement(translateFacet(facet->getFacetKind()));
 				sendElementValue(PSVIUni::fgValue, facet->getLexicalFacetValue());
-				sendElementValue(PSVIUni::fgFixed, translateBool(facet->isFixed()));
+				sendElementValue(PSVIUni::fgFacetFixed, translateBool(facet->isFixed()));
 				processAnnotation(facet->getAnnotation());
 				sendUnindentedElement(translateFacet(facet->getFacetKind()));
 			}	
@@ -835,7 +831,7 @@ void PSVIWriterHandlers::processFacets(XSFacetList* facets, XSMultiValueFacetLis
 				for (unsigned int i=0; i < values->size(); i++) {
 					sendElementValue(PSVIUni::fgValue, values->elementAt(i));
 				}
-				sendElementValue(PSVIUni::fgFixed, translateBool(multiFacet->isFixed()));
+				sendElementValue(PSVIUni::fgFacetFixed, translateBool(multiFacet->isFixed()));
 				processAnnotations(multiFacet->getAnnotations());
 				sendUnindentedElement(translateFacet(multiFacet->getFacetKind()));
 			}	
@@ -1356,7 +1352,7 @@ const XMLCh* PSVIWriterHandlers::translateValueConstraint(XSConstants::VALUE_CON
 		case XSConstants::VALUE_CONSTRAINT_DEFAULT :
 			return PSVIUni::fgDefault;
 		case XSConstants::VALUE_CONSTRAINT_FIXED :
-			return PSVIUni::fgFixed;
+			return PSVIUni::fgVCFixed;
 		default :
 			return PSVIUni::fgUnknown;
 	}
@@ -1938,4 +1934,17 @@ void  PSVIWriterHandlers::processActualValue(PSVIItem* item)
 
     delete obj;
 
-}
\ No newline at end of file
+}
+
+void PSVIAdvancedHandler::XMLDecl(const XMLCh* const versionStr, const XMLCh* const encodingStr, const XMLCh* const standaloneStr, const XMLCh* const autoEncodingStr)
+{    
+    if (encodingStr && *encodingStr)
+        fWriterHandler->sendElementValue(PSVIUni::fgCharacterEncodingScheme, encodingStr);
+    else
+        fWriterHandler->sendElementValue(PSVIUni::fgCharacterEncodingScheme, autoEncodingStr);
+    if (standaloneStr && *standaloneStr)
+        fWriterHandler->sendElementValue(PSVIUni::fgStandalone, standaloneStr);
+	else
+        fWriterHandler->sendElementEmpty(PSVIUni::fgStandalone);
+	fWriterHandler->sendElementValue(PSVIUni::fgVersion, versionStr);        
+}
diff --git a/samples/PSVIWriter/PSVIWriterHandlers.hpp b/samples/PSVIWriter/PSVIWriterHandlers.hpp
index 070d649c6..3ae4fbc81 100644
--- a/samples/PSVIWriter/PSVIWriterHandlers.hpp
+++ b/samples/PSVIWriter/PSVIWriterHandlers.hpp
@@ -48,6 +48,7 @@
 #include <xercesc/framework/psvi/XSTypeDefinition.hpp>
 #include <xercesc/framework/psvi/XSWildcard.hpp>
 #include <xercesc/framework/XMLFormatter.hpp>
+#include <xercesc/framework/XMLDocumentHandler.hpp>
 #include <xercesc/dom/DOMElement.hpp>
 #include <xercesc/dom/DOMNamedNodeMap.hpp>
 #include <xercesc/util/ValueStackOf.hpp>
@@ -107,6 +108,7 @@ public:
     PSVIWriterHandlers(XMLFormatter* outputFormatter, XMLFormatter* errorFormatter = NULL);
     ~PSVIWriterHandlers();
     
+    friend class PSVIAdvancedHandler;
     // -----------------------------------------------------------------------
     //  Convenience Utility
     // -----------------------------------------------------------------------
@@ -278,6 +280,29 @@ protected:
 	RefVectorOf<AttrInfo>* fAttributesInfo;
 };
 
+class PSVIAdvancedHandler: public XMLDocumentHandler {
+public:
+    PSVIAdvancedHandler(PSVIWriterHandlers* writerHandler) : XMLDocumentHandler(), fWriterHandler(writerHandler) {}
+    ~PSVIAdvancedHandler() {}
+    void docCharacters(const XMLCh* const, const unsigned int, const bool) {}
+    void docComment(const XMLCh* const) {}
+    void docPI(const XMLCh* const, const XMLCh* const) {}
+    void endDocument() {}
+    void endElement(const XMLElementDecl&, const unsigned int, const bool, const XMLCh* const) {}
+    void endEntityReference(const   XMLEntityDecl&) {}
+   
+    void ignorableWhitespace(const XMLCh* const chars, const unsigned int length, const bool cdataSection) {}
+
+    void resetDocument() {}
+    void startDocument() {}
+    void startElement(const XMLElementDecl&, const unsigned int, const XMLCh* const, const RefVectorOf<XMLAttr>&
+                     ,const unsigned int, const bool, const bool) {}
+    void startEntityReference(const XMLEntityDecl&) {};
+
+    void XMLDecl(const XMLCh* const versionStr, const XMLCh* const encodingStr, const XMLCh* const standaloneStr, const XMLCh* const autoEncodingStr);    
+private:
+    PSVIWriterHandlers* fWriterHandler;
+};
 
 #endif
 
diff --git a/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp b/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
index 441c37ba4..aa86c4ab4 100644
--- a/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
+++ b/src/xercesc/validators/datatype/DatatypeValidatorFactory.cpp
@@ -16,6 +16,9 @@
 
 /*
  * $Log$
+ * Revision 1.31  2005/02/23 19:07:59  cargilld
+ * Various PSVI fixes from Mike Boos.
+ *
  * Revision 1.30  2004/10/20 15:19:07  knoaman
  * Allow option of initializing static data in XMLPlatformUtils::Initialize
  *
@@ -879,9 +882,16 @@ DatatypeValidator* DatatypeValidatorFactory::createDatatypeValidator
         // Set PSVI information for Ordered, Numeric, Bounded & Finite
         datatypeValidator->setOrdered(baseValidator->getOrdered());
         datatypeValidator->setNumeric(baseValidator->getNumeric());
+        RefHashTableOf<KVStringPair>* baseFacets = baseValidator->getFacets();
         if (facets  && 
-            ((facets->get(SchemaSymbols::fgELT_MININCLUSIVE) || facets->get(SchemaSymbols::fgELT_MINEXCLUSIVE)) &&
-             (facets->get(SchemaSymbols::fgELT_MAXINCLUSIVE) || facets->get(SchemaSymbols::fgELT_MAXEXCLUSIVE))))
+            ((facets->get(SchemaSymbols::fgELT_MININCLUSIVE) || 
+              facets->get(SchemaSymbols::fgELT_MINEXCLUSIVE) ||
+              (baseFacets && (baseFacets->get(SchemaSymbols::fgELT_MININCLUSIVE) || 
+                              baseFacets->get(SchemaSymbols::fgELT_MINEXCLUSIVE))))) &&
+             (facets->get(SchemaSymbols::fgELT_MAXINCLUSIVE) || 
+              facets->get(SchemaSymbols::fgELT_MAXEXCLUSIVE) || 
+              (baseFacets && ((baseFacets->get(SchemaSymbols::fgELT_MAXINCLUSIVE) || 
+                               baseFacets->get(SchemaSymbols::fgELT_MAXEXCLUSIVE))))))
         {
             datatypeValidator->setBounded(true);
         }
-- 
GitLab