Refactored simple content and child-handling into mixin classes.
[shibboleth/cpp-xmltooling.git] / xmltooling / XMLToolingConfig.cpp
index 9bd8b3e..de0a677 100644 (file)
  * Library configuration 
  */
 
+#define XMLTOOLING_DECLARE_VALIDATORS
+
 #include "internal.h"
+#include "exceptions.h"
 #include "XMLToolingConfig.h"
 #include "impl/UnknownElement.h"
-#include "signature/impl/XMLSecSignature.h"
+#include "signature/KeyInfo.h"
+#include "signature/Signature.h"
 #include "util/NDC.h"
+#include "util/XMLConstants.h"
+#include "validation/Validator.h"
 
 #ifdef HAVE_DLFCN_H
 # include <dlfcn.h>
 
 #include <stdexcept>
 
-using namespace log4cpp;
+using namespace xmlsignature;
 using namespace xmltooling;
+using namespace log4cpp;
 using namespace std;
 
-namespace {
+#define REGISTER_ELEMENT(namespaceURI,cname) \
+    q=QName(namespaceURI,cname::LOCAL_NAME); \
+    XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
+    Validator::registerValidator(q,new cname##SchemaValidator())
+    
+#define REGISTER_TYPE(namespaceURI,cname) \
+    q=QName(namespaceURI,cname::TYPE_NAME); \
+    XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
+    Validator::registerValidator(q,new cname##SchemaValidator())
+
+
+DECL_EXCEPTION_FACTORY(XMLParserException,xmltooling);
+DECL_EXCEPTION_FACTORY(XMLObjectException,xmltooling);
+DECL_EXCEPTION_FACTORY(MarshallingException,xmltooling);
+DECL_EXCEPTION_FACTORY(UnmarshallingException,xmltooling);
+DECL_EXCEPTION_FACTORY(UnknownElementException,xmltooling);
+DECL_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling);
+DECL_EXCEPTION_FACTORY(ValidationException,xmltooling);
+DECL_EXCEPTION_FACTORY(SignatureException,xmlsignature);
+
+namespace xmltooling {
    XMLToolingInternalConfig g_config;
 }
 
@@ -140,14 +167,64 @@ bool XMLToolingInternalConfig::init()
 
         // default registrations
         XMLObjectBuilder::registerDefaultBuilder(new UnknownElementBuilder());
-        Marshaller::registerDefaultMarshaller(new UnknownElementMarshaller());
-        Unmarshaller::registerDefaultUnmarshaller(new UnknownElementUnmarshaller());
+        
+        QName q;
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyInfo);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyName);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyValue);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,MgmtData);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,DSAKeyValue);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,RSAKeyValue);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Exponent);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Modulus);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,P);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Q);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,G);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Y);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,J);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Seed);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PgenCounter);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,XPath);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Transform);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Transforms);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,RetrievalMethod);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509IssuerSerial);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509IssuerName);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SerialNumber);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SKI);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SubjectName);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509Certificate);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509CRL);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509Data);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,SPKISexp);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,SPKIData);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPKeyID);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPKeyPacket);
+        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPData);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,KeyInfo);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,KeyValue);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,DSAKeyValue);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,RSAKeyValue);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,Transform);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,Transforms);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,RetrievalMethod);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,X509IssuerSerial);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,X509Data);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,SPKIData);
+        REGISTER_TYPE(XMLConstants::XMLSIG_NS,PGPData);
+
 #ifndef XMLTOOLING_NO_XMLSEC
-        QName dsig(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME);
-        XMLObjectBuilder::registerBuilder(dsig,new XMLSecSignatureBuilder());
-        Marshaller::registerMarshaller(dsig,new XMLSecSignatureMarshaller());
-        Unmarshaller::registerUnmarshaller(dsig,new XMLSecSignatureUnmarshaller());
+        XMLObjectBuilder::registerBuilder(QName(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME),new SignatureBuilder());
 #endif
+
+        REGISTER_EXCEPTION_FACTORY(XMLParserException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(XMLObjectException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(MarshallingException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(UnmarshallingException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(UnknownElementException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(ValidationException,xmltooling);
+        REGISTER_EXCEPTION_FACTORY(SignatureException,xmlsignature);
     }
     catch (const xercesc::XMLException&) {
         log.fatal("caught exception while initializing Xerces");
@@ -161,8 +238,8 @@ bool XMLToolingInternalConfig::init()
 void XMLToolingInternalConfig::term()
 {
     XMLObjectBuilder::destroyBuilders();
-    Marshaller::destroyMarshallers();
-    Unmarshaller::destroyUnmarshallers();
+    Validator::destroyValidators();
+    XMLToolingException::deregisterFactories();
 
     for (vector<void*>::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) {
 #if defined(WIN32)