From 410fb06eef4fec895fd0e8f44664468689fdb468 Mon Sep 17 00:00:00 2001 From: "vidur%netscape.com" Date: Wed, 9 Jan 2002 01:26:22 +0000 Subject: [PATCH] Record schema namespace since there are at least 2. [not part of build] --- extensions/webservices/public/nsISchema.idl | 2 + .../webservices/schema/src/nsSchema.cpp | 13 +++++- .../webservices/schema/src/nsSchemaLoader.cpp | 40 +++++++------------ .../webservices/schema/src/nsSchemaLoader.h | 1 + .../webservices/schema/src/nsSchemaPrivate.h | 8 +++- .../schema/src/nsSchemaSimpleTypes.cpp | 7 ++-- .../xmlextras/schema/public/nsISchema.idl | 2 + extensions/xmlextras/schema/src/nsSchema.cpp | 13 +++++- .../xmlextras/schema/src/nsSchemaLoader.cpp | 40 +++++++------------ .../xmlextras/schema/src/nsSchemaLoader.h | 1 + .../xmlextras/schema/src/nsSchemaPrivate.h | 8 +++- .../schema/src/nsSchemaSimpleTypes.cpp | 7 ++-- 12 files changed, 76 insertions(+), 66 deletions(-) diff --git a/extensions/webservices/public/nsISchema.idl b/extensions/webservices/public/nsISchema.idl index 9eb3a20eab00..1d34c7a80cc1 100644 --- a/extensions/webservices/public/nsISchema.idl +++ b/extensions/webservices/public/nsISchema.idl @@ -67,6 +67,8 @@ interface nsISchemaComponent : nsISupports { [scriptable, uuid(3c14a021-6f4e-11d5-9b46-000064657374)] interface nsISchema : nsISchemaComponent { + readonly attribute AString schemaNamespace; + readonly attribute PRUint32 typeCount; nsISchemaType getTypeByIndex(in PRUint32 index); nsISchemaType getTypeByName(in AString name); diff --git a/extensions/webservices/schema/src/nsSchema.cpp b/extensions/webservices/schema/src/nsSchema.cpp index a52d9b47a298..68759f8e4071 100644 --- a/extensions/webservices/schema/src/nsSchema.cpp +++ b/extensions/webservices/schema/src/nsSchema.cpp @@ -29,8 +29,9 @@ // //////////////////////////////////////////////////////////// nsSchema::nsSchema(nsISchemaCollection* aCollection, - const nsAReadableString& aTargetNamespace) - : mTargetNamespace(aTargetNamespace) + const nsAReadableString& aTargetNamespace, + const nsAReadableString& aSchemaNamespace) + : mTargetNamespace(aTargetNamespace), mSchemaNamespace(aSchemaNamespace) { NS_INIT_ISUPPORTS(); mCollection = aCollection; // Weak reference @@ -51,6 +52,14 @@ nsSchema::GetTargetNamespace(nsAWritableString& aTargetNamespace) return NS_OK; } +/* readonly attribute wstring schemaNamespace; */ +NS_IMETHODIMP +nsSchema::GetSchemaNamespace(nsAWritableString& aSchemaNamespace) +{ + aSchemaNamespace.Assign(mSchemaNamespace); + return NS_OK; +} + /* void resolve (); */ NS_IMETHODIMP nsSchema::Resolve() diff --git a/extensions/webservices/schema/src/nsSchemaLoader.cpp b/extensions/webservices/schema/src/nsSchemaLoader.cpp index 2632bfdd005a..1bce9d8d264c 100644 --- a/extensions/webservices/schema/src/nsSchemaLoader.cpp +++ b/extensions/webservices/schema/src/nsSchemaLoader.cpp @@ -493,7 +493,7 @@ nsSchemaLoader::GetType(const nsAReadableString & aName, nsISchemaType **_retval) { if (IsSchemaNamespace(aNamespace)) { - return GetBuiltinType(aName, _retval); + return GetBuiltinType(aName, aNamespace, _retval); } if (IsSOAPNamespace(aNamespace)) { @@ -681,10 +681,11 @@ nsSchemaLoader::ProcessSchemaElement(nsIDOMElement *element, nsresult rv = NS_OK; // Get target namespace and create the schema instance - nsAutoString targetNamespace; + nsAutoString targetNamespace, schemaNamespace; element->GetAttribute(NS_LITERAL_STRING("targetNamespace"), targetNamespace); - nsSchema* schemaInst = new nsSchema(this, targetNamespace); + element->GetNamespaceURI(schemaNamespace); + nsSchema* schemaInst = new nsSchema(this, targetNamespace, schemaNamespace); nsCOMPtr schema = schemaInst; if (!schema) { return NS_ERROR_OUT_OF_MEMORY; @@ -807,7 +808,7 @@ nsSchemaLoader::GetSOAPType(const nsAReadableString& aName, nsresult rv = NS_OK; nsAutoString concat(aNamespace); concat.Append(aName); - nsStringKey key(aName); + nsStringKey key(concat); nsCOMPtr sup = dont_AddRef(mSOAPTypeHash.Get(&key)); if (sup) { rv = CallQueryInterface(sup, aType); @@ -845,10 +846,13 @@ nsSchemaLoader::GetSOAPType(const nsAReadableString& aName, nsresult nsSchemaLoader::GetBuiltinType(const nsAReadableString& aName, + const nsAReadableString& aNamespace, nsISchemaType** aType) { nsresult rv = NS_OK; - nsStringKey key(aName); + nsAutoString concat(aName); + concat.Append(aNamespace); + nsStringKey key(concat); nsCOMPtr sup = dont_AddRef(mBuiltinTypesHash.Get(&key)); if (sup) { rv = CallQueryInterface(sup, aType); @@ -996,7 +1000,8 @@ nsSchemaLoader::GetBuiltinType(const nsAReadableString& aName, return NS_ERROR_SCHEMA_UNKNOWN_TYPE; } - nsSchemaBuiltinType* builtin = new nsSchemaBuiltinType(typeVal); + nsSchemaBuiltinType* builtin = new nsSchemaBuiltinType(typeVal, + aNamespace); if (!builtin) { return NS_ERROR_OUT_OF_MEMORY; } @@ -1042,26 +1047,6 @@ nsSchemaLoader::GetNewOrUsedType(nsSchema* aSchema, } } -#if 0 - if (namespaceURI.Length() > 0) { - if (IsSchemaNamespace(namespaceURI)) { - return GetBuiltinType(localName, aType); - } - - // XXX Currently we only understand the schema namespace or the - // target namspace. When we start dealing with includes and imports, - // we can search for types in other namespaces. - nsAutoString targetNamespace; - aSchema->GetTargetNamespace(targetNamespace); - if (!namespaceURI.Equals(targetNamespace)) { - return NS_ERROR_SCHEMA_UNKNOWN_TARGET_NAMESPACE; - } - } - - // We don't have a namespace, so get the local type - rv = aSchema->GetTypeByName(localName, aType); -#endif - // If we didn't get a type, we need to create a placeholder if (NS_SUCCEEDED(rv) && !*aType) { nsSchemaTypePlaceholder* placeholder = new nsSchemaTypePlaceholder(aSchema, @@ -1174,7 +1159,10 @@ nsSchemaLoader::ProcessElement(nsSchema* aSchema, } if (!schemaType) { + nsAutoString ns; + aElement->GetNamespaceURI(ns); rv = GetBuiltinType(NS_LITERAL_STRING("anyType"), + ns, getter_AddRefs(schemaType)); if (NS_FAILED(rv)) { return rv; diff --git a/extensions/webservices/schema/src/nsSchemaLoader.h b/extensions/webservices/schema/src/nsSchemaLoader.h index 9e3f74fcc91b..67e640b049e9 100644 --- a/extensions/webservices/schema/src/nsSchemaLoader.h +++ b/extensions/webservices/schema/src/nsSchemaLoader.h @@ -216,6 +216,7 @@ protected: const nsAReadableString& aTypeName, nsISchemaType** aType); nsresult GetBuiltinType(const nsAReadableString& aName, + const nsAReadableString& aNamespace, nsISchemaType** aType); nsresult GetSOAPType(const nsAReadableString& aName, const nsAReadableString& aNamespace, diff --git a/extensions/webservices/schema/src/nsSchemaPrivate.h b/extensions/webservices/schema/src/nsSchemaPrivate.h index 80dec44f53e0..a5b80f3983c8 100644 --- a/extensions/webservices/schema/src/nsSchemaPrivate.h +++ b/extensions/webservices/schema/src/nsSchemaPrivate.h @@ -43,7 +43,8 @@ class nsSchema : public nsISchema { public: nsSchema(nsISchemaCollection* aCollection, - const nsAReadableString& aTargetNamespace); + const nsAReadableString& aTargetNamespace, + const nsAReadableString& aSchemaNamespace); virtual ~nsSchema(); NS_DECL_ISUPPORTS @@ -61,6 +62,7 @@ public: protected: nsString mTargetNamespace; + nsString mSchemaNamespace; nsSupportsArray mTypes; nsSupportsHashtable mTypesHash; nsSupportsArray mAttributes; @@ -98,7 +100,8 @@ protected: class nsSchemaBuiltinType : public nsISchemaBuiltinType { public: - nsSchemaBuiltinType(PRUint16 aBuiltinType); + nsSchemaBuiltinType(PRUint16 aBuiltinType, + const nsAReadableString& aName); virtual ~nsSchemaBuiltinType(); NS_DECL_ISUPPORTS @@ -109,6 +112,7 @@ public: protected: PRUint16 mBuiltinType; + nsString mNamespace; }; class nsSchemaListType : public nsSchemaComponentBase, diff --git a/extensions/webservices/schema/src/nsSchemaSimpleTypes.cpp b/extensions/webservices/schema/src/nsSchemaSimpleTypes.cpp index 8e25ac4662c7..f9ca346000ee 100644 --- a/extensions/webservices/schema/src/nsSchemaSimpleTypes.cpp +++ b/extensions/webservices/schema/src/nsSchemaSimpleTypes.cpp @@ -28,8 +28,9 @@ // nsSchemaBuiltinType implementation // //////////////////////////////////////////////////////////// -nsSchemaBuiltinType::nsSchemaBuiltinType(PRUint16 aBuiltinType) - : mBuiltinType(aBuiltinType) +nsSchemaBuiltinType::nsSchemaBuiltinType(PRUint16 aBuiltinType, + const nsAReadableString& aNamespace) + : mBuiltinType(aBuiltinType), mNamespace(aNamespace) { NS_INIT_ISUPPORTS(); } @@ -48,7 +49,7 @@ NS_IMPL_ISUPPORTS4_CI(nsSchemaBuiltinType, NS_IMETHODIMP nsSchemaBuiltinType::GetTargetNamespace(nsAWritableString& aTargetNamespace) { - aTargetNamespace.Assign(NS_LITERAL_STRING(NS_SCHEMA_2001_NAMESPACE)); + aTargetNamespace.Assign(mNamespace); return NS_OK; } diff --git a/extensions/xmlextras/schema/public/nsISchema.idl b/extensions/xmlextras/schema/public/nsISchema.idl index 9eb3a20eab00..1d34c7a80cc1 100644 --- a/extensions/xmlextras/schema/public/nsISchema.idl +++ b/extensions/xmlextras/schema/public/nsISchema.idl @@ -67,6 +67,8 @@ interface nsISchemaComponent : nsISupports { [scriptable, uuid(3c14a021-6f4e-11d5-9b46-000064657374)] interface nsISchema : nsISchemaComponent { + readonly attribute AString schemaNamespace; + readonly attribute PRUint32 typeCount; nsISchemaType getTypeByIndex(in PRUint32 index); nsISchemaType getTypeByName(in AString name); diff --git a/extensions/xmlextras/schema/src/nsSchema.cpp b/extensions/xmlextras/schema/src/nsSchema.cpp index a52d9b47a298..68759f8e4071 100644 --- a/extensions/xmlextras/schema/src/nsSchema.cpp +++ b/extensions/xmlextras/schema/src/nsSchema.cpp @@ -29,8 +29,9 @@ // //////////////////////////////////////////////////////////// nsSchema::nsSchema(nsISchemaCollection* aCollection, - const nsAReadableString& aTargetNamespace) - : mTargetNamespace(aTargetNamespace) + const nsAReadableString& aTargetNamespace, + const nsAReadableString& aSchemaNamespace) + : mTargetNamespace(aTargetNamespace), mSchemaNamespace(aSchemaNamespace) { NS_INIT_ISUPPORTS(); mCollection = aCollection; // Weak reference @@ -51,6 +52,14 @@ nsSchema::GetTargetNamespace(nsAWritableString& aTargetNamespace) return NS_OK; } +/* readonly attribute wstring schemaNamespace; */ +NS_IMETHODIMP +nsSchema::GetSchemaNamespace(nsAWritableString& aSchemaNamespace) +{ + aSchemaNamespace.Assign(mSchemaNamespace); + return NS_OK; +} + /* void resolve (); */ NS_IMETHODIMP nsSchema::Resolve() diff --git a/extensions/xmlextras/schema/src/nsSchemaLoader.cpp b/extensions/xmlextras/schema/src/nsSchemaLoader.cpp index 2632bfdd005a..1bce9d8d264c 100644 --- a/extensions/xmlextras/schema/src/nsSchemaLoader.cpp +++ b/extensions/xmlextras/schema/src/nsSchemaLoader.cpp @@ -493,7 +493,7 @@ nsSchemaLoader::GetType(const nsAReadableString & aName, nsISchemaType **_retval) { if (IsSchemaNamespace(aNamespace)) { - return GetBuiltinType(aName, _retval); + return GetBuiltinType(aName, aNamespace, _retval); } if (IsSOAPNamespace(aNamespace)) { @@ -681,10 +681,11 @@ nsSchemaLoader::ProcessSchemaElement(nsIDOMElement *element, nsresult rv = NS_OK; // Get target namespace and create the schema instance - nsAutoString targetNamespace; + nsAutoString targetNamespace, schemaNamespace; element->GetAttribute(NS_LITERAL_STRING("targetNamespace"), targetNamespace); - nsSchema* schemaInst = new nsSchema(this, targetNamespace); + element->GetNamespaceURI(schemaNamespace); + nsSchema* schemaInst = new nsSchema(this, targetNamespace, schemaNamespace); nsCOMPtr schema = schemaInst; if (!schema) { return NS_ERROR_OUT_OF_MEMORY; @@ -807,7 +808,7 @@ nsSchemaLoader::GetSOAPType(const nsAReadableString& aName, nsresult rv = NS_OK; nsAutoString concat(aNamespace); concat.Append(aName); - nsStringKey key(aName); + nsStringKey key(concat); nsCOMPtr sup = dont_AddRef(mSOAPTypeHash.Get(&key)); if (sup) { rv = CallQueryInterface(sup, aType); @@ -845,10 +846,13 @@ nsSchemaLoader::GetSOAPType(const nsAReadableString& aName, nsresult nsSchemaLoader::GetBuiltinType(const nsAReadableString& aName, + const nsAReadableString& aNamespace, nsISchemaType** aType) { nsresult rv = NS_OK; - nsStringKey key(aName); + nsAutoString concat(aName); + concat.Append(aNamespace); + nsStringKey key(concat); nsCOMPtr sup = dont_AddRef(mBuiltinTypesHash.Get(&key)); if (sup) { rv = CallQueryInterface(sup, aType); @@ -996,7 +1000,8 @@ nsSchemaLoader::GetBuiltinType(const nsAReadableString& aName, return NS_ERROR_SCHEMA_UNKNOWN_TYPE; } - nsSchemaBuiltinType* builtin = new nsSchemaBuiltinType(typeVal); + nsSchemaBuiltinType* builtin = new nsSchemaBuiltinType(typeVal, + aNamespace); if (!builtin) { return NS_ERROR_OUT_OF_MEMORY; } @@ -1042,26 +1047,6 @@ nsSchemaLoader::GetNewOrUsedType(nsSchema* aSchema, } } -#if 0 - if (namespaceURI.Length() > 0) { - if (IsSchemaNamespace(namespaceURI)) { - return GetBuiltinType(localName, aType); - } - - // XXX Currently we only understand the schema namespace or the - // target namspace. When we start dealing with includes and imports, - // we can search for types in other namespaces. - nsAutoString targetNamespace; - aSchema->GetTargetNamespace(targetNamespace); - if (!namespaceURI.Equals(targetNamespace)) { - return NS_ERROR_SCHEMA_UNKNOWN_TARGET_NAMESPACE; - } - } - - // We don't have a namespace, so get the local type - rv = aSchema->GetTypeByName(localName, aType); -#endif - // If we didn't get a type, we need to create a placeholder if (NS_SUCCEEDED(rv) && !*aType) { nsSchemaTypePlaceholder* placeholder = new nsSchemaTypePlaceholder(aSchema, @@ -1174,7 +1159,10 @@ nsSchemaLoader::ProcessElement(nsSchema* aSchema, } if (!schemaType) { + nsAutoString ns; + aElement->GetNamespaceURI(ns); rv = GetBuiltinType(NS_LITERAL_STRING("anyType"), + ns, getter_AddRefs(schemaType)); if (NS_FAILED(rv)) { return rv; diff --git a/extensions/xmlextras/schema/src/nsSchemaLoader.h b/extensions/xmlextras/schema/src/nsSchemaLoader.h index 9e3f74fcc91b..67e640b049e9 100644 --- a/extensions/xmlextras/schema/src/nsSchemaLoader.h +++ b/extensions/xmlextras/schema/src/nsSchemaLoader.h @@ -216,6 +216,7 @@ protected: const nsAReadableString& aTypeName, nsISchemaType** aType); nsresult GetBuiltinType(const nsAReadableString& aName, + const nsAReadableString& aNamespace, nsISchemaType** aType); nsresult GetSOAPType(const nsAReadableString& aName, const nsAReadableString& aNamespace, diff --git a/extensions/xmlextras/schema/src/nsSchemaPrivate.h b/extensions/xmlextras/schema/src/nsSchemaPrivate.h index 80dec44f53e0..a5b80f3983c8 100644 --- a/extensions/xmlextras/schema/src/nsSchemaPrivate.h +++ b/extensions/xmlextras/schema/src/nsSchemaPrivate.h @@ -43,7 +43,8 @@ class nsSchema : public nsISchema { public: nsSchema(nsISchemaCollection* aCollection, - const nsAReadableString& aTargetNamespace); + const nsAReadableString& aTargetNamespace, + const nsAReadableString& aSchemaNamespace); virtual ~nsSchema(); NS_DECL_ISUPPORTS @@ -61,6 +62,7 @@ public: protected: nsString mTargetNamespace; + nsString mSchemaNamespace; nsSupportsArray mTypes; nsSupportsHashtable mTypesHash; nsSupportsArray mAttributes; @@ -98,7 +100,8 @@ protected: class nsSchemaBuiltinType : public nsISchemaBuiltinType { public: - nsSchemaBuiltinType(PRUint16 aBuiltinType); + nsSchemaBuiltinType(PRUint16 aBuiltinType, + const nsAReadableString& aName); virtual ~nsSchemaBuiltinType(); NS_DECL_ISUPPORTS @@ -109,6 +112,7 @@ public: protected: PRUint16 mBuiltinType; + nsString mNamespace; }; class nsSchemaListType : public nsSchemaComponentBase, diff --git a/extensions/xmlextras/schema/src/nsSchemaSimpleTypes.cpp b/extensions/xmlextras/schema/src/nsSchemaSimpleTypes.cpp index 8e25ac4662c7..f9ca346000ee 100644 --- a/extensions/xmlextras/schema/src/nsSchemaSimpleTypes.cpp +++ b/extensions/xmlextras/schema/src/nsSchemaSimpleTypes.cpp @@ -28,8 +28,9 @@ // nsSchemaBuiltinType implementation // //////////////////////////////////////////////////////////// -nsSchemaBuiltinType::nsSchemaBuiltinType(PRUint16 aBuiltinType) - : mBuiltinType(aBuiltinType) +nsSchemaBuiltinType::nsSchemaBuiltinType(PRUint16 aBuiltinType, + const nsAReadableString& aNamespace) + : mBuiltinType(aBuiltinType), mNamespace(aNamespace) { NS_INIT_ISUPPORTS(); } @@ -48,7 +49,7 @@ NS_IMPL_ISUPPORTS4_CI(nsSchemaBuiltinType, NS_IMETHODIMP nsSchemaBuiltinType::GetTargetNamespace(nsAWritableString& aTargetNamespace) { - aTargetNamespace.Assign(NS_LITERAL_STRING(NS_SCHEMA_2001_NAMESPACE)); + aTargetNamespace.Assign(mNamespace); return NS_OK; }